From 89cdf34edfb2f364e6a0a3e1549784447db9336d Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 20:55:37 +0100 Subject: [PATCH 01/20] refactor: remove all VR support Remove Skyrim VR as a supported target. All VR-specific code paths, shaders, build system options, and runtime checks are eliminated. Build system: - Remove ENABLE_SKYRIM_VR from CMakePresets.json (ALL, ALL-VS2022) - Remove SkyrimVR path from CMakeUserPresets.json.template - Remove VR shader validation matrix entry and config file (.github/configs/shader-validation-vr.yaml deleted) Deleted files: - src/Features/VR.cpp/h and entire src/Features/VR/ directory - src/Features/VRStereoOptimizations.cpp/h - src/Utils/VRUtils.cpp/h - features/VR/ (CORE marker, VR.ini) - package/Shaders/VR/ (StereoBlend, VRPostProcess, InSceneOverlay) - package/Shaders/VRStereoOptimizations/ (all shaders, cbuffers, modes) - package/Shaders/ISFullScreenVR.hlsl - package/Shaders/Tests/TestVR.hlsl, TestVRFlat.hlsl - package/Shaders/Common/VR.hlsli (no remaining callers) - features/Screen Space GI/Shaders/ScreenSpaceGI/stereoSync.cs.hlsl - features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/StereoSyncCS.hlsl Core C++ changes: - Remove VR globals, FrameBufferVR struct, IsVR() branches everywhere - Remove VR D3D hooks from Globals.cpp - Simplify FrameBufferCache getters (no eyeIndex, no VR branches) - Remove VR feature list filtering from Feature.cpp - Remove stereo optimization dispatch from Deferred.cpp - Remove VR constant buffer offsets and ISFullScreenVR from ShaderCache - Remove VR address library check from XSEPlugin.cpp - Remove GetEyePosition/GetCameraData VR overloads from Game.h/cpp - Remove VRUtils and all VR utility functions Shader changes: - FrameBuffer.hlsli: convert all cbuffer members from [1] arrays to plain variables; remove eyeIndex parameters from all helpers - Remove eyeIndex parameters from ShadowSampling.hlsli, MotionBlur.hlsli, SharedData.hlsli and all feature shaders (~30 files) - Remove all #ifdef VR / #if defined(VR) dead code blocks - Remove Stereo:: namespace calls (functions were already no-ops) Co-Authored-By: Claude Sonnet 4.5 --- .github/configs/shader-validation-vr.yaml | 23410 ---------------- .github/workflows/_shared-build.yaml | 2 - CMakePresets.json | 4 +- CMakeUserPresets.json.template | 2 +- docs/new-feature-template/NewFeature.h | 1 - docs/new-feature-template/NewFeatureReadme.md | 7 - .../DynamicCubemaps/UpdateCubemapCS.hlsl | 6 +- .../ExponentialHeightFog.hlsli | 46 +- .../VolumetricFogCSCommon.hlsli | 9 +- .../VolumetricFogConservativeDepthCS.hlsl | 10 +- .../VolumetricFogIntegrationCS.hlsl | 6 +- .../VolumetricFogLightScatteringCS.hlsl | 58 +- .../VolumetricFogMaterialCS.hlsl | 5 +- .../ExtendedMaterials/ExtendedMaterials.hlsli | 25 +- .../Hair Specular/Shaders/Hair/Hair.hlsli | 10 +- .../LightLimitFix/ClusterBuildingCS.hlsl | 9 +- .../LightLimitFix/ClusterCullingCS.hlsl | 10 +- .../Shaders/ScreenSpaceGI/blur.cs.hlsl | 26 +- .../Shaders/ScreenSpaceGI/common.hlsli | 7 +- .../Shaders/ScreenSpaceGI/gi.cs.hlsl | 28 +- .../ScreenSpaceGI/prefilterDepths.cs.hlsl | 4 - .../ScreenSpaceGI/radianceDisocc.cs.hlsl | 30 +- .../Shaders/ScreenSpaceGI/stereoSync.cs.hlsl | 122 - .../ScreenSpaceShadows/RaymarchCS.hlsl | 5 - .../ScreenSpaceShadows.hlsli | 2 +- .../ScreenSpaceShadows/StereoSyncCS.hlsl | 169 - .../ScreenSpaceShadows/bend_sss_gpu.hlsli | 40 - .../Shaders/SubsurfaceScattering/Burley.hlsli | 6 +- .../SubsurfaceScattering/SeparableSSSCS.hlsl | 3 +- .../Upscaling/DepthRefractionUpscalePS.hlsl | 28 +- .../Shaders/Upscaling/EncodeTexturesCS.hlsl | 15 +- .../Upscaling/UnderwaterMaskUpscalePS.hlsl | 92 - features/VR/CORE | 0 features/VR/Shaders/Features/VR.ini | 2 - .../VolumetricShadows/VolumetricShadows.hlsli | 14 +- .../Shaders/WaterEffects/WaterCaustics.hlsli | 4 +- .../CommunityShaders/Translations/en.json | 36 +- .../CommunityShaders/Translations/zh_CN.json | 32 - package/Shaders/Common/FrameBuffer.hlsli | 92 +- package/Shaders/Common/MotionBlur.hlsli | 6 +- package/Shaders/Common/ShadowSampling.hlsli | 12 +- package/Shaders/Common/SharedData.hlsli | 27 +- package/Shaders/Common/VR.hlsli | 668 - package/Shaders/DeferredCompositeCS.hlsl | 38 +- package/Shaders/DistantTree.hlsl | 68 +- package/Shaders/Effect.hlsl | 133 +- .../Shaders/ISApplyVolumetricLighting.hlsl | 31 +- package/Shaders/ISFullScreenVR.hlsl | 69 - package/Shaders/ISReflectionsRayTracing.hlsl | 54 +- package/Shaders/ISSAOComposite.hlsl | 17 +- package/Shaders/ISSAOMinify.hlsl | 2 +- package/Shaders/ISTemporalAA.hlsl | 4 - .../ISVolumetricLightingGenerateCS.hlsl | 33 +- package/Shaders/ISWaterBlend.hlsl | 9 +- package/Shaders/Lighting.hlsl | 219 +- package/Shaders/Particle.hlsl | 54 +- package/Shaders/RunGrass.hlsl | 138 +- package/Shaders/Sky.hlsl | 56 +- package/Shaders/Tests/TestVR.hlsl | 362 - package/Shaders/Tests/TestVRFlat.hlsl | 90 - package/Shaders/Utility.hlsl | 104 +- package/Shaders/VR/InSceneOverlay.ps.hlsl | 18 - package/Shaders/VR/InSceneOverlay.vs.hlsl | 27 - package/Shaders/VR/StereoBlendCS.hlsl | 362 - package/Shaders/VR/VRPostProcessCS.hlsl | 109 - .../VRStereoOptimizations/StencilCS.hlsl | 172 - .../VRStereoOptimizations/StencilWritePS.hlsl | 40 - .../VRStereoOptimizations/StencilWriteVS.hlsl | 24 - .../VRStereoOptimizations/cbuffers.hlsli | 31 - .../Shaders/VRStereoOptimizations/modes.hlsli | 10 - package/Shaders/Water.hlsl | 187 +- src/Deferred.cpp | 86 +- src/Deferred.h | 3 +- src/Feature.cpp | 30 +- src/Feature.h | 6 - src/FeatureConstraints.h | 2 +- src/FeatureIssues.cpp | 6 - src/FeatureIssues.h | 2 +- src/Features/CSEditor.h | 1 - src/Features/CloudShadows.h | 1 - src/Features/DynamicCubemaps.cpp | 46 +- src/Features/DynamicCubemaps.h | 18 +- src/Features/ExponentialHeightFog.cpp | 9 +- src/Features/ExponentialHeightFog.h | 1 - src/Features/ExtendedMaterials.h | 1 - src/Features/ExtendedTranslucency.h | 1 - src/Features/GrassCollision.cpp | 17 +- src/Features/GrassCollision.h | 1 - src/Features/GrassLighting.h | 1 - src/Features/HDRDisplay.cpp | 54 +- src/Features/HDRDisplay.h | 1 - src/Features/HairSpecular.h | 1 - src/Features/IBL.h | 1 - src/Features/InteriorSun.cpp | 2 +- src/Features/InteriorSun.h | 1 - src/Features/InverseSquareLighting.h | 1 - src/Features/LODBlending.h | 1 - src/Features/LightLimitFix.cpp | 36 +- src/Features/LightLimitFix.h | 5 +- src/Features/LinearLighting.cpp | 2 +- src/Features/LinearLighting.h | 1 - src/Features/PerformanceOverlay.h | 1 - src/Features/RenderDoc.h | 1 - src/Features/ScreenSpaceGI.cpp | 66 +- src/Features/ScreenSpaceGI.h | 11 +- src/Features/ScreenSpaceShadows.cpp | 143 +- src/Features/ScreenSpaceShadows.h | 22 +- src/Features/ScreenshotFeature.cpp | 42 +- src/Features/ScreenshotFeature.h | 3 +- src/Features/Skin.h | 1 - src/Features/SkySync.h | 1 - src/Features/Skylighting.cpp | 27 +- src/Features/Skylighting.h | 7 - src/Features/SubsurfaceScattering.cpp | 2 +- src/Features/SubsurfaceScattering.h | 1 - src/Features/TerrainBlending.cpp | 16 +- src/Features/TerrainBlending.h | 1 - src/Features/TerrainHelper.cpp | 3 +- src/Features/TerrainHelper.h | 1 - src/Features/TerrainShadows.h | 1 - src/Features/TerrainVariation.h | 1 - src/Features/UnifiedWater.h | 1 - src/Features/Upscaling.cpp | 545 +- src/Features/Upscaling.h | 44 +- src/Features/Upscaling/DX12SwapChain.cpp | 8 +- src/Features/Upscaling/FidelityFX.cpp | 190 +- src/Features/Upscaling/Streamline.cpp | 161 +- src/Features/Upscaling/Streamline.h | 5 +- src/Features/VR.cpp | 294 - src/Features/VR.h | 558 - src/Features/VR/InSceneOverlay.cpp | 612 - src/Features/VR/Input.cpp | 383 - src/Features/VR/OpenVRDetection.cpp | 136 - src/Features/VR/OpenVRDetection.h | 48 - src/Features/VR/OverlayDrag.cpp | 405 - src/Features/VR/SettingsUI.cpp | 1139 - src/Features/VR/StereoBlend.cpp | 227 - src/Features/VR/WandPointing.cpp | 146 - src/Features/VRStereoOptimizations.cpp | 622 - src/Features/VRStereoOptimizations.h | 221 - src/Features/VolumetricLighting.cpp | 66 +- src/Features/VolumetricLighting.h | 36 - src/Features/VolumetricShadows.h | 1 - src/Features/WaterEffects.h | 1 - src/Features/WetnessEffects.h | 1 - src/FrameAnnotations.cpp | 104 +- src/Globals.cpp | 122 +- src/Globals.h | 106 +- src/Hooks.cpp | 37 +- src/Menu.cpp | 31 +- src/Menu.h | 4 +- src/Menu/HomePageRenderer.cpp | 5 - src/Menu/OverlayRenderer.cpp | 17 - src/Menu/OverlayRenderer.h | 5 +- src/Menu/SettingsTabRenderer.cpp | 1 - src/Menu/ThemeManager.cpp | 9 +- src/ShaderCache.cpp | 79 +- src/ShaderCache.h | 75 +- src/State.cpp | 27 +- src/State.h | 2 +- src/TruePBR.cpp | 2 +- src/TruePBR.h | 1 - src/Utils/D3D.cpp | 2 - src/Utils/D3D.h | 5 +- src/Utils/Game.cpp | 25 +- src/Utils/Game.h | 26 +- src/Utils/GameSetting.h | 4 +- src/Utils/Input.h | 97 +- src/Utils/UI.cpp | 58 - src/Utils/UI.h | 6 +- src/Utils/VRUtils.cpp | 241 - src/Utils/VRUtils.h | 248 - src/XSEPlugin.cpp | 15 +- 173 files changed, 741 insertions(+), 34703 deletions(-) delete mode 100644 .github/configs/shader-validation-vr.yaml delete mode 100644 features/Screen Space GI/Shaders/ScreenSpaceGI/stereoSync.cs.hlsl delete mode 100644 features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/StereoSyncCS.hlsl delete mode 100644 features/VR/CORE delete mode 100644 features/VR/Shaders/Features/VR.ini delete mode 100644 package/Shaders/Common/VR.hlsli delete mode 100644 package/Shaders/ISFullScreenVR.hlsl delete mode 100644 package/Shaders/Tests/TestVR.hlsl delete mode 100644 package/Shaders/Tests/TestVRFlat.hlsl delete mode 100644 package/Shaders/VR/InSceneOverlay.ps.hlsl delete mode 100644 package/Shaders/VR/InSceneOverlay.vs.hlsl delete mode 100644 package/Shaders/VR/StereoBlendCS.hlsl delete mode 100644 package/Shaders/VR/VRPostProcessCS.hlsl delete mode 100644 package/Shaders/VRStereoOptimizations/StencilCS.hlsl delete mode 100644 package/Shaders/VRStereoOptimizations/StencilWritePS.hlsl delete mode 100644 package/Shaders/VRStereoOptimizations/StencilWriteVS.hlsl delete mode 100644 package/Shaders/VRStereoOptimizations/cbuffers.hlsli delete mode 100644 package/Shaders/VRStereoOptimizations/modes.hlsli delete mode 100644 src/Features/VR.cpp delete mode 100644 src/Features/VR.h delete mode 100644 src/Features/VR/InSceneOverlay.cpp delete mode 100644 src/Features/VR/Input.cpp delete mode 100644 src/Features/VR/OpenVRDetection.cpp delete mode 100644 src/Features/VR/OpenVRDetection.h delete mode 100644 src/Features/VR/OverlayDrag.cpp delete mode 100644 src/Features/VR/SettingsUI.cpp delete mode 100644 src/Features/VR/StereoBlend.cpp delete mode 100644 src/Features/VR/WandPointing.cpp delete mode 100644 src/Features/VRStereoOptimizations.cpp delete mode 100644 src/Features/VRStereoOptimizations.h delete mode 100644 src/Utils/VRUtils.cpp delete mode 100644 src/Utils/VRUtils.h diff --git a/.github/configs/shader-validation-vr.yaml b/.github/configs/shader-validation-vr.yaml deleted file mode 100644 index 8120904431..0000000000 --- a/.github/configs/shader-validation-vr.yaml +++ /dev/null @@ -1,23410 +0,0 @@ -common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION -common_pshader_defines: - - PSHADER -common_vshader_defines: - - VSHADER -common_cshader_defines: [] -file_common_defines: - BloodSplatter.hlsl: - PSHADER: - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - VSHADER: - - WETNESS_EFFECTS - - WATER_EFFECTS - - IBL - - SKYLIGHTING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - FLARE - - ISL - - LOD_BLENDING - CSHADER: [] - DistantTree.hlsl: - PSHADER: - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SSGI - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - VSHADER: - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SSGI - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - CSHADER: [] - RunGrass.hlsl: - PSHADER: - - WETNESS_EFFECTS - - GRASS_COLLISION - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - DO_ALPHA_TEST - - ISL - - GRASS_LIGHTING - - LOD_BLENDING - VSHADER: - - WETNESS_EFFECTS - - GRASS_COLLISION - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - DO_ALPHA_TEST - - ISL - - GRASS_LIGHTING - - LOD_BLENDING - CSHADER: [] - Particle.hlsl: - PSHADER: - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - VSHADER: - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - IBL - - SKYLIGHTING - - ISL - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - CSHADER: [] - Sky.hlsl: - PSHADER: - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - VSHADER: - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - IBL - - SKYLIGHTING - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - CSHADER: [] - Effect.hlsl: - PSHADER: - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - VSHADER: - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - IBL - - SKYLIGHTING - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - CSHADER: [] - Lighting.hlsl: - PSHADER: - - TERRAIN_VARIATION - - WETNESS_EFFECTS - - SHADOWSPLITCOUNT=3 - - SCREEN_SPACE_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - CS_HAIR - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - EXTENDED_MATERIALS - - LIGHT_LIMIT_FIX - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - ISL - - LOD_BLENDING - - EXTENDED_TRANSLUCENCY - - VC - VSHADER: - - TERRAIN_VARIATION - - WETNESS_EFFECTS - - SHADOWSPLITCOUNT=3 - - SCREEN_SPACE_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - CS_HAIR - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - EXTENDED_MATERIALS - - LIGHT_LIMIT_FIX - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - ISL - - LOD_BLENDING - - EXTENDED_TRANSLUCENCY - CSHADER: [] - Water.hlsl: - PSHADER: - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - FOG - - SSS - - WATER_EFFECTS - - IBL - - SKYLIGHTING - - ISL - - WATER - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - VSHADER: - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - FOG - - SSS - - WATER_EFFECTS - - IBL - - SKYLIGHTING - - ISL - - WATER - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - CSHADER: [] - Utility.hlsl: - PSHADER: - - SHADOWSPLITCOUNT=3 - VSHADER: - - SHADOWSPLITCOUNT=3 - CSHADER: [] -warnings: - x4000:use of potentially uninitialized variable (grasscollision::getdisplacedposition): - code: X4000 - message: use of potentially uninitialized variable (GrassCollision::GetDisplacedPosition) - instances: - grasscollision/grasscollision.hlsli:52,3: - entries: - - Grass:Vertex:10000 - x4000:use of potentially uninitialized variable (terrainshadows::getterrainshadow): - code: X4000 - message: use of potentially uninitialized variable (TerrainShadows::GetTerrainShadow) - instances: - terrainshadows/terrainshadows.hlsli:27,3: - entries: - - DistantTree:Pixel:100 - - DistantTree:Pixel:10100 - - DistantTree:Pixel:10000 - - Grass:Pixel:10002 - - Effect:Pixel:514C7 - - Effect:Pixel:80114C7 - - Effect:Pixel:114C7 - - Effect:Pixel:110C7 - - Effect:Pixel:80110C7 - - Effect:Pixel:510C7 - - Effect:Pixel:80510C7 - - Effect:Pixel:8010401 - - Effect:Pixel:10401 - - Water:Pixel:1 - - Effect:Pixel:10001 - - Effect:Pixel:8010001 - - Water:Pixel:4801 - - Water:Pixel:442 - - Effect:Pixel:4010442 - - Effect:Pixel:C010442 - - Effect:Pixel:C018442 - - Effect:Pixel:4050442 - - Effect:Pixel:C038442 - - Effect:Pixel:4038442 - - Effect:Pixel:4810442 - - Effect:Pixel:4818442 - - Effect:Pixel:C838442 - - Effect:Pixel:4838442 - - Effect:Pixel:C850442 - - Effect:Pixel:850442 - - Effect:Pixel:8850442 - - Effect:Pixel:838442 - - Effect:Pixel:818442 - - Effect:Pixel:8818442 - - Effect:Pixel:8810442 - - Effect:Pixel:8038442 - - Effect:Pixel:38442 - - Effect:Pixel:18442 - - Effect:Pixel:10442 - - Effect:Pixel:8018442 - - Water:Pixel:42 - - Effect:Pixel:C018042 - - Effect:Pixel:C050042 - - Effect:Pixel:4810042 - - Effect:Pixel:C810042 - - Effect:Pixel:C818042 - - Effect:Pixel:C838042 - - Effect:Pixel:4838042 - - Effect:Pixel:4850042 - - Effect:Pixel:C850042 - - Effect:Pixel:4010042 - - Effect:Pixel:850042 - - Effect:Pixel:C010042 - - Effect:Pixel:838042 - - Effect:Pixel:8838042 - - Effect:Pixel:810042 - - Effect:Pixel:818042 - - Effect:Pixel:8818042 - - Effect:Pixel:8810042 - - Effect:Pixel:50042 - - Effect:Pixel:8050042 - - Effect:Pixel:8038042 - - Effect:Pixel:38042 - - Effect:Pixel:18042 - - Effect:Pixel:10042 - - Effect:Pixel:8018042 - - Water:Pixel:9 - - Water:Pixel:83 - - Effect:Pixel:4010443 - - Effect:Pixel:C018443 - - Effect:Pixel:C050443 - - Effect:Pixel:4038443 - - Effect:Pixel:C038443 - - Effect:Pixel:4810443 - - Effect:Pixel:C810443 - - Effect:Pixel:C818443 - - Effect:Pixel:4818443 - - Effect:Pixel:C838443 - - Effect:Pixel:4850443 - - Effect:Pixel:850443 - - Effect:Pixel:8850443 - - Effect:Pixel:8838443 - - Effect:Pixel:810443 - - Effect:Pixel:818443 - - Effect:Pixel:8050443 - - Effect:Pixel:8818443 - - Effect:Pixel:8810443 - - Effect:Pixel:38443 - - Effect:Pixel:18443 - - Effect:Pixel:8018443 - - Effect:Pixel:8010443 - - Effect:Pixel:10443 - - Effect:Pixel:8051443 - - Water:Pixel:43 - - Effect:Pixel:11443 - - Effect:Pixel:8011443 - - Effect:Pixel:4018043 - - Effect:Pixel:C050043 - - Effect:Pixel:C810043 - - Effect:Pixel:4810043 - - Effect:Pixel:4818043 - - Effect:Pixel:4838043 - - Effect:Pixel:C838043 - - Effect:Pixel:4850043 - - Effect:Pixel:C850043 - - Effect:Pixel:4010043 - - Effect:Pixel:C010043 - - Effect:Pixel:8838043 - - Effect:Pixel:818043 - - Effect:Pixel:8818043 - - Effect:Pixel:8810043 - - Effect:Pixel:810043 - - Effect:Pixel:50043 - - Effect:Pixel:8050043 - - Effect:Pixel:38043 - - Effect:Pixel:8038043 - - Effect:Pixel:18043 - - Effect:Pixel:8018043 - - Effect:Pixel:10043 - - Effect:Pixel:8051043 - - Effect:Pixel:8011043 - - Effect:Pixel:C01804A - - Effect:Pixel:401804A - - Effect:Pixel:C81804A - - Effect:Pixel:483804A - - Effect:Pixel:403804A - - Effect:Pixel:C83804A - - Effect:Pixel:C03804A - - Water:Pixel:4A - - Effect:Pixel:883804A - - Effect:Pixel:83804A - - Effect:Pixel:81804A - - Effect:Pixel:881804A - - Effect:Pixel:803804A - - Effect:Pixel:801804A - - Effect:Pixel:401844A - - Effect:Pixel:C03844A - - Effect:Pixel:481844A - - Effect:Pixel:C81844A - - Effect:Pixel:C83844A - - Water:Pixel:44A - - Effect:Pixel:883844A - - Effect:Pixel:803844A - - Effect:Pixel:881844A - - Effect:Pixel:81844A - - Effect:Pixel:1844A - - Effect:Pixel:801844A - - Effect:Pixel:C01804B - - Effect:Pixel:401804B - - Effect:Pixel:481804B - - Water:Pixel:4B - - Effect:Pixel:483804B - - Effect:Pixel:403804B - - Effect:Pixel:C83804B - - Effect:Pixel:C03804B - - Effect:Pixel:883804B - - Effect:Pixel:3804B - - Effect:Pixel:803804B - - Effect:Pixel:881804B - - Effect:Pixel:1804B - - Effect:Pixel:801804B - - Effect:Pixel:C01844B - - Effect:Pixel:401844B - - Effect:Pixel:483844B - - Effect:Pixel:481844B - - Effect:Pixel:C03844B - - Effect:Pixel:C83844B - - Effect:Pixel:83844B - - Effect:Pixel:3844B - - Effect:Pixel:883844B - - Effect:Pixel:803844B - - Effect:Pixel:801844B - - Effect:Pixel:1844B - - Effect:Pixel:4010072 - - Effect:Pixel:C010072 - - Effect:Pixel:881844B - - Effect:Pixel:C050072 - - Effect:Pixel:C018072 - - Effect:Pixel:4018072 - - Effect:Pixel:C810072 - - Effect:Pixel:4818072 - - Effect:Pixel:4810072 - - Effect:Pixel:4838072 - - Effect:Pixel:C850072 - - Effect:Pixel:C038072 - - Effect:Pixel:4038072 - - Effect:Pixel:850072 - - Effect:Pixel:8850072 - - Effect:Pixel:8838072 - - Effect:Pixel:810072 - - Effect:Pixel:8818072 - - Effect:Pixel:818072 - - Effect:Pixel:8810072 - - Effect:Pixel:50072 - - Effect:Pixel:38072 - - Effect:Pixel:8038072 - - Effect:Pixel:8010072 - - Effect:Pixel:8018072 - - Effect:Pixel:4010472 - - Effect:Pixel:C018472 - - Effect:Pixel:C010472 - - Effect:Pixel:C050472 - - Effect:Pixel:4050472 - - Effect:Pixel:C038472 - - Effect:Pixel:4038472 - - Effect:Pixel:4810472 - - Effect:Pixel:C810472 - - Effect:Pixel:4818472 - - Effect:Pixel:4838472 - - Effect:Pixel:C818472 - - Effect:Pixel:C850472 - - Effect:Pixel:850472 - - Effect:Pixel:810472 - - Effect:Pixel:818472 - - Effect:Pixel:8810472 - - Effect:Pixel:8838472 - - Effect:Pixel:838472 - - Effect:Pixel:8818472 - - Effect:Pixel:50472 - - Effect:Pixel:38472 - - Effect:Pixel:8038472 - - Effect:Pixel:8018472 - - Effect:Pixel:10472 - - Effect:Pixel:18472 - - Effect:Pixel:8010472 - - Effect:Pixel:4018073 - - Effect:Pixel:4010073 - - Effect:Pixel:C050073 - - Effect:Pixel:4050073 - - Effect:Pixel:C810073 - - Effect:Pixel:C818073 - - Effect:Pixel:4838073 - - Effect:Pixel:4818073 - - Effect:Pixel:C838073 - - Effect:Pixel:4850073 - - Effect:Pixel:4038073 - - Effect:Pixel:C038073 - - Effect:Pixel:850073 - - Effect:Pixel:8838073 - - Effect:Pixel:810073 - - Effect:Pixel:8818073 - - Effect:Pixel:8810073 - - Effect:Pixel:50073 - - Effect:Pixel:8050073 - - Effect:Pixel:38073 - - Effect:Pixel:8038073 - - Effect:Pixel:10073 - - Effect:Pixel:8018073 - - Effect:Pixel:18073 - - Effect:Pixel:4010473 - - Effect:Pixel:C018473 - - Effect:Pixel:4018473 - - Effect:Pixel:C038473 - - Effect:Pixel:4038473 - - Effect:Pixel:4050473 - - Effect:Pixel:C810473 - - Effect:Pixel:4810473 - - Effect:Pixel:C818473 - - Effect:Pixel:C838473 - - Effect:Pixel:4838473 - - Effect:Pixel:4850473 - - Effect:Pixel:C850473 - - Effect:Pixel:850473 - - Effect:Pixel:8838473 - - Effect:Pixel:838473 - - Effect:Pixel:810473 - - Effect:Pixel:818473 - - Effect:Pixel:8818473 - - Effect:Pixel:8810473 - - Effect:Pixel:50473 - - Effect:Pixel:8050473 - - Effect:Pixel:10473 - - Effect:Pixel:8018473 - - Effect:Pixel:8010473 - - Effect:Pixel:401807A - - Effect:Pixel:C01807A - - Effect:Pixel:481807A - - Effect:Pixel:C81807A - - Effect:Pixel:483807A - - Effect:Pixel:403807A - - Effect:Pixel:C03807A - - Effect:Pixel:83807A - - Effect:Pixel:883807A - - Effect:Pixel:81807A - - Effect:Pixel:881807A - - Effect:Pixel:3807A - - Effect:Pixel:803807A - - Effect:Pixel:C01847A - - Effect:Pixel:C03847A - - Effect:Pixel:481847A - - Effect:Pixel:C81847A - - Effect:Pixel:483847A - - Effect:Pixel:3847A - - Effect:Pixel:881847A - - Effect:Pixel:803847A - - Effect:Pixel:1847A - - Effect:Pixel:801847A - - Effect:Pixel:883847A - - Effect:Pixel:83847A - - Effect:Pixel:401807B - - Effect:Pixel:C81807B - - Effect:Pixel:C01807B - - Effect:Pixel:C83807B - - Effect:Pixel:403807B - - Effect:Pixel:883807B - - Effect:Pixel:83807B - - Effect:Pixel:81807B - - Effect:Pixel:881807B - - Effect:Pixel:3807B - - Effect:Pixel:803807B - - Effect:Pixel:801807B - - Effect:Pixel:401847B - - Effect:Pixel:C01847B - - Effect:Pixel:C03847B - - Effect:Pixel:481847B - - Effect:Pixel:483847B - - Effect:Pixel:C83847B - - Effect:Pixel:881847B - - Effect:Pixel:81847B - - Effect:Pixel:3847B - - Effect:Pixel:803847B - - Effect:Pixel:1847B - - Effect:Pixel:801847B - - Effect:Pixel:83847B - - Effect:Pixel:883847B - - Effect:Pixel:8010553 - - Effect:Pixel:10553 - - Effect:Pixel:50553 - - Effect:Pixel:8050553 - - Effect:Pixel:8010153 - - Effect:Pixel:50153 - - Effect:Pixel:8050153 - - Effect:Pixel:521D7 - - Effect:Pixel:80521D7 - - Effect:Pixel:121D7 - - Water:Pixel:19 - - Water:Pixel:1B - - Water:Pixel:0 - - Water:Pixel:4803 - - Water:Pixel:5803 - - Water:Pixel:3 - - Water:Pixel:11 - - Water:Pixel:211 - - Water:Pixel:203 - - Water:Pixel:213 - - Water:Pixel:411 - - Water:Pixel:413 - - Water:Pixel:601 - - Water:Pixel:611 - - Water:Pixel:603 - - Water:Pixel:613 - - Water:Pixel:401 - - Water:Pixel:202 - - Water:Pixel:82 - - Water:Pixel:1A - - Water:Pixel:9A - - Water:Pixel:9B - - Water:Pixel:283 - - Water:Pixel:683 - - Water:Pixel:21B - - Water:Pixel:21A - - Water:Pixel:282 - - Water:Pixel:61B - - Water:Pixel:61A - - Water:Pixel:12 - - Water:Pixel:29A - - Water:Pixel:69A - - Water:Pixel:8 - - Water:Pixel:A - - Water:Pixel:40 - - Water:Pixel:18 - - Water:Pixel:51 - - Water:Pixel:50 - - Water:Pixel:52 - - Water:Pixel:80 - - Water:Pixel:49 - - Water:Pixel:59 - - Water:Pixel:5B - - Water:Pixel:58 - - Water:Pixel:90 - - Water:Pixel:91 - - Water:Pixel:5A - - Water:Pixel:88 - - Water:Pixel:92 - - Water:Pixel:93 - - Water:Pixel:8A - - Water:Pixel:C0 - - Water:Pixel:C2 - - Water:Pixel:C3 - - Water:Pixel:99 - - Water:Pixel:98 - - Water:Pixel:D0 - - Water:Pixel:D1 - - Water:Pixel:D3 - - Water:Pixel:CB - - Water:Pixel:CA - - Water:Pixel:200 - - Water:Pixel:D9 - - Water:Pixel:D8 - - Water:Pixel:DB - - Water:Pixel:DA - - Water:Pixel:209 - - Water:Pixel:210 - - Water:Pixel:20A - - Water:Pixel:241 - - Water:Pixel:243 - - Water:Pixel:20B - - Water:Pixel:218 - - Water:Pixel:248 - - Water:Pixel:249 - - Water:Pixel:250 - - Water:Pixel:251 - - Water:Pixel:24A - - Water:Pixel:24B - - Water:Pixel:252 - - Water:Pixel:280 - - Water:Pixel:259 - - Water:Pixel:25B - - Water:Pixel:258 - - Water:Pixel:289 - - Water:Pixel:291 - - Water:Pixel:293 - - Water:Pixel:292 - - Water:Pixel:28B - - Water:Pixel:28A - - Water:Pixel:2C0 - - Water:Pixel:2C2 - - Water:Pixel:2C3 - - Water:Pixel:299 - - Water:Pixel:298 - - Water:Pixel:2D1 - - Water:Pixel:2D0 - - Water:Pixel:400 - - Water:Pixel:2C9 - - Water:Pixel:402 - - Water:Pixel:2CB - - Water:Pixel:2CA - - Water:Pixel:2D9 - - Water:Pixel:2D8 - - Water:Pixel:2DB - - Water:Pixel:2DA - - Water:Pixel:410 - - Water:Pixel:409 - - Water:Pixel:408 - - Water:Pixel:40A - - Water:Pixel:441 - - Water:Pixel:440 - - Water:Pixel:451 - - Water:Pixel:419 - - Water:Pixel:418 - - Water:Pixel:453 - - Water:Pixel:452 - - Water:Pixel:41A - - Water:Pixel:41B - - Water:Pixel:481 - - Water:Pixel:480 - - Water:Pixel:482 - - Water:Pixel:483 - - Water:Pixel:459 - - Water:Pixel:458 - - Water:Pixel:45B - - Water:Pixel:45A - - Water:Pixel:491 - - Water:Pixel:493 - - Water:Pixel:492 - - Water:Pixel:488 - - Water:Pixel:48B - - Water:Pixel:4C0 - - Water:Pixel:4C1 - - Water:Pixel:4C3 - - Water:Pixel:4C2 - - Water:Pixel:499 - - Water:Pixel:498 - - Water:Pixel:49B - - Water:Pixel:4D0 - - Water:Pixel:4D2 - - Water:Pixel:4C9 - - Water:Pixel:4D3 - - Water:Pixel:4C8 - - Water:Pixel:4CA - - Water:Pixel:600 - - Water:Pixel:4DB - - Water:Pixel:4D8 - - Water:Pixel:4DA - - Water:Pixel:609 - - Water:Pixel:610 - - Water:Pixel:60A - - Water:Pixel:640 - - Water:Pixel:641 - - Water:Pixel:643 - - Water:Pixel:619 - - Water:Pixel:618 - - Water:Pixel:648 - - Water:Pixel:651 - - Water:Pixel:653 - - Water:Pixel:64A - - Water:Pixel:652 - - Water:Pixel:64B - - Water:Pixel:681 - - Water:Pixel:680 - - Water:Pixel:682 - - Water:Pixel:658 - - Water:Pixel:65B - - Water:Pixel:65A - - Water:Pixel:689 - - Water:Pixel:690 - - Water:Pixel:692 - - Water:Pixel:6C0 - - Water:Pixel:6C1 - - Water:Pixel:68B - - Water:Pixel:6C3 - - Water:Pixel:6C2 - - Water:Pixel:699 - - Water:Pixel:698 - - Water:Pixel:4800 - - Water:Pixel:6D1 - - Water:Pixel:6D0 - - Water:Pixel:6C8 - - Water:Pixel:6D3 - - Water:Pixel:6D2 - - Water:Pixel:6C9 - - Water:Pixel:6CB - - Water:Pixel:4802 - - Water:Pixel:6D9 - - Water:Pixel:6DA - x4000:use of potentially uninitialized variable (shadowsampling::geteffectshadow): - code: X4000 - message: use of potentially uninitialized variable (ShadowSampling::GetEffectShadow) - instances: - common/shadowsampling.hlsli:172,3: - entries: - - Effect:Pixel:514C7 - - Effect:Pixel:80114C7 - - Effect:Pixel:114C7 - - Effect:Pixel:110C7 - - Effect:Pixel:80110C7 - - Effect:Pixel:510C7 - - Effect:Pixel:80510C7 - - Effect:Pixel:8010401 - - Effect:Pixel:10401 - - Effect:Pixel:10001 - - Effect:Pixel:8010001 - - Effect:Pixel:4010442 - - Effect:Pixel:C010442 - - Effect:Pixel:C018442 - - Effect:Pixel:4050442 - - Effect:Pixel:C038442 - - Effect:Pixel:4038442 - - Effect:Pixel:4810442 - - Effect:Pixel:4818442 - - Effect:Pixel:C838442 - - Effect:Pixel:4838442 - - Effect:Pixel:C850442 - - Effect:Pixel:850442 - - Effect:Pixel:8850442 - - Effect:Pixel:838442 - - Effect:Pixel:818442 - - Effect:Pixel:8818442 - - Effect:Pixel:8810442 - - Effect:Pixel:8038442 - - Effect:Pixel:38442 - - Effect:Pixel:18442 - - Effect:Pixel:10442 - - Effect:Pixel:8018442 - - Effect:Pixel:C018042 - - Effect:Pixel:C050042 - - Effect:Pixel:4810042 - - Effect:Pixel:C810042 - - Effect:Pixel:C818042 - - Effect:Pixel:C838042 - - Effect:Pixel:4838042 - - Effect:Pixel:4850042 - - Effect:Pixel:C850042 - - Effect:Pixel:4010042 - - Effect:Pixel:850042 - - Effect:Pixel:C010042 - - Effect:Pixel:838042 - - Effect:Pixel:8838042 - - Effect:Pixel:810042 - - Effect:Pixel:818042 - - Effect:Pixel:8818042 - - Effect:Pixel:8810042 - - Effect:Pixel:50042 - - Effect:Pixel:8050042 - - Effect:Pixel:8038042 - - Effect:Pixel:38042 - - Effect:Pixel:18042 - - Effect:Pixel:10042 - - Effect:Pixel:8018042 - - Effect:Pixel:4010443 - - Effect:Pixel:C018443 - - Effect:Pixel:C050443 - - Effect:Pixel:4038443 - - Effect:Pixel:C038443 - - Effect:Pixel:4810443 - - Effect:Pixel:C810443 - - Effect:Pixel:C818443 - - Effect:Pixel:4818443 - - Effect:Pixel:C838443 - - Effect:Pixel:4850443 - - Effect:Pixel:850443 - - Effect:Pixel:8850443 - - Effect:Pixel:8838443 - - Effect:Pixel:810443 - - Effect:Pixel:818443 - - Effect:Pixel:8050443 - - Effect:Pixel:8818443 - - Effect:Pixel:8810443 - - Effect:Pixel:38443 - - Effect:Pixel:18443 - - Effect:Pixel:8018443 - - Effect:Pixel:8010443 - - Effect:Pixel:10443 - - Effect:Pixel:8051443 - - Effect:Pixel:11443 - - Effect:Pixel:8011443 - - Effect:Pixel:4018043 - - Effect:Pixel:C050043 - - Effect:Pixel:C810043 - - Effect:Pixel:4810043 - - Effect:Pixel:4818043 - - Effect:Pixel:4838043 - - Effect:Pixel:C838043 - - Effect:Pixel:4850043 - - Effect:Pixel:C850043 - - Effect:Pixel:4010043 - - Effect:Pixel:C010043 - - Effect:Pixel:8838043 - - Effect:Pixel:818043 - - Effect:Pixel:8818043 - - Effect:Pixel:8810043 - - Effect:Pixel:810043 - - Effect:Pixel:50043 - - Effect:Pixel:8050043 - - Effect:Pixel:38043 - - Effect:Pixel:8038043 - - Effect:Pixel:18043 - - Effect:Pixel:8018043 - - Effect:Pixel:10043 - - Effect:Pixel:8051043 - - Effect:Pixel:8011043 - - Effect:Pixel:C01804A - - Effect:Pixel:401804A - - Effect:Pixel:C81804A - - Effect:Pixel:483804A - - Effect:Pixel:403804A - - Effect:Pixel:C83804A - - Effect:Pixel:C03804A - - Effect:Pixel:883804A - - Effect:Pixel:83804A - - Effect:Pixel:81804A - - Effect:Pixel:881804A - - Effect:Pixel:803804A - - Effect:Pixel:801804A - - Effect:Pixel:401844A - - Effect:Pixel:C03844A - - Effect:Pixel:481844A - - Effect:Pixel:C81844A - - Effect:Pixel:C83844A - - Effect:Pixel:883844A - - Effect:Pixel:803844A - - Effect:Pixel:881844A - - Effect:Pixel:81844A - - Effect:Pixel:1844A - - Effect:Pixel:801844A - - Effect:Pixel:C01804B - - Effect:Pixel:401804B - - Effect:Pixel:481804B - - Effect:Pixel:483804B - - Effect:Pixel:403804B - - Effect:Pixel:C83804B - - Effect:Pixel:C03804B - - Effect:Pixel:883804B - - Effect:Pixel:3804B - - Effect:Pixel:803804B - - Effect:Pixel:881804B - - Effect:Pixel:1804B - - Effect:Pixel:801804B - - Effect:Pixel:C01844B - - Effect:Pixel:401844B - - Effect:Pixel:483844B - - Effect:Pixel:481844B - - Effect:Pixel:C03844B - - Effect:Pixel:C83844B - - Effect:Pixel:83844B - - Effect:Pixel:3844B - - Effect:Pixel:883844B - - Effect:Pixel:803844B - - Effect:Pixel:801844B - - Effect:Pixel:1844B - - Effect:Pixel:4010072 - - Effect:Pixel:C010072 - - Effect:Pixel:881844B - - Effect:Pixel:C050072 - - Effect:Pixel:C018072 - - Effect:Pixel:4018072 - - Effect:Pixel:C810072 - - Effect:Pixel:4818072 - - Effect:Pixel:4810072 - - Effect:Pixel:4838072 - - Effect:Pixel:C850072 - - Effect:Pixel:C038072 - - Effect:Pixel:4038072 - - Effect:Pixel:850072 - - Effect:Pixel:8850072 - - Effect:Pixel:8838072 - - Effect:Pixel:810072 - - Effect:Pixel:8818072 - - Effect:Pixel:818072 - - Effect:Pixel:8810072 - - Effect:Pixel:50072 - - Effect:Pixel:38072 - - Effect:Pixel:8038072 - - Effect:Pixel:8010072 - - Effect:Pixel:8018072 - - Effect:Pixel:4010472 - - Effect:Pixel:C018472 - - Effect:Pixel:C010472 - - Effect:Pixel:C050472 - - Effect:Pixel:4050472 - - Effect:Pixel:C038472 - - Effect:Pixel:4038472 - - Effect:Pixel:4810472 - - Effect:Pixel:C810472 - - Effect:Pixel:4818472 - - Effect:Pixel:4838472 - - Effect:Pixel:C818472 - - Effect:Pixel:C850472 - - Effect:Pixel:850472 - - Effect:Pixel:810472 - - Effect:Pixel:818472 - - Effect:Pixel:8810472 - - Effect:Pixel:8838472 - - Effect:Pixel:838472 - - Effect:Pixel:8818472 - - Effect:Pixel:50472 - - Effect:Pixel:38472 - - Effect:Pixel:8038472 - - Effect:Pixel:8018472 - - Effect:Pixel:10472 - - Effect:Pixel:18472 - - Effect:Pixel:8010472 - - Effect:Pixel:4018073 - - Effect:Pixel:4010073 - - Effect:Pixel:C050073 - - Effect:Pixel:4050073 - - Effect:Pixel:C810073 - - Effect:Pixel:C818073 - - Effect:Pixel:4838073 - - Effect:Pixel:4818073 - - Effect:Pixel:C838073 - - Effect:Pixel:4850073 - - Effect:Pixel:4038073 - - Effect:Pixel:C038073 - - Effect:Pixel:850073 - - Effect:Pixel:8838073 - - Effect:Pixel:810073 - - Effect:Pixel:8818073 - - Effect:Pixel:8810073 - - Effect:Pixel:50073 - - Effect:Pixel:8050073 - - Effect:Pixel:38073 - - Effect:Pixel:8038073 - - Effect:Pixel:10073 - - Effect:Pixel:8018073 - - Effect:Pixel:18073 - - Effect:Pixel:4010473 - - Effect:Pixel:C018473 - - Effect:Pixel:4018473 - - Effect:Pixel:C038473 - - Effect:Pixel:4038473 - - Effect:Pixel:4050473 - - Effect:Pixel:C810473 - - Effect:Pixel:4810473 - - Effect:Pixel:C818473 - - Effect:Pixel:C838473 - - Effect:Pixel:4838473 - - Effect:Pixel:4850473 - - Effect:Pixel:C850473 - - Effect:Pixel:850473 - - Effect:Pixel:8838473 - - Effect:Pixel:838473 - - Effect:Pixel:810473 - - Effect:Pixel:818473 - - Effect:Pixel:8818473 - - Effect:Pixel:8810473 - - Effect:Pixel:50473 - - Effect:Pixel:8050473 - - Effect:Pixel:10473 - - Effect:Pixel:8018473 - - Effect:Pixel:8010473 - - Effect:Pixel:401807A - - Effect:Pixel:C01807A - - Effect:Pixel:481807A - - Effect:Pixel:C81807A - - Effect:Pixel:483807A - - Effect:Pixel:403807A - - Effect:Pixel:C03807A - - Effect:Pixel:83807A - - Effect:Pixel:883807A - - Effect:Pixel:81807A - - Effect:Pixel:881807A - - Effect:Pixel:3807A - - Effect:Pixel:803807A - - Effect:Pixel:C01847A - - Effect:Pixel:C03847A - - Effect:Pixel:481847A - - Effect:Pixel:C81847A - - Effect:Pixel:483847A - - Effect:Pixel:3847A - - Effect:Pixel:881847A - - Effect:Pixel:803847A - - Effect:Pixel:1847A - - Effect:Pixel:801847A - - Effect:Pixel:883847A - - Effect:Pixel:83847A - - Effect:Pixel:401807B - - Effect:Pixel:C81807B - - Effect:Pixel:C01807B - - Effect:Pixel:C83807B - - Effect:Pixel:403807B - - Effect:Pixel:883807B - - Effect:Pixel:83807B - - Effect:Pixel:81807B - - Effect:Pixel:881807B - - Effect:Pixel:3807B - - Effect:Pixel:803807B - - Effect:Pixel:801807B - - Effect:Pixel:401847B - - Effect:Pixel:C01847B - - Effect:Pixel:C03847B - - Effect:Pixel:481847B - - Effect:Pixel:483847B - - Effect:Pixel:C83847B - - Effect:Pixel:881847B - - Effect:Pixel:81847B - - Effect:Pixel:3847B - - Effect:Pixel:803847B - - Effect:Pixel:1847B - - Effect:Pixel:801847B - - Effect:Pixel:83847B - - Effect:Pixel:883847B - - Effect:Pixel:8010553 - - Effect:Pixel:10553 - - Effect:Pixel:50553 - - Effect:Pixel:8050553 - - Effect:Pixel:8010153 - - Effect:Pixel:50153 - - Effect:Pixel:8050153 - - Effect:Pixel:521D7 - - Effect:Pixel:80521D7 - - Effect:Pixel:121D7 - x4000:use of potentially uninitialized variable (getwaterspecularcolor): - code: X4000 - message: use of potentially uninitialized variable (GetWaterSpecularColor) - instances: - water.hlsl:828,2: - entries: - - Water:Pixel:4001 - - Water:Pixel:1 - - Water:Pixel:4801 - - Water:Pixel:442 - - Water:Pixel:42 - - Water:Pixel:4002 - - Water:Pixel:4009 - - Water:Pixel:9 - - Water:Pixel:83 - - Water:Pixel:43 - - Water:Pixel:4A - - Water:Pixel:44A - - Water:Pixel:4B - - Water:Pixel:19 - - Water:Pixel:1B - - Water:Pixel:400B - - Water:Pixel:4000 - - Water:Pixel:0 - - Water:Pixel:4803 - - Water:Pixel:5803 - - Water:Pixel:4003 - - Water:Pixel:3 - - Water:Pixel:11 - - Water:Pixel:211 - - Water:Pixel:203 - - Water:Pixel:213 - - Water:Pixel:411 - - Water:Pixel:413 - - Water:Pixel:601 - - Water:Pixel:611 - - Water:Pixel:603 - - Water:Pixel:613 - - Water:Pixel:401 - - Water:Pixel:202 - - Water:Pixel:82 - - Water:Pixel:1A - - Water:Pixel:9A - - Water:Pixel:9B - - Water:Pixel:283 - - Water:Pixel:683 - - Water:Pixel:4008 - - Water:Pixel:400A - - Water:Pixel:21B - - Water:Pixel:21A - - Water:Pixel:282 - - Water:Pixel:61B - - Water:Pixel:61A - - Water:Pixel:12 - - Water:Pixel:29A - - Water:Pixel:69A - - Water:Pixel:8 - - Water:Pixel:A - - Water:Pixel:40 - - Water:Pixel:4049 - - Water:Pixel:4048 - - Water:Pixel:18 - - Water:Pixel:51 - - Water:Pixel:50 - - Water:Pixel:52 - - Water:Pixel:80 - - Water:Pixel:49 - - Water:Pixel:59 - - Water:Pixel:5B - - Water:Pixel:58 - - Water:Pixel:90 - - Water:Pixel:91 - - Water:Pixel:5A - - Water:Pixel:88 - - Water:Pixel:92 - - Water:Pixel:93 - - Water:Pixel:8A - - Water:Pixel:C0 - - Water:Pixel:C2 - - Water:Pixel:C3 - - Water:Pixel:99 - - Water:Pixel:98 - - Water:Pixel:D0 - - Water:Pixel:D1 - - Water:Pixel:D3 - - Water:Pixel:4208 - - Water:Pixel:CB - - Water:Pixel:CA - - Water:Pixel:200 - - Water:Pixel:D9 - - Water:Pixel:D8 - - Water:Pixel:DB - - Water:Pixel:DA - - Water:Pixel:420A - - Water:Pixel:420B - - Water:Pixel:209 - - Water:Pixel:210 - - Water:Pixel:20A - - Water:Pixel:241 - - Water:Pixel:4248 - - Water:Pixel:243 - - Water:Pixel:20B - - Water:Pixel:4249 - - Water:Pixel:424A - - Water:Pixel:424B - - Water:Pixel:218 - - Water:Pixel:248 - - Water:Pixel:249 - - Water:Pixel:250 - - Water:Pixel:251 - - Water:Pixel:24A - - Water:Pixel:24B - - Water:Pixel:252 - - Water:Pixel:280 - - Water:Pixel:259 - - Water:Pixel:25B - - Water:Pixel:258 - - Water:Pixel:289 - - Water:Pixel:291 - - Water:Pixel:293 - - Water:Pixel:292 - - Water:Pixel:28B - - Water:Pixel:28A - - Water:Pixel:2C0 - - Water:Pixel:2C2 - - Water:Pixel:2C3 - - Water:Pixel:299 - - Water:Pixel:298 - - Water:Pixel:2D1 - - Water:Pixel:2D0 - - Water:Pixel:400 - - Water:Pixel:2C9 - - Water:Pixel:402 - - Water:Pixel:2CB - - Water:Pixel:2CA - - Water:Pixel:2D9 - - Water:Pixel:2D8 - - Water:Pixel:2DB - - Water:Pixel:2DA - - Water:Pixel:410 - - Water:Pixel:409 - - Water:Pixel:408 - - Water:Pixel:40A - - Water:Pixel:441 - - Water:Pixel:440 - - Water:Pixel:451 - - Water:Pixel:419 - - Water:Pixel:418 - - Water:Pixel:453 - - Water:Pixel:452 - - Water:Pixel:41A - - Water:Pixel:41B - - Water:Pixel:481 - - Water:Pixel:480 - - Water:Pixel:482 - - Water:Pixel:483 - - Water:Pixel:459 - - Water:Pixel:458 - - Water:Pixel:45B - - Water:Pixel:45A - - Water:Pixel:491 - - Water:Pixel:493 - - Water:Pixel:492 - - Water:Pixel:488 - - Water:Pixel:48B - - Water:Pixel:4C0 - - Water:Pixel:4C1 - - Water:Pixel:4C3 - - Water:Pixel:4C2 - - Water:Pixel:499 - - Water:Pixel:498 - - Water:Pixel:49B - - Water:Pixel:4D0 - - Water:Pixel:4D2 - - Water:Pixel:4C9 - - Water:Pixel:4D3 - - Water:Pixel:4C8 - - Water:Pixel:4CA - - Water:Pixel:4608 - - Water:Pixel:4609 - - Water:Pixel:600 - - Water:Pixel:460A - - Water:Pixel:4DB - - Water:Pixel:4D8 - - Water:Pixel:4DA - - Water:Pixel:460B - - Water:Pixel:609 - - Water:Pixel:610 - - Water:Pixel:60A - - Water:Pixel:640 - - Water:Pixel:641 - - Water:Pixel:4648 - - Water:Pixel:643 - - Water:Pixel:4649 - - Water:Pixel:464A - - Water:Pixel:619 - - Water:Pixel:618 - - Water:Pixel:464B - - Water:Pixel:648 - - Water:Pixel:651 - - Water:Pixel:653 - - Water:Pixel:64A - - Water:Pixel:652 - - Water:Pixel:64B - - Water:Pixel:681 - - Water:Pixel:680 - - Water:Pixel:682 - - Water:Pixel:658 - - Water:Pixel:65B - - Water:Pixel:65A - - Water:Pixel:689 - - Water:Pixel:690 - - Water:Pixel:692 - - Water:Pixel:6C0 - - Water:Pixel:6C1 - - Water:Pixel:68B - - Water:Pixel:6C3 - - Water:Pixel:6C2 - - Water:Pixel:699 - - Water:Pixel:698 - - Water:Pixel:4800 - - Water:Pixel:6D1 - - Water:Pixel:6D0 - - Water:Pixel:6C8 - - Water:Pixel:6D3 - - Water:Pixel:6D2 - - Water:Pixel:6C9 - - Water:Pixel:6CB - - Water:Pixel:4802 - - Water:Pixel:6D9 - - Water:Pixel:6DA - x4000:use of potentially uninitialized variable (shadowsampling::get2dfilteredshadow): - code: X4000 - message: use of potentially uninitialized variable (ShadowSampling::Get2DFilteredShadow) - instances: - common/shadowsampling.hlsli:140,3: - entries: - - Water:Pixel:1 - - Water:Pixel:4801 - - Water:Pixel:442 - - Water:Pixel:42 - - Water:Pixel:9 - - Water:Pixel:83 - - Water:Pixel:43 - - Water:Pixel:4A - - Water:Pixel:44A - - Water:Pixel:4B - - Water:Pixel:19 - - Water:Pixel:1B - - Water:Pixel:0 - - Water:Pixel:4803 - - Water:Pixel:5803 - - Water:Pixel:3 - - Water:Pixel:11 - - Water:Pixel:211 - - Water:Pixel:203 - - Water:Pixel:213 - - Water:Pixel:411 - - Water:Pixel:413 - - Water:Pixel:601 - - Water:Pixel:611 - - Water:Pixel:603 - - Water:Pixel:613 - - Water:Pixel:401 - - Water:Pixel:202 - - Water:Pixel:82 - - Water:Pixel:1A - - Water:Pixel:9A - - Water:Pixel:9B - - Water:Pixel:283 - - Water:Pixel:683 - - Water:Pixel:21B - - Water:Pixel:21A - - Water:Pixel:282 - - Water:Pixel:61B - - Water:Pixel:61A - - Water:Pixel:12 - - Water:Pixel:29A - - Water:Pixel:69A - - Water:Pixel:8 - - Water:Pixel:A - - Water:Pixel:40 - - Water:Pixel:18 - - Water:Pixel:51 - - Water:Pixel:50 - - Water:Pixel:52 - - Water:Pixel:80 - - Water:Pixel:49 - - Water:Pixel:59 - - Water:Pixel:5B - - Water:Pixel:58 - - Water:Pixel:90 - - Water:Pixel:91 - - Water:Pixel:5A - - Water:Pixel:88 - - Water:Pixel:92 - - Water:Pixel:93 - - Water:Pixel:8A - - Water:Pixel:C0 - - Water:Pixel:C2 - - Water:Pixel:C3 - - Water:Pixel:99 - - Water:Pixel:98 - - Water:Pixel:D0 - - Water:Pixel:D1 - - Water:Pixel:D3 - - Water:Pixel:CB - - Water:Pixel:CA - - Water:Pixel:200 - - Water:Pixel:D9 - - Water:Pixel:D8 - - Water:Pixel:DB - - Water:Pixel:DA - - Water:Pixel:209 - - Water:Pixel:210 - - Water:Pixel:20A - - Water:Pixel:241 - - Water:Pixel:243 - - Water:Pixel:20B - - Water:Pixel:218 - - Water:Pixel:248 - - Water:Pixel:249 - - Water:Pixel:250 - - Water:Pixel:251 - - Water:Pixel:24A - - Water:Pixel:24B - - Water:Pixel:252 - - Water:Pixel:280 - - Water:Pixel:259 - - Water:Pixel:25B - - Water:Pixel:258 - - Water:Pixel:289 - - Water:Pixel:291 - - Water:Pixel:293 - - Water:Pixel:292 - - Water:Pixel:28B - - Water:Pixel:28A - - Water:Pixel:2C0 - - Water:Pixel:2C2 - - Water:Pixel:2C3 - - Water:Pixel:299 - - Water:Pixel:298 - - Water:Pixel:2D1 - - Water:Pixel:2D0 - - Water:Pixel:400 - - Water:Pixel:2C9 - - Water:Pixel:402 - - Water:Pixel:2CB - - Water:Pixel:2CA - - Water:Pixel:2D9 - - Water:Pixel:2D8 - - Water:Pixel:2DB - - Water:Pixel:2DA - - Water:Pixel:410 - - Water:Pixel:409 - - Water:Pixel:408 - - Water:Pixel:40A - - Water:Pixel:441 - - Water:Pixel:440 - - Water:Pixel:451 - - Water:Pixel:419 - - Water:Pixel:418 - - Water:Pixel:453 - - Water:Pixel:452 - - Water:Pixel:41A - - Water:Pixel:41B - - Water:Pixel:481 - - Water:Pixel:480 - - Water:Pixel:482 - - Water:Pixel:483 - - Water:Pixel:459 - - Water:Pixel:458 - - Water:Pixel:45B - - Water:Pixel:45A - - Water:Pixel:491 - - Water:Pixel:493 - - Water:Pixel:492 - - Water:Pixel:488 - - Water:Pixel:48B - - Water:Pixel:4C0 - - Water:Pixel:4C1 - - Water:Pixel:4C3 - - Water:Pixel:4C2 - - Water:Pixel:499 - - Water:Pixel:498 - - Water:Pixel:49B - - Water:Pixel:4D0 - - Water:Pixel:4D2 - - Water:Pixel:4C9 - - Water:Pixel:4D3 - - Water:Pixel:4C8 - - Water:Pixel:4CA - - Water:Pixel:600 - - Water:Pixel:4DB - - Water:Pixel:4D8 - - Water:Pixel:4DA - - Water:Pixel:609 - - Water:Pixel:610 - - Water:Pixel:60A - - Water:Pixel:640 - - Water:Pixel:641 - - Water:Pixel:643 - - Water:Pixel:619 - - Water:Pixel:618 - - Water:Pixel:648 - - Water:Pixel:651 - - Water:Pixel:653 - - Water:Pixel:64A - - Water:Pixel:652 - - Water:Pixel:64B - - Water:Pixel:681 - - Water:Pixel:680 - - Water:Pixel:682 - - Water:Pixel:658 - - Water:Pixel:65B - - Water:Pixel:65A - - Water:Pixel:689 - - Water:Pixel:690 - - Water:Pixel:692 - - Water:Pixel:6C0 - - Water:Pixel:6C1 - - Water:Pixel:68B - - Water:Pixel:6C3 - - Water:Pixel:6C2 - - Water:Pixel:699 - - Water:Pixel:698 - - Water:Pixel:4800 - - Water:Pixel:6D1 - - Water:Pixel:6D0 - - Water:Pixel:6C8 - - Water:Pixel:6D3 - - Water:Pixel:6D2 - - Water:Pixel:6C9 - - Water:Pixel:6CB - - Water:Pixel:4802 - - Water:Pixel:6D9 - - Water:Pixel:6DA - x4000:use of potentially uninitialized variable (shadowsampling::getwatershadow): - code: X4000 - message: use of potentially uninitialized variable (ShadowSampling::GetWaterShadow) - instances: - common/shadowsampling.hlsli:194,3: - entries: - - Water:Pixel:1 - - Water:Pixel:4801 - - Water:Pixel:442 - - Water:Pixel:42 - - Water:Pixel:9 - - Water:Pixel:83 - - Water:Pixel:43 - - Water:Pixel:4A - - Water:Pixel:44A - - Water:Pixel:4B - - Water:Pixel:19 - - Water:Pixel:1B - - Water:Pixel:0 - - Water:Pixel:4803 - - Water:Pixel:5803 - - Water:Pixel:3 - - Water:Pixel:11 - - Water:Pixel:211 - - Water:Pixel:203 - - Water:Pixel:213 - - Water:Pixel:411 - - Water:Pixel:413 - - Water:Pixel:601 - - Water:Pixel:611 - - Water:Pixel:603 - - Water:Pixel:613 - - Water:Pixel:401 - - Water:Pixel:202 - - Water:Pixel:82 - - Water:Pixel:1A - - Water:Pixel:9A - - Water:Pixel:9B - - Water:Pixel:283 - - Water:Pixel:683 - - Water:Pixel:21B - - Water:Pixel:21A - - Water:Pixel:282 - - Water:Pixel:61B - - Water:Pixel:61A - - Water:Pixel:12 - - Water:Pixel:29A - - Water:Pixel:69A - - Water:Pixel:8 - - Water:Pixel:A - - Water:Pixel:40 - - Water:Pixel:18 - - Water:Pixel:51 - - Water:Pixel:50 - - Water:Pixel:52 - - Water:Pixel:80 - - Water:Pixel:49 - - Water:Pixel:59 - - Water:Pixel:5B - - Water:Pixel:58 - - Water:Pixel:90 - - Water:Pixel:91 - - Water:Pixel:5A - - Water:Pixel:88 - - Water:Pixel:92 - - Water:Pixel:93 - - Water:Pixel:8A - - Water:Pixel:C0 - - Water:Pixel:C2 - - Water:Pixel:C3 - - Water:Pixel:99 - - Water:Pixel:98 - - Water:Pixel:D0 - - Water:Pixel:D1 - - Water:Pixel:D3 - - Water:Pixel:CB - - Water:Pixel:CA - - Water:Pixel:200 - - Water:Pixel:D9 - - Water:Pixel:D8 - - Water:Pixel:DB - - Water:Pixel:DA - - Water:Pixel:209 - - Water:Pixel:210 - - Water:Pixel:20A - - Water:Pixel:241 - - Water:Pixel:243 - - Water:Pixel:20B - - Water:Pixel:218 - - Water:Pixel:248 - - Water:Pixel:249 - - Water:Pixel:250 - - Water:Pixel:251 - - Water:Pixel:24A - - Water:Pixel:24B - - Water:Pixel:252 - - Water:Pixel:280 - - Water:Pixel:259 - - Water:Pixel:25B - - Water:Pixel:258 - - Water:Pixel:289 - - Water:Pixel:291 - - Water:Pixel:293 - - Water:Pixel:292 - - Water:Pixel:28B - - Water:Pixel:28A - - Water:Pixel:2C0 - - Water:Pixel:2C2 - - Water:Pixel:2C3 - - Water:Pixel:299 - - Water:Pixel:298 - - Water:Pixel:2D1 - - Water:Pixel:2D0 - - Water:Pixel:400 - - Water:Pixel:2C9 - - Water:Pixel:402 - - Water:Pixel:2CB - - Water:Pixel:2CA - - Water:Pixel:2D9 - - Water:Pixel:2D8 - - Water:Pixel:2DB - - Water:Pixel:2DA - - Water:Pixel:410 - - Water:Pixel:409 - - Water:Pixel:408 - - Water:Pixel:40A - - Water:Pixel:441 - - Water:Pixel:440 - - Water:Pixel:451 - - Water:Pixel:419 - - Water:Pixel:418 - - Water:Pixel:453 - - Water:Pixel:452 - - Water:Pixel:41A - - Water:Pixel:41B - - Water:Pixel:481 - - Water:Pixel:480 - - Water:Pixel:482 - - Water:Pixel:483 - - Water:Pixel:459 - - Water:Pixel:458 - - Water:Pixel:45B - - Water:Pixel:45A - - Water:Pixel:491 - - Water:Pixel:493 - - Water:Pixel:492 - - Water:Pixel:488 - - Water:Pixel:48B - - Water:Pixel:4C0 - - Water:Pixel:4C1 - - Water:Pixel:4C3 - - Water:Pixel:4C2 - - Water:Pixel:499 - - Water:Pixel:498 - - Water:Pixel:49B - - Water:Pixel:4D0 - - Water:Pixel:4D2 - - Water:Pixel:4C9 - - Water:Pixel:4D3 - - Water:Pixel:4C8 - - Water:Pixel:4CA - - Water:Pixel:600 - - Water:Pixel:4DB - - Water:Pixel:4D8 - - Water:Pixel:4DA - - Water:Pixel:609 - - Water:Pixel:610 - - Water:Pixel:60A - - Water:Pixel:640 - - Water:Pixel:641 - - Water:Pixel:643 - - Water:Pixel:619 - - Water:Pixel:618 - - Water:Pixel:648 - - Water:Pixel:651 - - Water:Pixel:653 - - Water:Pixel:64A - - Water:Pixel:652 - - Water:Pixel:64B - - Water:Pixel:681 - - Water:Pixel:680 - - Water:Pixel:682 - - Water:Pixel:658 - - Water:Pixel:65B - - Water:Pixel:65A - - Water:Pixel:689 - - Water:Pixel:690 - - Water:Pixel:692 - - Water:Pixel:6C0 - - Water:Pixel:6C1 - - Water:Pixel:68B - - Water:Pixel:6C3 - - Water:Pixel:6C2 - - Water:Pixel:699 - - Water:Pixel:698 - - Water:Pixel:4800 - - Water:Pixel:6D1 - - Water:Pixel:6D0 - - Water:Pixel:6C8 - - Water:Pixel:6D3 - - Water:Pixel:6D2 - - Water:Pixel:6C9 - - Water:Pixel:6CB - - Water:Pixel:4802 - - Water:Pixel:6D9 - - Water:Pixel:6DA - x3595:gradient instruction used in a loop with varying iteration; partial derivatives may have undefined value: - code: X3595 - message: gradient instruction used in a loop with varying iteration; partial derivatives - may have undefined value - instances: - lighting.hlsl:697,24-90: - entries: - - Lighting:Pixel:E008001 - - Lighting:Pixel:E009001 - - Lighting:Pixel:E108001 - - Lighting:Pixel:E109001 - - Lighting:Pixel:E009011 - - Lighting:Pixel:E008011 - - Lighting:Pixel:E109011 - - Lighting:Pixel:E008201 - - Lighting:Pixel:E108201 - - Lighting:Pixel:E009201 - - Lighting:Pixel:E108211 - - Lighting:Pixel:E109211 - - Lighting:Pixel:E009211 - - Lighting:Pixel:E008211 - lighting.hlsl:698,24-90: - entries: - - Lighting:Pixel:E008001 - - Lighting:Pixel:E009001 - - Lighting:Pixel:E108001 - - Lighting:Pixel:E109001 - - Lighting:Pixel:E009011 - - Lighting:Pixel:E008011 - - Lighting:Pixel:E109011 - - Lighting:Pixel:E008201 - - Lighting:Pixel:E108201 - - Lighting:Pixel:E009201 - - Lighting:Pixel:E108211 - - Lighting:Pixel:E109211 - - Lighting:Pixel:E009211 - - Lighting:Pixel:E008211 - lighting.hlsl:699,24-90: - entries: - - Lighting:Pixel:E008001 - - Lighting:Pixel:E009001 - - Lighting:Pixel:E108001 - - Lighting:Pixel:E109001 - - Lighting:Pixel:E009011 - - Lighting:Pixel:E008011 - - Lighting:Pixel:E109011 - - Lighting:Pixel:E008201 - - Lighting:Pixel:E108201 - - Lighting:Pixel:E009201 - - Lighting:Pixel:E108211 - - Lighting:Pixel:E109211 - - Lighting:Pixel:E009211 - - Lighting:Pixel:E008211 - x3557:loop only executes for 1 iteration(s), forcing loop to unroll: - code: X3557 - message: loop only executes for 1 iteration(s), forcing loop to unroll - instances: - water.hlsl:1050,2-73: - entries: - - Water:Pixel:801 - - Water:Pixel:843 - - Water:Pixel:803 - - Water:Pixel:800 - - Water:Pixel:802 - - Water:Pixel:840 - - Water:Pixel:841 -errors: {} -shaders: - - file: BloodSplatter.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - entries: - - entry: BloodSplatter:Pixel:0 - defines: - - SPLATTER - - entry: BloodSplatter:Pixel:1 - defines: - - FLARE - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - WETNESS_EFFECTS - - WATER_EFFECTS - - IBL - - SKYLIGHTING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - FLARE - - ISL - - LOD_BLENDING - entries: - - entry: BloodSplatter:Vertex:1 - defines: [] - - file: DistantTree.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SSGI - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - entries: - - entry: DistantTree:Pixel:10101 - defines: - - RENDER_DEPTH - - DO_ALPHA_TEST - - DEFERRED - - entry: DistantTree:Pixel:10000 - defines: - - DO_ALPHA_TEST - - entry: DistantTree:Pixel:101 - defines: - - RENDER_DEPTH - - DEFERRED - - entry: DistantTree:Pixel:10001 - defines: - - RENDER_DEPTH - - DO_ALPHA_TEST - - entry: DistantTree:Pixel:100 - defines: - - DEFERRED - - entry: DistantTree:Pixel:1 - defines: - - RENDER_DEPTH - - entry: DistantTree:Pixel:10100 - defines: - - DO_ALPHA_TEST - - DEFERRED - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SSGI - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - entries: - - entry: DistantTree:Vertex:0 - defines: [] - - entry: DistantTree:Vertex:10000 - defines: - - DO_ALPHA_TEST - - entry: DistantTree:Vertex:1 - defines: - - RENDER_DEPTH - - entry: DistantTree:Vertex:10001 - defines: - - RENDER_DEPTH - - DO_ALPHA_TEST - - file: RunGrass.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - WETNESS_EFFECTS - - GRASS_COLLISION - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - DO_ALPHA_TEST - - ISL - - GRASS_LIGHTING - - LOD_BLENDING - entries: - - entry: Grass:Pixel:10002 - defines: [] - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - WETNESS_EFFECTS - - GRASS_COLLISION - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - DO_ALPHA_TEST - - ISL - - GRASS_LIGHTING - - LOD_BLENDING - entries: - - entry: Grass:Vertex:10000 - defines: [] - - file: Particle.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - entries: - - entry: Particle:Pixel:3 - defines: - - GRAYSCALE_TO_COLOR - - GRAYSCALE_TO_ALPHA - - entry: Particle:Pixel:4 - defines: - - ENVCUBE - - SNOW - - entry: Particle:Pixel:5 - defines: - - ENVCUBE - - RAIN - - entry: Particle:Pixel:1 - defines: - - GRAYSCALE_TO_COLOR - - entry: Particle:Pixel:2 - defines: - - GRAYSCALE_TO_ALPHA - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - IBL - - SKYLIGHTING - - ISL - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - entries: - - entry: Particle:Vertex:3 - defines: - - GRAYSCALE_TO_COLOR - - GRAYSCALE_TO_ALPHA - - entry: Particle:Vertex:4 - defines: - - ENVCUBE - - SNOW - - entry: Particle:Vertex:5 - defines: - - ENVCUBE - - RAIN - - entry: Particle:Vertex:0 - defines: [] - - entry: Particle:Vertex:1 - defines: - - GRAYSCALE_TO_COLOR - - entry: Particle:Vertex:2 - defines: - - GRAYSCALE_TO_ALPHA - - file: Sky.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - entries: - - entry: Sky:Pixel:3 - defines: - - HORIZFADE - - entry: Sky:Pixel:103 - defines: - - HORIZFADE - - DEFERRED - - entry: Sky:Pixel:104 - defines: - - TEX - - CLOUDS - - DEFERRED - - entry: Sky:Pixel:105 - defines: - - TEX - - CLOUDS - - TEXLERP - - DEFERRED - - entry: Sky:Pixel:5 - defines: - - TEX - - CLOUDS - - TEXLERP - - entry: Sky:Pixel:106 - defines: - - TEX - - CLOUDS - - TEXFADE - - DEFERRED - - entry: Sky:Pixel:6 - defines: - - TEX - - CLOUDS - - TEXFADE - - entry: Sky:Pixel:107 - defines: - - TEX - - DEFERRED - - entry: Sky:Pixel:8 - defines: - - DITHER - - entry: Sky:Pixel:108 - defines: - - DITHER - - DEFERRED - - entry: Sky:Pixel:0 - defines: - - OCCLUSION - - entry: Sky:Pixel:100 - defines: - - OCCLUSION - - DEFERRED - - entry: Sky:Pixel:1 - defines: - - TEX - - DITHER - - entry: Sky:Pixel:101 - defines: - - TEX - - DITHER - - DEFERRED - - entry: Sky:Pixel:102 - defines: - - TEX - - MOONMASK - - DEFERRED - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - IBL - - SKYLIGHTING - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - entries: - - entry: Sky:Vertex:4 - defines: - - TEX - - CLOUDS - - entry: Sky:Vertex:5 - defines: - - TEX - - CLOUDS - - TEXLERP - - entry: Sky:Vertex:6 - defines: - - TEX - - CLOUDS - - TEXFADE - - entry: Sky:Vertex:7 - defines: - - TEX - - entry: Sky:Vertex:8 - defines: - - DITHER - - entry: Sky:Vertex:0 - defines: - - OCCLUSION - - entry: Sky:Vertex:1 - defines: - - TEX - - DITHER - - entry: Sky:Vertex:2 - defines: - - TEX - - MOONMASK - - file: Effect.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - SKYLIGHTING - - IBL - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - entries: - - entry: Effect:Pixel:414C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - SOFT - - entry: Effect:Pixel:80014C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - DEFERRED - - entry: Effect:Pixel:14C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - entry: Effect:Pixel:514C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - SOFT - - entry: Effect:Pixel:114C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - entry: Effect:Pixel:80114C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:80010C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - DEFERRED - - entry: Effect:Pixel:10C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - entry: Effect:Pixel:80110C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:110C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - LIGHTING - - entry: Effect:Pixel:80410C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - SOFT - - DEFERRED - - entry: Effect:Pixel:410C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - SOFT - - entry: Effect:Pixel:510C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - LIGHTING - - SOFT - - entry: Effect:Pixel:80510C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:400 - defines: - - ADDBLEND - - entry: Effect:Pixel:8000400 - defines: - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:C000000 - defines: - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4000000 - defines: - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000800 - defines: - - MULTBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:0 - defines: [] - - entry: Effect:Pixel:8000000 - defines: - - DEFERRED - - entry: Effect:Pixel:8040401 - defines: - - VC - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:40401 - defines: - - VC - - ADDBLEND - - SOFT - - entry: Effect:Pixel:8001401 - defines: - - VC - - ADDBLEND - - PARTICLES - - DEFERRED - - entry: Effect:Pixel:8000401 - defines: - - VC - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:401 - defines: - - VC - - ADDBLEND - - entry: Effect:Pixel:8010401 - defines: - - VC - - ADDBLEND - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10401 - defines: - - VC - - ADDBLEND - - LIGHTING - - entry: Effect:Pixel:8041401 - defines: - - VC - - ADDBLEND - - PARTICLES - - SOFT - - DEFERRED - - entry: Effect:Pixel:41401 - defines: - - VC - - ADDBLEND - - PARTICLES - - SOFT - - entry: Effect:Pixel:8000001 - defines: - - VC - - DEFERRED - - entry: Effect:Pixel:1 - defines: - - VC - - entry: Effect:Pixel:10001 - defines: - - VC - - LIGHTING - - entry: Effect:Pixel:8010001 - defines: - - VC - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:40001 - defines: - - VC - - SOFT - - entry: Effect:Pixel:8040001 - defines: - - VC - - SOFT - - DEFERRED - - entry: Effect:Pixel:4000001 - defines: - - VC - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000001 - defines: - - VC - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4040001 - defines: - - VC - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040001 - defines: - - VC - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C000801 - defines: - - VC - - MULTBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:801 - defines: - - VC - - MULTBLEND - - entry: Effect:Pixel:8000801 - defines: - - VC - - MULTBLEND - - DEFERRED - - entry: Effect:Pixel:C010442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4010442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C018442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4028442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4050442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C038442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4038442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4800442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C808442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4808442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4810442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4818442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C828442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4828442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C838442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4838442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4840442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C850442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4008442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:8800442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8850442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:840442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8840442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:838442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:828442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8828442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:818442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:8810442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:8808442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:40442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Pixel:8040442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:38442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:8038442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:28442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:8028442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:18442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:8018442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Pixel:8442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:8008442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - entry: Effect:Pixel:8000442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:4000842 - defines: - - TEXCOORD - - TEXTURE - - MULTBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000842 - defines: - - TEXCOORD - - TEXTURE - - MULTBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C018042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C028042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4028042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4040042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C050042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C808042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4808042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C810042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4810042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C818042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C828042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4828042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C838042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4838042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4840042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C850042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4850042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4010042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C010042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4008042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C008042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4000042 - defines: - - TEXCOORD - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000042 - defines: - - TEXCOORD - - TEXTURE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:800042 - defines: - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - entry: Effect:Pixel:8800042 - defines: - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:840042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8840042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:838042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8838042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:828042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8828042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:818042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:400042 - defines: - - TEXCOORD - - TEXTURE - - MULTBLEND_DECAL - - entry: Effect:Pixel:8400042 - defines: - - TEXCOORD - - TEXTURE - - MULTBLEND_DECAL - - DEFERRED - - entry: Effect:Pixel:50042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Pixel:8050042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:40042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - entry: Effect:Pixel:38042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:8038042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:8028042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:18042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:8018042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - entry: Effect:Pixel:8042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:42 - defines: - - TEXCOORD - - TEXTURE - - entry: Effect:Pixel:8000042 - defines: - - TEXCOORD - - TEXTURE - - DEFERRED - - entry: Effect:Pixel:20013 - defines: - - VC - - TEXCOORD - - NORMALS - - PROJECTED_UV - - entry: Effect:Pixel:8002083 - defines: - - VC - - TEXCOORD - - INDEXED_TEXTURE - - STRIP_PARTICLES - - DEFERRED - - entry: Effect:Pixel:4010443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C018443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C028443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4028443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4040443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C050443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C038443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4038443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C800443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4800443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C808443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4808443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C810443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4810443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C818443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4818443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4828443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C838443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4840443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4850443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4008443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4000443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:800443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Pixel:8800443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8850443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:840443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8840443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:8838443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:828443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8828443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:8050443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:818443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:8808443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:40443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Pixel:8040443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:38443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:28443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:8028443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:18443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:8018443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Pixel:8010443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8008443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - entry: Effect:Pixel:8051443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:1443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - PARTICLES - - entry: Effect:Pixel:41443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - PARTICLES - - SOFT - - entry: Effect:Pixel:11443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - entry: Effect:Pixel:8011443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:4018043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C028043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4028043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4040043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C050043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C800043 - defines: - - VC - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4800043 - defines: - - VC - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C808043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4808043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C810043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4810043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4818043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4828043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C838043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4838043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4840043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C850043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4850043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4010043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C010043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4008043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C008043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4000043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:800043 - defines: - - VC - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - entry: Effect:Pixel:8800043 - defines: - - VC - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:840043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8838043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:828043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8828043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:818043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:8808043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:400043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND_DECAL - - entry: Effect:Pixel:8400043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND_DECAL - - DEFERRED - - entry: Effect:Pixel:50043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Pixel:8050043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:8040043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - DEFERRED - - entry: Effect:Pixel:38043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:8038043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:28043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:18043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:8018043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - entry: Effect:Pixel:8043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:43 - defines: - - VC - - TEXCOORD - - TEXTURE - - entry: Effect:Pixel:8000043 - defines: - - VC - - TEXCOORD - - TEXTURE - - DEFERRED - - entry: Effect:Pixel:41043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - SOFT - - entry: Effect:Pixel:8051043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:8011043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8001043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - DEFERRED - - entry: Effect:Pixel:4843 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND - - BLOOD - - entry: Effect:Pixel:8004843 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND - - BLOOD - - DEFERRED - - entry: Effect:Pixel:8000843 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND - - DEFERRED - - entry: Effect:Pixel:C01804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:401804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C02804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C80804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:480804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C81804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C82804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C83804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:483804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C03804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:403804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:400804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C00804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:83804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:883804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:82804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:81804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:881804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:803804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:2804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:802804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:801804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:800804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:401844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C02844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C03844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C80844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C81844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:481844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C82844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C83844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C00844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:883844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:82844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:882844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:803844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:81844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:881844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:880844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:2844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:802844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:1844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:801844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:800844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:C01804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:401804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C02804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:480804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:481804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C82804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C83804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:483804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C03804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:403804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:400804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C00804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:883804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:882804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:881804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:880804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:3804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:803804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:2804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:802804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:1804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:801804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:800804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:C01844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:401844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C02844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C03844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C80844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:480844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:481844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C82844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C83844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:483844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:400844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C00844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:83844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:883844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:82844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:3844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:803844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:881844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:880844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:2844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:802844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:1844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:801844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:800844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:C010072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4010072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C018072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4018072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4028072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C050072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4800072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C808072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4808072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C810072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4810072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4818072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C828072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4838072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4840072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C850072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C038072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4038072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4008072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4000072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:800072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - entry: Effect:Pixel:8800072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8850072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:840072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8838072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:828072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:818072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:8808072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:50072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Pixel:40072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - entry: Effect:Pixel:8040072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - DEFERRED - - entry: Effect:Pixel:38072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:8038072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:28072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:8028072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:8018072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8010072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:8008072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:72 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - entry: Effect:Pixel:8000072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - DEFERRED - - entry: Effect:Pixel:C010472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4010472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C018472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C028472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4028472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4040472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C050472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4050472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C038472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4038472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C800472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4800472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4808472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C810472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4810472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C818472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4818472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C828472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4828472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4838472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C850472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C008472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C000472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:800472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Pixel:8800472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:840472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8840472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:838472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8838472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:818472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:8808472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:50472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Pixel:8040472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:38472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:8038472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:28472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:18472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:8018472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Pixel:8010472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - entry: Effect:Pixel:8000472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:4010073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4018073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C028073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4028073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4040073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C050073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4050073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4800073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C808073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C810073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C818073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4818073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C828073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4828073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C838073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4838073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4850073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C038073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4038073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4008073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C008073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4000073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C000073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:8800073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:840073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8840073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:8838073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:828073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8828073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:8818073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:808073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:8808073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:50073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Pixel:8050073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:40073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - entry: Effect:Pixel:8040073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - DEFERRED - - entry: Effect:Pixel:38073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:8038073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:28073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:8028073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:18073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:8018073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - entry: Effect:Pixel:8073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:8008073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:73 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - entry: Effect:Pixel:8000073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - DEFERRED - - entry: Effect:Pixel:4010473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C018473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4018473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C038473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4038473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C040473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4040473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4050473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C800473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4800473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C808473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4808473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C810473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4810473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C818473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4828473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C838473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4838473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C840473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4840473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C850473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4850473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:4008473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C008473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:4000473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:800473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Pixel:8800473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:850473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Pixel:8840473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:838473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8838473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:828473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:8828473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:818473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8818473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:810473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:8810473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:50473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Pixel:8050473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:40473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Pixel:8040473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:28473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:8028473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:8018473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:10473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Pixel:8010473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:8008473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:8000473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:C01807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:401807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C02807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:480807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C81807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:481807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C82807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:483807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C03807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:403807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:83807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:883807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:82807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:882807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:81807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:881807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:880807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:3807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:803807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:2807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:802807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:800807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:C01847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C03847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C02847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C80847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:480847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C81847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:481847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C82847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:483847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:400847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:882847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:881847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:880847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:3847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:803847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:802847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:1847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:801847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:800847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - DEFERRED - - entry: Effect:Pixel:83847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:883847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:C01807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:401807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C02807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C80807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C81807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C82807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C83807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:403807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:400807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C00807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:83807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:883807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:82807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:81807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:881807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:880807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:3807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:803807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:2807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Pixel:802807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:801807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Pixel:C01847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:401847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C03847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:C02847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:402847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C80847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:481847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C82847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:482847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C83847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:483847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:400847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:C00847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:882847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:81847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Pixel:881847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Pixel:880847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:3847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Pixel:803847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Effect:Pixel:1847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Pixel:801847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Pixel:83847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Pixel:883847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - DEFERRED - - entry: Effect:Pixel:80024D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - STRIP_PARTICLES - - DEFERRED - - entry: Effect:Pixel:24D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - STRIP_PARTICLES - - entry: Effect:Pixel:424D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - entry: Effect:Pixel:80424D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - DEFERRED - - entry: Effect:Pixel:80420D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - STRIP_PARTICLES - - SOFT - - DEFERRED - - entry: Effect:Pixel:20D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - STRIP_PARTICLES - - entry: Effect:Pixel:80020D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - STRIP_PARTICLES - - DEFERRED - - entry: Effect:Pixel:8000511 - defines: - - VC - - NORMALS - - FALLOFF - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:8000111 - defines: - - VC - - NORMALS - - FALLOFF - - DEFERRED - - entry: Effect:Pixel:111 - defines: - - VC - - NORMALS - - FALLOFF - - entry: Effect:Pixel:40111 - defines: - - VC - - NORMALS - - FALLOFF - - SOFT - - entry: Effect:Pixel:8040111 - defines: - - VC - - NORMALS - - FALLOFF - - SOFT - - DEFERRED - - entry: Effect:Pixel:8000513 - defines: - - VC - - TEXCOORD - - NORMALS - - FALLOFF - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:8000552 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:40552 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SOFT - - entry: Effect:Pixel:8040552 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:8040152 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - SOFT - - DEFERRED - - entry: Effect:Pixel:40152 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - SOFT - - entry: Effect:Pixel:152 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - entry: Effect:Pixel:C000553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - MOTIONVECTORS_NORMALS - - DEFERRED - - entry: Effect:Pixel:10553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - entry: Effect:Pixel:8010553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - entry: Effect:Pixel:8000553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - DEFERRED - - entry: Effect:Pixel:50553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Pixel:8050553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:8040553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:42553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - entry: Effect:Pixel:8042553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - DEFERRED - - entry: Effect:Pixel:4000153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MOTIONVECTORS_NORMALS - - entry: Effect:Pixel:8010153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - LIGHTING - - DEFERRED - - entry: Effect:Pixel:8000153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - DEFERRED - - entry: Effect:Pixel:50153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - LIGHTING - - SOFT - - entry: Effect:Pixel:8050153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:8000953 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MULTBLEND - - DEFERRED - - entry: Effect:Pixel:40953 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MULTBLEND - - SOFT - - entry: Effect:Pixel:8040953 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MULTBLEND - - SOFT - - DEFERRED - - entry: Effect:Pixel:80025D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - DEFERRED - - entry: Effect:Pixel:25D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - entry: Effect:Pixel:425D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - entry: Effect:Pixel:80425D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - DEFERRED - - entry: Effect:Pixel:80521D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - LIGHTING - - SOFT - - DEFERRED - - entry: Effect:Pixel:521D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - LIGHTING - - SOFT - - entry: Effect:Pixel:421D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - SOFT - - entry: Effect:Pixel:80021D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - DEFERRED - - entry: Effect:Pixel:121D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - LIGHTING - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - LIGHT_LIMIT_FIX - - WETNESS_EFFECTS - - TERRAIN_SHADOWS - - CLOUD_SHADOWS - - DYNAMIC_CUBEMAPS - - WATER_EFFECTS - - SSS - - IBL - - SKYLIGHTING - - ISL - - LOD_BLENDING - - SCREEN_SPACE_SHADOWS - entries: - - entry: Effect:Vertex:114C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - entry: Effect:Vertex:14C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - entry: Effect:Vertex:414C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - SOFT - - entry: Effect:Vertex:514C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - PARTICLES - - LIGHTING - - SOFT - - entry: Effect:Vertex:110C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - LIGHTING - - entry: Effect:Vertex:10C7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - TEXTURE - - INDEXED_TEXTURE - - PARTICLES - - entry: Effect:Vertex:408 - defines: - - SKINNED - - ADDBLEND - - entry: Effect:Vertex:400 - defines: - - ADDBLEND - - entry: Effect:Vertex:10401 - defines: - - VC - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:401 - defines: - - VC - - ADDBLEND - - entry: Effect:Vertex:1401 - defines: - - VC - - ADDBLEND - - PARTICLES - - entry: Effect:Vertex:41401 - defines: - - VC - - ADDBLEND - - PARTICLES - - SOFT - - entry: Effect:Vertex:4040001 - defines: - - VC - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:1 - defines: - - VC - - entry: Effect:Vertex:40001 - defines: - - VC - - SOFT - - entry: Effect:Vertex:10001 - defines: - - VC - - LIGHTING - - entry: Effect:Vertex:4000001 - defines: - - VC - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:801 - defines: - - VC - - MULTBLEND - - entry: Effect:Vertex:4000801 - defines: - - VC - - MULTBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4800442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4050442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4028442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4008442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4808442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4838442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4810442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:800442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:50442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:40442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:8442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Vertex:442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:28442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:818442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:828442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:838442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:850442 - defines: - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4842 - defines: - - TEXCOORD - - TEXTURE - - MULTBLEND - - BLOOD - - entry: Effect:Vertex:4808042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4800042 - defines: - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4050042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4028042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4008042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4850042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4838042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4810042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:808042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:800042 - defines: - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - entry: Effect:Vertex:400042 - defines: - - TEXCOORD - - TEXTURE - - MULTBLEND_DECAL - - entry: Effect:Vertex:38042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:50042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Vertex:40042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - entry: Effect:Vertex:8042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - entry: Effect:Vertex:10042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:42 - defines: - - TEXCOORD - - TEXTURE - - entry: Effect:Vertex:18042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:28042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:818042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:828042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:838042 - defines: - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840042 - defines: - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:850042 - defines: - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4000042 - defines: - - TEXCOORD - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:9 - defines: - - VC - - SKINNED - - entry: Effect:Vertex:20013 - defines: - - VC - - TEXCOORD - - NORMALS - - PROJECTED_UV - - entry: Effect:Vertex:2083 - defines: - - VC - - TEXCOORD - - INDEXED_TEXTURE - - STRIP_PARTICLES - - entry: Effect:Vertex:4800443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:4028443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4808443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4850443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4838443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:808443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:800443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:50443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:40443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:38443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:8443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Vertex:1443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - PARTICLES - - entry: Effect:Vertex:443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:10443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:18443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:838443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:828443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:850443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:1000443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - SKY_OBJECT - - entry: Effect:Vertex:4000443 - defines: - - VC - - TEXCOORD - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4808043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4800043 - defines: - - VC - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4050043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4028043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4008043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4850043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4810043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:808043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:800043 - defines: - - VC - - TEXCOORD - - TEXTURE - - ALPHA_TEST - - entry: Effect:Vertex:400043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND_DECAL - - entry: Effect:Vertex:38043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:41043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - SOFT - - entry: Effect:Vertex:40043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SOFT - - entry: Effect:Vertex:8043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - entry: Effect:Vertex:1043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - entry: Effect:Vertex:10043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:43 - defines: - - VC - - TEXCOORD - - TEXTURE - - entry: Effect:Vertex:11043 - defines: - - VC - - TEXCOORD - - TEXTURE - - PARTICLES - - LIGHTING - - entry: Effect:Vertex:18043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:828043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:838043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:850043 - defines: - - VC - - TEXCOORD - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:1000043 - defines: - - VC - - TEXCOORD - - TEXTURE - - SKY_OBJECT - - entry: Effect:Vertex:4000043 - defines: - - VC - - TEXCOORD - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4843 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND - - BLOOD - - entry: Effect:Vertex:843 - defines: - - VC - - TEXCOORD - - TEXTURE - - MULTBLEND - - entry: Effect:Vertex:480804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:403804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:400804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:484004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:80804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:80004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ALPHA_TEST - - entry: Effect:Vertex:3804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:5004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Vertex:4004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - SOFT - - entry: Effect:Vertex:1804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:81804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:82804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:83804A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:85004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400004A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:81044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:403844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:483844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:80844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:80044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:5044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:3844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Vertex:44A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:1044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:1844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:2844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:81844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:83844A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:84044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:85044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400044A - defines: - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:403804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:400804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:483804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:81004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:80804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:80004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ALPHA_TEST - - entry: Effect:Vertex:40004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MULTBLEND_DECAL - - entry: Effect:Vertex:3804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:4004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - SOFT - - entry: Effect:Vertex:4B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - entry: Effect:Vertex:804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - entry: Effect:Vertex:1004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:1804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:2804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:82804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:83804B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:85004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400004B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:81044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:403844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:400844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:484044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:483844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:80844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:80044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:4044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:3844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Vertex:1044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:1844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:2844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:81844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:82844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:83844B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:84044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:85044B - defines: - - VC - - TEXCOORD - - SKINNED - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4808072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4800072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4050072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4028072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4008072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4850072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4838072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4810072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:800072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - entry: Effect:Vertex:50072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Vertex:40072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - entry: Effect:Vertex:38072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:8072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Vertex:72 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - entry: Effect:Vertex:10072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:28072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:818072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:828072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:838072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:850072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4000072 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4800472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4050472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4028472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:4008472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4808472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4838472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4810472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:800472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:50472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:40472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:38472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:10472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:18472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:818472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:828472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:850472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4000472 - defines: - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4808073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4050073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4028073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4838073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4810073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:808073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:40073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - entry: Effect:Vertex:38073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:8073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Vertex:73 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - entry: Effect:Vertex:10073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:28073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:818073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:838073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4000073 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4800473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4040473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4038473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4018473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4010473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:810473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:4008473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4808473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4840473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4828473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:4818473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:808473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:800473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:50473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:40473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:28473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:38473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:10473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:818473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:838473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:840473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:850473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:4000473 - defines: - - VC - - TEXCOORD - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:403807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:400807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:81007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:80807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:5007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Vertex:4007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - entry: Effect:Vertex:3807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - entry: Effect:Vertex:7A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - entry: Effect:Vertex:1007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:1807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:2807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:81807A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:84007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:85007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400007A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:403847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:81047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:401047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:400847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:484047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:483847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:80847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:80047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:5047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:4047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:2847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:3847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Vertex:47A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:1047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:1847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:81847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:82847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:83847A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:84047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:85047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400047A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:405007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:403807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:401007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:484007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:483807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:80807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - ALPHA_TEST - - entry: Effect:Vertex:80007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ALPHA_TEST - - entry: Effect:Vertex:5007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - entry: Effect:Vertex:4007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - entry: Effect:Vertex:3807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:7B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - entry: Effect:Vertex:1007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - entry: Effect:Vertex:1807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - entry: Effect:Vertex:2807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:82807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:83807B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:84007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:85007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400007B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:404047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:403847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:402847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:81047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:401047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:485047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:484047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:483847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:482847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:481847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:480847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - ALPHA_TEST - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:80047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - ALPHA_TEST - - entry: Effect:Vertex:5047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:4047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - SOFT - - entry: Effect:Vertex:2847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - entry: Effect:Vertex:3847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - entry: Effect:Vertex:847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - entry: Effect:Vertex:47B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - entry: Effect:Vertex:1047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:81847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - ALPHA_TEST - - entry: Effect:Vertex:82847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:83847B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MEMBRANE - - LIGHTING - - PROJECTED_UV - - ALPHA_TEST - - entry: Effect:Vertex:85047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - LIGHTING - - SOFT - - ALPHA_TEST - - entry: Effect:Vertex:400047B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - BINORMAL_TANGENT - - TEXTURE - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:424D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - entry: Effect:Vertex:420D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - STRIP_PARTICLES - - SOFT - - entry: Effect:Vertex:20D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - STRIP_PARTICLES - - entry: Effect:Vertex:511 - defines: - - VC - - NORMALS - - FALLOFF - - ADDBLEND - - entry: Effect:Vertex:40111 - defines: - - VC - - NORMALS - - FALLOFF - - SOFT - - entry: Effect:Vertex:111 - defines: - - VC - - NORMALS - - FALLOFF - - entry: Effect:Vertex:1000513 - defines: - - VC - - TEXCOORD - - NORMALS - - FALLOFF - - ADDBLEND - - SKY_OBJECT - - entry: Effect:Vertex:119 - defines: - - VC - - SKINNED - - NORMALS - - FALLOFF - - entry: Effect:Vertex:40119 - defines: - - VC - - SKINNED - - NORMALS - - FALLOFF - - SOFT - - entry: Effect:Vertex:4000552 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:40552 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SOFT - - entry: Effect:Vertex:552 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - entry: Effect:Vertex:40152 - defines: - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - SOFT - - entry: Effect:Vertex:4000553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:10553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:42553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - SOFT - - entry: Effect:Vertex:553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - entry: Effect:Vertex:50553 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:40153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - SOFT - - entry: Effect:Vertex:153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - entry: Effect:Vertex:10153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - LIGHTING - - entry: Effect:Vertex:1000153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - SKY_OBJECT - - entry: Effect:Vertex:4000153 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MOTIONVECTORS_NORMALS - - entry: Effect:Vertex:40953 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MULTBLEND - - SOFT - - entry: Effect:Vertex:953 - defines: - - VC - - TEXCOORD - - NORMALS - - TEXTURE - - FALLOFF - - MULTBLEND - - entry: Effect:Vertex:55A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - entry: Effect:Vertex:4055A - defines: - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SOFT - - entry: Effect:Vertex:100055B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SKY_OBJECT - - entry: Effect:Vertex:1055B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - entry: Effect:Vertex:4055B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - SOFT - - entry: Effect:Vertex:55B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - entry: Effect:Vertex:5055B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - ADDBLEND - - LIGHTING - - SOFT - - entry: Effect:Vertex:15B - defines: - - VC - - TEXCOORD - - SKINNED - - NORMALS - - TEXTURE - - FALLOFF - - entry: Effect:Vertex:25D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - ADDBLEND - - STRIP_PARTICLES - - entry: Effect:Vertex:121D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - LIGHTING - - entry: Effect:Vertex:521D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - LIGHTING - - SOFT - - entry: Effect:Vertex:421D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - SOFT - - entry: Effect:Vertex:21D7 - defines: - - VC - - TEXCOORD - - TEXCOORD_INDEX - - NORMALS - - TEXTURE - - INDEXED_TEXTURE - - FALLOFF - - STRIP_PARTICLES - - file: Lighting.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - TERRAIN_VARIATION - - WETNESS_EFFECTS - - SHADOWSPLITCOUNT=3 - - SCREEN_SPACE_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - CS_HAIR - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - EXTENDED_MATERIALS - - LIGHT_LIMIT_FIX - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - ISL - - LOD_BLENDING - - EXTENDED_TRANSLUCENCY - - VC - entries: - - entry: Lighting:Pixel:5000401 - defines: - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100401 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:5100401 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:100401 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:4000401 - defines: - - SOFT_LIGHTING - - FACEGEN - - entry: Lighting:Pixel:C000401 - defines: - - SOFT_LIGHTING - - TREE_ANIM - - entry: Lighting:Pixel:1100401 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:C100401 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:C108401 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:10C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:100C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:101C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1100C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - entry: Lighting:Pixel:1C01 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - entry: Lighting:Pixel:9001 - defines: - - BACK_LIGHTING - - PROJECTED_UV - - entry: Lighting:Pixel:10001 - defines: - - ANISO_LIGHTING - - entry: Lighting:Pixel:110001 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1008001 - defines: - - PROJECTED_UV - - ENVMAP - - entry: Lighting:Pixel:1010001 - defines: - - ANISO_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1000001 - defines: - - ENVMAP - - entry: Lighting:Pixel:1108001 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1 - defines: [] - - entry: Lighting:Pixel:1001 - defines: - - BACK_LIGHTING - - entry: Lighting:Pixel:13000001 - defines: - - MULTI_TEXTURE - - LANDSCAPE - - LOD_LAND_BLEND - - entry: Lighting:Pixel:F048001 - defines: - - PROJECTED_UV - - WORLD_MAP - - LODOBJECTSHD - - entry: Lighting:Pixel:F008001 - defines: - - PROJECTED_UV - - LODOBJECTSHD - - entry: Lighting:Pixel:F140001 - defines: - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTSHD - - entry: Lighting:Pixel:F108001 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTSHD - - entry: Lighting:Pixel:F100001 - defines: - - DO_ALPHA_TEST - - LODOBJECTSHD - - entry: Lighting:Pixel:F040001 - defines: - - WORLD_MAP - - LODOBJECTSHD - - entry: Lighting:Pixel:F000001 - defines: - - LODOBJECTSHD - - entry: Lighting:Pixel:E109001 - defines: - - BACK_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:E108001 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:E009001 - defines: - - BACK_LIGHTING - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:E008001 - defines: - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:D008001 - defines: - - PROJECTED_UV - - LODOBJECTS - - entry: Lighting:Pixel:D148001 - defines: - - PROJECTED_UV - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTS - - entry: Lighting:Pixel:D140001 - defines: - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTS - - entry: Lighting:Pixel:D108001 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTS - - entry: Lighting:Pixel:D040001 - defines: - - WORLD_MAP - - LODOBJECTS - - entry: Lighting:Pixel:D000001 - defines: - - LODOBJECTS - - entry: Lighting:Pixel:C100001 - defines: - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:B101001 - defines: - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B000001 - defines: - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B001001 - defines: - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:100001 - defines: - - DO_ALPHA_TEST - - entry: Lighting:Pixel:8000001 - defines: - - MULTI_TEXTURE - - LANDSCAPE - - entry: Lighting:Pixel:6110001 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6100001 - defines: - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6010001 - defines: - - ANISO_LIGHTING - - HAIR - - entry: Lighting:Pixel:3100001 - defines: - - DO_ALPHA_TEST - - PARALLAX - - entry: Lighting:Pixel:101001 - defines: - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:8001 - defines: - - PROJECTED_UV - - entry: Lighting:Pixel:1100001 - defines: - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1110001 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1101001 - defines: - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:11801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:111801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:101801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000801 - defines: - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1011801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1111801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1100801 - defines: - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - entry: Lighting:Pixel:B101801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B100801 - defines: - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B001801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B000801 - defines: - - RIM_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:1101801 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:8009 - defines: - - PROJECTED_UV - - TRUE_PBR - - entry: Lighting:Pixel:9 - defines: - - TRUE_PBR - - entry: Lighting:Pixel:100009 - defines: - - DO_ALPHA_TEST - - TRUE_PBR - - entry: Lighting:Pixel:F048009 - defines: - - PROJECTED_UV - - WORLD_MAP - - LODOBJECTSHD - - TRUE_PBR - - entry: Lighting:Pixel:18009 - defines: - - PROJECTED_UV - - ANISO_LIGHTING - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:F040009 - defines: - - WORLD_MAP - - LODOBJECTSHD - - TRUE_PBR - - entry: Lighting:Pixel:10009 - defines: - - ANISO_LIGHTING - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:118009 - defines: - - PROJECTED_UV - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:F140009 - defines: - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTSHD - - TRUE_PBR - - entry: Lighting:Pixel:110009 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:D008009 - defines: - - PROJECTED_UV - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:D000009 - defines: - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:D100009 - defines: - - DO_ALPHA_TEST - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:D048009 - defines: - - PROJECTED_UV - - WORLD_MAP - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:D040009 - defines: - - WORLD_MAP - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:D140009 - defines: - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:D148009 - defines: - - PROJECTED_UV - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTS - - TRUE_PBR - - entry: Lighting:Pixel:F000009 - defines: - - LODOBJECTSHD - - TRUE_PBR - - entry: Lighting:Pixel:F108009 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTSHD - - TRUE_PBR - - entry: Lighting:Pixel:C100009 - defines: - - DO_ALPHA_TEST - - TREE_ANIM - - TRUE_PBR - - entry: Lighting:Pixel:C110009 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:C010009 - defines: - - ANISO_LIGHTING - - TREE_ANIM - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:8000009 - defines: - - MULTI_TEXTURE - - LANDSCAPE - - TRUE_PBR - - entry: Lighting:Pixel:8010009 - defines: - - ANISO_LIGHTING - - MULTI_TEXTURE - - LANDSCAPE - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:13000009 - defines: - - MULTI_TEXTURE - - LANDSCAPE - - LOD_LAND_BLEND - - TRUE_PBR - - entry: Lighting:Pixel:1000813 - defines: - - SKINNED - - RIM_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:813 - defines: - - SKINNED - - RIM_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:B001813 - defines: - - SKINNED - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B101813 - defines: - - SKINNED - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B100813 - defines: - - SKINNED - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000813 - defines: - - SKINNED - - RIM_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100813 - defines: - - SKINNED - - RIM_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:10013 - defines: - - SKINNED - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:110013 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000013 - defines: - - SKINNED - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100013 - defines: - - SKINNED - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:13 - defines: - - SKINNED - - DEFERRED - - entry: Lighting:Pixel:1013 - defines: - - SKINNED - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10000013 - defines: - - SKINNED - - EYE - - DEFERRED - - entry: Lighting:Pixel:C100013 - defines: - - SKINNED - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C000013 - defines: - - SKINNED - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:B101013 - defines: - - SKINNED - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B001013 - defines: - - SKINNED - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000013 - defines: - - SKINNED - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:6118013 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEPTH_WRITE_DECALS - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6110013 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6100013 - defines: - - SKINNED - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6010013 - defines: - - SKINNED - - ANISO_LIGHTING - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6000013 - defines: - - SKINNED - - HAIR - - DEFERRED - - entry: Lighting:Pixel:5100013 - defines: - - SKINNED - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4000013 - defines: - - SKINNED - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:100013 - defines: - - SKINNED - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1110013 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1101013 - defines: - - SKINNED - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:108019 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:100019 - defines: - - DO_ALPHA_TEST - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:19 - defines: - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:8019 - defines: - - PROJECTED_UV - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:118019 - defines: - - PROJECTED_UV - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:F140019 - defines: - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:110019 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:F040019 - defines: - - WORLD_MAP - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:F048019 - defines: - - PROJECTED_UV - - WORLD_MAP - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:D100019 - defines: - - DO_ALPHA_TEST - - LODOBJECTS - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:D108019 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTS - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:D000019 - defines: - - LODOBJECTS - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:D008019 - defines: - - PROJECTED_UV - - LODOBJECTS - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:D148019 - defines: - - PROJECTED_UV - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTS - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:D040019 - defines: - - WORLD_MAP - - LODOBJECTS - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:F100019 - defines: - - DO_ALPHA_TEST - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:F108019 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:C110019 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:F000019 - defines: - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:F008019 - defines: - - PROJECTED_UV - - LODOBJECTSHD - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:C000019 - defines: - - TREE_ANIM - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:8000019 - defines: - - MULTI_TEXTURE - - LANDSCAPE - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:8010019 - defines: - - ANISO_LIGHTING - - MULTI_TEXTURE - - LANDSCAPE - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:13010019 - defines: - - ANISO_LIGHTING - - MULTI_TEXTURE - - LANDSCAPE - - LOD_LAND_BLEND - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:1B - defines: - - SKINNED - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:1001B - defines: - - SKINNED - - ANISO_LIGHTING - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:10001B - defines: - - SKINNED - - DO_ALPHA_TEST - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:11001B - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:C00001B - defines: - - SKINNED - - TREE_ANIM - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:C01001B - defines: - - SKINNED - - ANISO_LIGHTING - - TREE_ANIM - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:C10001B - defines: - - SKINNED - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - TRUE_PBR - - entry: Lighting:Pixel:C11001B - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:B - defines: - - SKINNED - - TRUE_PBR - - entry: Lighting:Pixel:1000B - defines: - - SKINNED - - ANISO_LIGHTING - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:10000B - defines: - - SKINNED - - DO_ALPHA_TEST - - TRUE_PBR - - entry: Lighting:Pixel:11000B - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:C00000B - defines: - - SKINNED - - TREE_ANIM - - TRUE_PBR - - entry: Lighting:Pixel:C11000B - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - TRUE_PBR - - GLINT - - entry: Lighting:Pixel:1000803 - defines: - - SKINNED - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:803 - defines: - - SKINNED - - RIM_LIGHTING - - entry: Lighting:Pixel:B001803 - defines: - - SKINNED - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B101803 - defines: - - SKINNED - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B100803 - defines: - - SKINNED - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B000803 - defines: - - SKINNED - - RIM_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:100803 - defines: - - SKINNED - - RIM_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1100803 - defines: - - SKINNED - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:110003 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000003 - defines: - - SKINNED - - ENVMAP - - entry: Lighting:Pixel:1001003 - defines: - - SKINNED - - BACK_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1100003 - defines: - - SKINNED - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:3 - defines: - - SKINNED - - entry: Lighting:Pixel:10100003 - defines: - - SKINNED - - DO_ALPHA_TEST - - EYE - - entry: Lighting:Pixel:10000003 - defines: - - SKINNED - - EYE - - entry: Lighting:Pixel:C100003 - defines: - - SKINNED - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:B100003 - defines: - - SKINNED - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B101003 - defines: - - SKINNED - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B001003 - defines: - - SKINNED - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:6118003 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEPTH_WRITE_DECALS - - HAIR - - entry: Lighting:Pixel:6110003 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6108003 - defines: - - SKINNED - - DO_ALPHA_TEST - - DEPTH_WRITE_DECALS - - HAIR - - entry: Lighting:Pixel:6100003 - defines: - - SKINNED - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6010003 - defines: - - SKINNED - - ANISO_LIGHTING - - HAIR - - entry: Lighting:Pixel:6000003 - defines: - - SKINNED - - HAIR - - entry: Lighting:Pixel:4100003 - defines: - - SKINNED - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000003 - defines: - - SKINNED - - FACEGEN - - entry: Lighting:Pixel:101003 - defines: - - SKINNED - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1110003 - defines: - - SKINNED - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:100005 - defines: - - MODELSPACENORMALS - - DO_ALPHA_TEST - - entry: Lighting:Pixel:5 - defines: - - MODELSPACENORMALS - - entry: Lighting:Pixel:12040005 - defines: - - MODELSPACENORMALS - - WORLD_MAP - - LODLANDSCAPE - - LODLANDNOISE - - entry: Lighting:Pixel:9040005 - defines: - - MODELSPACENORMALS - - WORLD_MAP - - LODLANDSCAPE - - entry: Lighting:Pixel:9000005 - defines: - - MODELSPACENORMALS - - LODLANDSCAPE - - entry: Lighting:Pixel:100007 - defines: - - SKINNED - - MODELSPACENORMALS - - DO_ALPHA_TEST - - entry: Lighting:Pixel:7 - defines: - - SKINNED - - MODELSPACENORMALS - - entry: Lighting:Pixel:109011 - defines: - - BACK_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1008011 - defines: - - PROJECTED_UV - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1001011 - defines: - - BACK_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1010011 - defines: - - ANISO_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1000011 - defines: - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:11 - defines: - - DEFERRED - - entry: Lighting:Pixel:1011 - defines: - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:13000011 - defines: - - MULTI_TEXTURE - - LANDSCAPE - - LOD_LAND_BLEND - - DEFERRED - - entry: Lighting:Pixel:F048011 - defines: - - PROJECTED_UV - - WORLD_MAP - - LODOBJECTSHD - - DEFERRED - - entry: Lighting:Pixel:F008011 - defines: - - PROJECTED_UV - - LODOBJECTSHD - - DEFERRED - - entry: Lighting:Pixel:F108011 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTSHD - - DEFERRED - - entry: Lighting:Pixel:F100011 - defines: - - DO_ALPHA_TEST - - LODOBJECTSHD - - DEFERRED - - entry: Lighting:Pixel:F040011 - defines: - - WORLD_MAP - - LODOBJECTSHD - - DEFERRED - - entry: Lighting:Pixel:E109011 - defines: - - BACK_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:E009011 - defines: - - BACK_LIGHTING - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:E008011 - defines: - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:D048011 - defines: - - PROJECTED_UV - - WORLD_MAP - - LODOBJECTS - - DEFERRED - - entry: Lighting:Pixel:D008011 - defines: - - PROJECTED_UV - - LODOBJECTS - - DEFERRED - - entry: Lighting:Pixel:D140011 - defines: - - WORLD_MAP - - DO_ALPHA_TEST - - LODOBJECTS - - DEFERRED - - entry: Lighting:Pixel:D108011 - defines: - - PROJECTED_UV - - DO_ALPHA_TEST - - LODOBJECTS - - DEFERRED - - entry: Lighting:Pixel:D040011 - defines: - - WORLD_MAP - - LODOBJECTS - - DEFERRED - - entry: Lighting:Pixel:D000011 - defines: - - LODOBJECTS - - DEFERRED - - entry: Lighting:Pixel:C100011 - defines: - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C000011 - defines: - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:B101011 - defines: - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000011 - defines: - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B001011 - defines: - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100011 - defines: - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:6110011 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6100011 - defines: - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6010011 - defines: - - ANISO_LIGHTING - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6000011 - defines: - - HAIR - - DEFERRED - - entry: Lighting:Pixel:3100011 - defines: - - DO_ALPHA_TEST - - PARALLAX - - DEFERRED - - entry: Lighting:Pixel:3000011 - defines: - - PARALLAX - - DEFERRED - - entry: Lighting:Pixel:101011 - defines: - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:8011 - defines: - - PROJECTED_UV - - DEFERRED - - entry: Lighting:Pixel:1100011 - defines: - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1110011 - defines: - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1101011 - defines: - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:11811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:101811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000811 - defines: - - RIM_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1001811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1011811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:811 - defines: - - RIM_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:1811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:B101811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B100811 - defines: - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B001811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100811 - defines: - - RIM_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1101811 - defines: - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:15 - defines: - - MODELSPACENORMALS - - DEFERRED - - entry: Lighting:Pixel:100015 - defines: - - MODELSPACENORMALS - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:12040015 - defines: - - MODELSPACENORMALS - - WORLD_MAP - - LODLANDSCAPE - - LODLANDNOISE - - DEFERRED - - entry: Lighting:Pixel:12000015 - defines: - - MODELSPACENORMALS - - LODLANDSCAPE - - LODLANDNOISE - - DEFERRED - - entry: Lighting:Pixel:9040015 - defines: - - MODELSPACENORMALS - - WORLD_MAP - - LODLANDSCAPE - - DEFERRED - - entry: Lighting:Pixel:9000015 - defines: - - MODELSPACENORMALS - - LODLANDSCAPE - - DEFERRED - - entry: Lighting:Pixel:100017 - defines: - - SKINNED - - MODELSPACENORMALS - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:17 - defines: - - SKINNED - - MODELSPACENORMALS - - DEFERRED - - entry: Lighting:Pixel:11A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:111A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000A01 - defines: - - SPECULAR - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1001A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1111A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:A01 - defines: - - SPECULAR - - RIM_LIGHTING - - entry: Lighting:Pixel:1A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - entry: Lighting:Pixel:B101A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B100A01 - defines: - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B001A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B000A01 - defines: - - SPECULAR - - RIM_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:100A01 - defines: - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1101A01 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1100A01 - defines: - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:9201 - defines: - - SPECULAR - - BACK_LIGHTING - - PROJECTED_UV - - entry: Lighting:Pixel:109201 - defines: - - SPECULAR - - BACK_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - entry: Lighting:Pixel:110201 - defines: - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1008201 - defines: - - SPECULAR - - PROJECTED_UV - - ENVMAP - - entry: Lighting:Pixel:1001201 - defines: - - SPECULAR - - BACK_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1000201 - defines: - - SPECULAR - - ENVMAP - - entry: Lighting:Pixel:1108201 - defines: - - SPECULAR - - PROJECTED_UV - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:201 - defines: - - SPECULAR - - entry: Lighting:Pixel:13000201 - defines: - - SPECULAR - - MULTI_TEXTURE - - LANDSCAPE - - LOD_LAND_BLEND - - entry: Lighting:Pixel:E108201 - defines: - - SPECULAR - - PROJECTED_UV - - DO_ALPHA_TEST - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:E009201 - defines: - - SPECULAR - - BACK_LIGHTING - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:E008201 - defines: - - SPECULAR - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - entry: Lighting:Pixel:C100201 - defines: - - SPECULAR - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:C000201 - defines: - - SPECULAR - - TREE_ANIM - - entry: Lighting:Pixel:B100201 - defines: - - SPECULAR - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B101201 - defines: - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B000201 - defines: - - SPECULAR - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B001201 - defines: - - SPECULAR - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:8000201 - defines: - - SPECULAR - - MULTI_TEXTURE - - LANDSCAPE - - entry: Lighting:Pixel:6110201 - defines: - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6100201 - defines: - - SPECULAR - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6010201 - defines: - - SPECULAR - - ANISO_LIGHTING - - HAIR - - entry: Lighting:Pixel:3100201 - defines: - - SPECULAR - - DO_ALPHA_TEST - - PARALLAX - - entry: Lighting:Pixel:3000201 - defines: - - SPECULAR - - PARALLAX - - entry: Lighting:Pixel:101201 - defines: - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:100201 - defines: - - SPECULAR - - DO_ALPHA_TEST - - entry: Lighting:Pixel:108201 - defines: - - SPECULAR - - PROJECTED_UV - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1100201 - defines: - - SPECULAR - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:1101201 - defines: - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:11A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:111A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:101A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000A11 - defines: - - SPECULAR - - RIM_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1001A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1011A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - ANISO_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:A11 - defines: - - SPECULAR - - RIM_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:1A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:B101A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B100A11 - defines: - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B001A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000A11 - defines: - - SPECULAR - - RIM_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100A11 - defines: - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1101A11 - defines: - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100A11 - defines: - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:9211 - defines: - - SPECULAR - - BACK_LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Lighting:Pixel:10211 - defines: - - SPECULAR - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:110211 - defines: - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1008211 - defines: - - SPECULAR - - PROJECTED_UV - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1010211 - defines: - - SPECULAR - - ANISO_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1000211 - defines: - - SPECULAR - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:211 - defines: - - SPECULAR - - DEFERRED - - entry: Lighting:Pixel:1211 - defines: - - SPECULAR - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:13000211 - defines: - - SPECULAR - - MULTI_TEXTURE - - LANDSCAPE - - LOD_LAND_BLEND - - DEFERRED - - entry: Lighting:Pixel:E109211 - defines: - - SPECULAR - - BACK_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:E108211 - defines: - - SPECULAR - - PROJECTED_UV - - DO_ALPHA_TEST - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:E009211 - defines: - - SPECULAR - - BACK_LIGHTING - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:E008211 - defines: - - SPECULAR - - PROJECTED_UV - - MULTI_INDEX - - SPARKLE - - DEFERRED - - entry: Lighting:Pixel:C100211 - defines: - - SPECULAR - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C000211 - defines: - - SPECULAR - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:B101211 - defines: - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000211 - defines: - - SPECULAR - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B001211 - defines: - - SPECULAR - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:8000211 - defines: - - SPECULAR - - MULTI_TEXTURE - - LANDSCAPE - - DEFERRED - - entry: Lighting:Pixel:6110211 - defines: - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6100211 - defines: - - SPECULAR - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6010211 - defines: - - SPECULAR - - ANISO_LIGHTING - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6000211 - defines: - - SPECULAR - - HAIR - - DEFERRED - - entry: Lighting:Pixel:3100211 - defines: - - SPECULAR - - DO_ALPHA_TEST - - PARALLAX - - DEFERRED - - entry: Lighting:Pixel:3000211 - defines: - - SPECULAR - - PARALLAX - - DEFERRED - - entry: Lighting:Pixel:101211 - defines: - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:108211 - defines: - - SPECULAR - - PROJECTED_UV - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:8211 - defines: - - SPECULAR - - PROJECTED_UV - - DEFERRED - - entry: Lighting:Pixel:1100211 - defines: - - SPECULAR - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1101211 - defines: - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1000A03 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:A03 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - entry: Lighting:Pixel:B001A03 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B101A03 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:100A03 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1100A03 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:10203 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - entry: Lighting:Pixel:110203 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000203 - defines: - - SKINNED - - SPECULAR - - ENVMAP - - entry: Lighting:Pixel:1100203 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:203 - defines: - - SKINNED - - SPECULAR - - entry: Lighting:Pixel:1203 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - entry: Lighting:Pixel:10000203 - defines: - - SKINNED - - SPECULAR - - EYE - - entry: Lighting:Pixel:C000203 - defines: - - SKINNED - - SPECULAR - - TREE_ANIM - - entry: Lighting:Pixel:B100203 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B101203 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B001203 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:B000203 - defines: - - SKINNED - - SPECULAR - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:6110203 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6108203 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - DEPTH_WRITE_DECALS - - HAIR - - entry: Lighting:Pixel:6100203 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6010203 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - HAIR - - entry: Lighting:Pixel:6000203 - defines: - - SKINNED - - SPECULAR - - HAIR - - entry: Lighting:Pixel:4100203 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000203 - defines: - - SKINNED - - SPECULAR - - FACEGEN - - entry: Lighting:Pixel:101203 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:100203 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1101203 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:B001A13 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B101A13 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B100A13 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000A13 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100A13 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1100A13 - defines: - - SKINNED - - SPECULAR - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1000213 - defines: - - SKINNED - - SPECULAR - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1001213 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:213 - defines: - - SKINNED - - SPECULAR - - DEFERRED - - entry: Lighting:Pixel:1213 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10100213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - EYE - - DEFERRED - - entry: Lighting:Pixel:10000213 - defines: - - SKINNED - - SPECULAR - - EYE - - DEFERRED - - entry: Lighting:Pixel:C100213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C000213 - defines: - - SKINNED - - SPECULAR - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:B001213 - defines: - - SKINNED - - SPECULAR - - BACK_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000213 - defines: - - SKINNED - - SPECULAR - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:6118213 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEPTH_WRITE_DECALS - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6110213 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6108213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - DEPTH_WRITE_DECALS - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6100213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6010213 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - HAIR - - DEFERRED - - entry: Lighting:Pixel:6000213 - defines: - - SKINNED - - SPECULAR - - HAIR - - DEFERRED - - entry: Lighting:Pixel:5100213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:5000213 - defines: - - SKINNED - - SPECULAR - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4100213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:4000213 - defines: - - SKINNED - - SPECULAR - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:100213 - defines: - - SKINNED - - SPECULAR - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1110213 - defines: - - SKINNED - - SPECULAR - - ANISO_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100205 - defines: - - MODELSPACENORMALS - - SPECULAR - - DO_ALPHA_TEST - - entry: Lighting:Pixel:205 - defines: - - MODELSPACENORMALS - - SPECULAR - - entry: Lighting:Pixel:100215 - defines: - - MODELSPACENORMALS - - SPECULAR - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:215 - defines: - - MODELSPACENORMALS - - SPECULAR - - DEFERRED - - entry: Lighting:Pixel:100207 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - DO_ALPHA_TEST - - entry: Lighting:Pixel:18411 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10411 - defines: - - SOFT_LIGHTING - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:118411 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000411 - defines: - - SOFT_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100411 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:411 - defines: - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:C100411 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C108411 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C000411 - defines: - - SOFT_LIGHTING - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C008411 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:B100411 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000411 - defines: - - SOFT_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:5100411 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:5000411 - defines: - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4100411 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:100411 - defines: - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:10C11 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:100C11 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:101C11 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:110C11 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1100C11 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:C11 - defines: - - SOFT_LIGHTING - - RIM_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10403 - defines: - - SKINNED - - SOFT_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:100403 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:110403 - defines: - - SKINNED - - SOFT_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:403 - defines: - - SKINNED - - SOFT_LIGHTING - - entry: Lighting:Pixel:10100403 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - EYE - - entry: Lighting:Pixel:C100403 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:C000403 - defines: - - SKINNED - - SOFT_LIGHTING - - TREE_ANIM - - entry: Lighting:Pixel:6100403 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6000403 - defines: - - SKINNED - - SOFT_LIGHTING - - HAIR - - entry: Lighting:Pixel:5100403 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:5000403 - defines: - - SKINNED - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100403 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000403 - defines: - - SKINNED - - SOFT_LIGHTING - - FACEGEN - - entry: Lighting:Pixel:100C03 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000C03 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:1100C03 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:C03 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - entry: Lighting:Pixel:1C03 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - entry: Lighting:Pixel:100413 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000413 - defines: - - SKINNED - - SOFT_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100413 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:413 - defines: - - SKINNED - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10100413 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - EYE - - DEFERRED - - entry: Lighting:Pixel:10000413 - defines: - - SKINNED - - SOFT_LIGHTING - - EYE - - DEFERRED - - entry: Lighting:Pixel:C100413 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:6000413 - defines: - - SKINNED - - SOFT_LIGHTING - - HAIR - - DEFERRED - - entry: Lighting:Pixel:5100413 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4100413 - defines: - - SKINNED - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:100C13 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:101C13 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000C13 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100C13 - defines: - - SKINNED - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100405 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:405 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - entry: Lighting:Pixel:5100405 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:5000405 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100405 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000405 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - FACEGEN - - entry: Lighting:Pixel:415 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:5000415 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4100415 - defines: - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:100407 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:5100407 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:5000407 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100407 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000407 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - FACEGEN - - entry: Lighting:Pixel:100417 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:417 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:5100417 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:5000417 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4100417 - defines: - - SKINNED - - MODELSPACENORMALS - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:18601 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - entry: Lighting:Pixel:10601 - defines: - - SPECULAR - - SOFT_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:118601 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:110601 - defines: - - SPECULAR - - SOFT_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000601 - defines: - - SPECULAR - - SOFT_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:601 - defines: - - SPECULAR - - SOFT_LIGHTING - - entry: Lighting:Pixel:C108601 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:C100601 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - entry: Lighting:Pixel:C008601 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - TREE_ANIM - - entry: Lighting:Pixel:B100601 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Pixel:100601 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:10E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:100E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:101E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:110E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1100E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - entry: Lighting:Pixel:E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - entry: Lighting:Pixel:1E01 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - entry: Lighting:Pixel:8611 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - DEFERRED - - entry: Lighting:Pixel:18611 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:108611 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:110611 - defines: - - SPECULAR - - SOFT_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000611 - defines: - - SPECULAR - - SOFT_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100611 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:611 - defines: - - SPECULAR - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:C100611 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C108611 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - DO_ALPHA_TEST - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C000611 - defines: - - SPECULAR - - SOFT_LIGHTING - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:C008611 - defines: - - SPECULAR - - SOFT_LIGHTING - - PROJECTED_UV - - TREE_ANIM - - DEFERRED - - entry: Lighting:Pixel:B100611 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:B000611 - defines: - - SPECULAR - - SOFT_LIGHTING - - MULTI_LAYER_PARALLAX - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:100611 - defines: - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:10E11 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:101E11 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000E11 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100E11 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:E11 - defines: - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - ANISO_LIGHTING - - entry: Lighting:Pixel:100603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - entry: Lighting:Pixel:10100603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - EYE - - entry: Lighting:Pixel:10000603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - EYE - - entry: Lighting:Pixel:6100603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - HAIR - - entry: Lighting:Pixel:6000603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - HAIR - - entry: Lighting:Pixel:5100603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:5000603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100603 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:1000E03 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - ENVMAP - - entry: Lighting:Pixel:E03 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - entry: Lighting:Pixel:101E03 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:10613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - ANISO_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:100613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:110613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:1000613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:10000613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - EYE - - DEFERRED - - entry: Lighting:Pixel:6100613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - HAIR - - DEFERRED - - entry: Lighting:Pixel:5100613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:5000613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4000613 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:1000E13 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:1100E13 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - DO_ALPHA_TEST - - ENVMAP - - DEFERRED - - entry: Lighting:Pixel:E13 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:1E13 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:101E13 - defines: - - SKINNED - - SPECULAR - - SOFT_LIGHTING - - RIM_LIGHTING - - BACK_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:605 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - entry: Lighting:Pixel:5100605 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:5000605 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100605 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000605 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN - - entry: Lighting:Pixel:100615 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:5100615 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:5000615 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4000615 - defines: - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:100607 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:607 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - entry: Lighting:Pixel:5100607 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - entry: Lighting:Pixel:4100607 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - entry: Lighting:Pixel:4000607 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN - - entry: Lighting:Pixel:100617 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - DEFERRED - - entry: Lighting:Pixel:617 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DEFERRED - - entry: Lighting:Pixel:5100617 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:5000617 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN_RGB_TINT - - DEFERRED - - entry: Lighting:Pixel:4100617 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - DO_ALPHA_TEST - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:4000617 - defines: - - SKINNED - - MODELSPACENORMALS - - SPECULAR - - SOFT_LIGHTING - - FACEGEN - - DEFERRED - - entry: Lighting:Pixel:18401 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - entry: Lighting:Pixel:118401 - defines: - - SOFT_LIGHTING - - PROJECTED_UV - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:110401 - defines: - - SOFT_LIGHTING - - ANISO_LIGHTING - - DO_ALPHA_TEST - - entry: Lighting:Pixel:1000401 - defines: - - SOFT_LIGHTING - - ENVMAP - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - TERRAIN_VARIATION - - WETNESS_EFFECTS - - SHADOWSPLITCOUNT=3 - - SCREEN_SPACE_SHADOWS - - DYNAMIC_CUBEMAPS - - SSS - - CS_HAIR - - WATER_EFFECTS - - SSGI - - IBL - - SKYLIGHTING - - EXTENDED_MATERIALS - - LIGHT_LIMIT_FIX - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - ISL - - LOD_BLENDING - - EXTENDED_TRANSLUCENCY - entries: - - entry: Lighting:Vertex:1 - defines: - - VC - - entry: Lighting:Vertex:48001 - defines: - - VC - - PROJECTED_UV - - WORLD_MAP - - entry: Lighting:Vertex:40001 - defines: - - VC - - WORLD_MAP - - entry: Lighting:Vertex:8001 - defines: - - VC - - PROJECTED_UV - - entry: Lighting:Vertex:C008001 - defines: - - VC - - PROJECTED_UV - - TREE_ANIM - - entry: Lighting:Vertex:C000001 - defines: - - VC - - TREE_ANIM - - entry: Lighting:Vertex:B000001 - defines: - - VC - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Vertex:1008001 - defines: - - VC - - PROJECTED_UV - - ENVMAP - - entry: Lighting:Vertex:1000001 - defines: - - VC - - ENVMAP - - entry: Lighting:Vertex:2 - defines: - - SKINNED - - entry: Lighting:Vertex:B000002 - defines: - - SKINNED - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Vertex:8002 - defines: - - SKINNED - - PROJECTED_UV - - entry: Lighting:Vertex:1000002 - defines: - - SKINNED - - ENVMAP - - entry: Lighting:Vertex:0 - defines: [] - - entry: Lighting:Vertex:48000 - defines: - - PROJECTED_UV - - WORLD_MAP - - entry: Lighting:Vertex:40000 - defines: - - WORLD_MAP - - entry: Lighting:Vertex:8000 - defines: - - PROJECTED_UV - - entry: Lighting:Vertex:B000000 - defines: - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Vertex:1008000 - defines: - - PROJECTED_UV - - ENVMAP - - entry: Lighting:Vertex:1000000 - defines: - - ENVMAP - - entry: Lighting:Vertex:3 - defines: - - VC - - SKINNED - - entry: Lighting:Vertex:10000003 - defines: - - VC - - SKINNED - - EYE - - entry: Lighting:Vertex:C000003 - defines: - - VC - - SKINNED - - TREE_ANIM - - entry: Lighting:Vertex:B000003 - defines: - - VC - - SKINNED - - MULTI_LAYER_PARALLAX - - ENVMAP - - entry: Lighting:Vertex:8003 - defines: - - VC - - SKINNED - - PROJECTED_UV - - entry: Lighting:Vertex:1000003 - defines: - - VC - - SKINNED - - ENVMAP - - entry: Lighting:Vertex:4 - defines: - - MODELSPACENORMALS - - entry: Lighting:Vertex:12000004 - defines: - - MODELSPACENORMALS - - LODLANDSCAPE - - LODLANDNOISE - - entry: Lighting:Vertex:9000004 - defines: - - MODELSPACENORMALS - - LODLANDSCAPE - - entry: Lighting:Vertex:5 - defines: - - VC - - MODELSPACENORMALS - - entry: Lighting:Vertex:6 - defines: - - SKINNED - - MODELSPACENORMALS - - entry: Lighting:Vertex:7 - defines: - - VC - - SKINNED - - MODELSPACENORMALS - - file: Water.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - FOG - - SSS - - WATER_EFFECTS - - IBL - - SKYLIGHTING - - ISL - - WATER - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - entries: - - entry: Water:Pixel:2001 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Pixel:3001 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:4001 - defines: - - VC - - UNDERWATER - - entry: Water:Pixel:5001 - defines: - - VC - - STENCIL - - entry: Water:Pixel:1 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1801 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:3801 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Pixel:4801 - defines: - - VC - - LOD - - entry: Water:Pixel:801 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Pixel:442 - defines: - - NORMAL_TEXCOORD - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1842 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:2842 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:1042 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Pixel:2042 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Pixel:3042 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:42 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1002 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Pixel:2002 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Pixel:4002 - defines: - - NORMAL_TEXCOORD - - UNDERWATER - - entry: Water:Pixel:4009 - defines: - - VC - - REFRACTIONS - - UNDERWATER - - entry: Water:Pixel:9 - defines: - - VC - - REFRACTIONS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:83 - defines: - - VC - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1043 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Pixel:3043 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:43 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1843 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:2843 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:843 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Pixel:4A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:44A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:19 - defines: - - VC - - REFRACTIONS - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:400B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - UNDERWATER - - entry: Water:Pixel:1000 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Pixel:2000 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Pixel:3000 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:4000 - defines: - - UNDERWATER - - entry: Water:Pixel:5000 - defines: - - STENCIL - - entry: Water:Pixel:0 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:2803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:3803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Pixel:5803 - defines: - - VC - - NORMAL_TEXCOORD - - SIMPLE - - entry: Water:Pixel:4803 - defines: - - VC - - NORMAL_TEXCOORD - - LOD - - entry: Water:Pixel:803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Pixel:2003 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Pixel:3003 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:4003 - defines: - - VC - - NORMAL_TEXCOORD - - UNDERWATER - - entry: Water:Pixel:3 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:11 - defines: - - VC - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:211 - defines: - - VC - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:203 - defines: - - VC - - NORMAL_TEXCOORD - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:213 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:411 - defines: - - VC - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:413 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:601 - defines: - - VC - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:611 - defines: - - VC - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:603 - defines: - - VC - - NORMAL_TEXCOORD - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:613 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:401 - defines: - - VC - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:202 - defines: - - NORMAL_TEXCOORD - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:82 - defines: - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:9A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:9B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:283 - defines: - - VC - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:21B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:21A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:61A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:61B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:683 - defines: - - VC - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:69A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:29A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:282 - defines: - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4008 - defines: - - REFRACTIONS - - UNDERWATER - - entry: Water:Pixel:8 - defines: - - REFRACTIONS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:400A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - UNDERWATER - - entry: Water:Pixel:A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:12 - defines: - - NORMAL_TEXCOORD - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:18 - defines: - - REFRACTIONS - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:3040 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:40 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:1041 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Pixel:3041 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Pixel:4048 - defines: - - REFRACTIONS - - WADING - - UNDERWATER - - entry: Water:Pixel:4049 - defines: - - VC - - REFRACTIONS - - WADING - - UNDERWATER - - entry: Water:Pixel:49 - defines: - - VC - - REFRACTIONS - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:50 - defines: - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:51 - defines: - - VC - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:52 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:58 - defines: - - REFRACTIONS - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:59 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:5A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:5B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:80 - defines: - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:88 - defines: - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:8A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:90 - defines: - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:91 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:92 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:93 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:98 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:99 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:C2 - defines: - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:CB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:D8 - defines: - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:D9 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:DB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:200 - defines: - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4208 - defines: - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:209 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:420A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:20A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:420B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:20B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:210 - defines: - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:218 - defines: - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:241 - defines: - - VC - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:243 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4248 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:248 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4249 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:249 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:424A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:24A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:424B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Pixel:24B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:250 - defines: - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:251 - defines: - - VC - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:252 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:258 - defines: - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:259 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:25B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:280 - defines: - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:289 - defines: - - VC - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:28A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:28B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:291 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:292 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:293 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:298 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:299 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2C2 - defines: - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2C9 - defines: - - VC - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2CB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2D8 - defines: - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2D9 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2DB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:400 - defines: - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:402 - defines: - - NORMAL_TEXCOORD - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:408 - defines: - - REFRACTIONS - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:409 - defines: - - VC - - REFRACTIONS - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:40A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:410 - defines: - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:418 - defines: - - REFRACTIONS - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:419 - defines: - - VC - - REFRACTIONS - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:41A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:41B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:440 - defines: - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:441 - defines: - - VC - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:451 - defines: - - VC - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:452 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:453 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:458 - defines: - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:459 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:45A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:45B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:480 - defines: - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:481 - defines: - - VC - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:482 - defines: - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:483 - defines: - - VC - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:488 - defines: - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:48B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:491 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:492 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:493 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:498 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:499 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:49B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4C1 - defines: - - VC - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4C2 - defines: - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4C8 - defines: - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4C9 - defines: - - VC - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4D2 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4D8 - defines: - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4DB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:600 - defines: - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4608 - defines: - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:4609 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:609 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:460A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:60A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:460B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:610 - defines: - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:618 - defines: - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:619 - defines: - - VC - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:640 - defines: - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:641 - defines: - - VC - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:643 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4648 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:648 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:4649 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:464A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:64A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:464B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Pixel:64B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:651 - defines: - - VC - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:652 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:653 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:658 - defines: - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:65A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:65B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:680 - defines: - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:681 - defines: - - VC - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:682 - defines: - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:689 - defines: - - VC - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:68B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:690 - defines: - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:692 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:698 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:699 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6C1 - defines: - - VC - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6C2 - defines: - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6C8 - defines: - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6C9 - defines: - - VC - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6CB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6D2 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6D9 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:6DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Pixel:2800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:3800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Pixel:4800 - defines: - - LOD - - entry: Water:Pixel:800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Pixel:1802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:2802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:3802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Pixel:4802 - defines: - - NORMAL_TEXCOORD - - LOD - - entry: Water:Pixel:802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Pixel:1840 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:2840 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:840 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Pixel:1841 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Pixel:2841 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Pixel:841 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - WETNESS_EFFECTS - - CLOUD_SHADOWS - - TERRAIN_SHADOWS - - DYNAMIC_CUBEMAPS - - FOG - - SSS - - WATER_EFFECTS - - IBL - - SKYLIGHTING - - ISL - - WATER - - LOD_BLENDING - - LIGHT_LIMIT_FIX - - SCREEN_SPACE_SHADOWS - entries: - - entry: Water:Vertex:1001 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Vertex:2001 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Vertex:4001 - defines: - - VC - - UNDERWATER - - entry: Water:Vertex:5001 - defines: - - VC - - STENCIL - - entry: Water:Vertex:1 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2801 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:3801 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Vertex:5801 - defines: - - VC - - SIMPLE - - entry: Water:Vertex:801 - defines: - - VC - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:1842 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:2842 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:842 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:1042 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Vertex:2042 - defines: - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Vertex:2002 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Vertex:3002 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Vertex:4002 - defines: - - NORMAL_TEXCOORD - - UNDERWATER - - entry: Water:Vertex:4009 - defines: - - VC - - REFRACTIONS - - UNDERWATER - - entry: Water:Vertex:443 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1043 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Vertex:3043 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Vertex:43 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1843 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:843 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:404A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - UNDERWATER - - entry: Water:Vertex:4A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:400B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - UNDERWATER - - entry: Water:Vertex:B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1000 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Vertex:2000 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Vertex:3000 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Vertex:4000 - defines: - - UNDERWATER - - entry: Water:Vertex:5000 - defines: - - STENCIL - - entry: Water:Vertex:0 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:2803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:3803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Vertex:5803 - defines: - - VC - - NORMAL_TEXCOORD - - SIMPLE - - entry: Water:Vertex:4803 - defines: - - VC - - NORMAL_TEXCOORD - - LOD - - entry: Water:Vertex:803 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:1003 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Vertex:3003 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Vertex:2003 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=4 - - entry: Water:Vertex:5003 - defines: - - VC - - NORMAL_TEXCOORD - - STENCIL - - entry: Water:Vertex:3 - defines: - - VC - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:201 - defines: - - VC - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:211 - defines: - - VC - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:203 - defines: - - VC - - NORMAL_TEXCOORD - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:213 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:411 - defines: - - VC - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:413 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:601 - defines: - - VC - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:613 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:202 - defines: - - NORMAL_TEXCOORD - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:9A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:9B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:29B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:602 - defines: - - NORMAL_TEXCOORD - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:283 - defines: - - VC - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:21B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:21A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:61A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:61B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:683 - defines: - - VC - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:69A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:29A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:282 - defines: - - NORMAL_TEXCOORD - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:8 - defines: - - REFRACTIONS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:400A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - UNDERWATER - - entry: Water:Vertex:A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:12 - defines: - - NORMAL_TEXCOORD - - DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1040 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=2 - - entry: Water:Vertex:3041 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=6 - - entry: Water:Vertex:41 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4048 - defines: - - REFRACTIONS - - WADING - - UNDERWATER - - entry: Water:Vertex:4049 - defines: - - VC - - REFRACTIONS - - WADING - - UNDERWATER - - entry: Water:Vertex:49 - defines: - - VC - - REFRACTIONS - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:51 - defines: - - VC - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:53 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:59 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:5A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:81 - defines: - - VC - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:88 - defines: - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:89 - defines: - - VC - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:8A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:8B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:90 - defines: - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:91 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:92 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:93 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:99 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:C1 - defines: - - VC - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:C8 - defines: - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:C9 - defines: - - VC - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:CB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:D2 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:D8 - defines: - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:D9 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:DB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4208 - defines: - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:208 - defines: - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4209 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:209 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:420A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:20A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:420B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:20B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:210 - defines: - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:212 - defines: - - NORMAL_TEXCOORD - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:218 - defines: - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:219 - defines: - - VC - - REFRACTIONS - - DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:240 - defines: - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:241 - defines: - - VC - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:242 - defines: - - NORMAL_TEXCOORD - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:243 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4248 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:248 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4249 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:249 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:424A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:24A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:424B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - UNDERWATER - - entry: Water:Vertex:250 - defines: - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:252 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:258 - defines: - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:259 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:25B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:280 - defines: - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:281 - defines: - - VC - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:288 - defines: - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:289 - defines: - - VC - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:28A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:28B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:290 - defines: - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:291 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:292 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:293 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:298 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:299 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2C1 - defines: - - VC - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2C2 - defines: - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2C8 - defines: - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2D2 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2D9 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:2DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:400 - defines: - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:409 - defines: - - VC - - REFRACTIONS - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:40B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:410 - defines: - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:412 - defines: - - NORMAL_TEXCOORD - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:418 - defines: - - REFRACTIONS - - DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:440 - defines: - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:448 - defines: - - REFRACTIONS - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:449 - defines: - - VC - - REFRACTIONS - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:450 - defines: - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:451 - defines: - - VC - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:452 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:453 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:458 - defines: - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:459 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:45A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:45B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:480 - defines: - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:488 - defines: - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:48A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:48B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:490 - defines: - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:491 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:492 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:493 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:498 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:499 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:49B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4C1 - defines: - - VC - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4C9 - defines: - - VC - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4CB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4D2 - defines: - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4D8 - defines: - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4D9 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:600 - defines: - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4608 - defines: - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:608 - defines: - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4609 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:609 - defines: - - VC - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:60A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:460B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:60B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:610 - defines: - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:612 - defines: - - NORMAL_TEXCOORD - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:618 - defines: - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:619 - defines: - - VC - - REFRACTIONS - - DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:640 - defines: - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:641 - defines: - - VC - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:642 - defines: - - NORMAL_TEXCOORD - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:643 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4648 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:648 - defines: - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:4649 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:649 - defines: - - VC - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:464A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:64A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:464B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - UNDERWATER - - entry: Water:Vertex:64B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:650 - defines: - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:651 - defines: - - VC - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:653 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:658 - defines: - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:659 - defines: - - VC - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:65A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:681 - defines: - - VC - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:688 - defines: - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:689 - defines: - - VC - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:68A - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:68B - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:690 - defines: - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:691 - defines: - - VC - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:692 - defines: - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:693 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:698 - defines: - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:699 - defines: - - VC - - REFRACTIONS - - DEPTH - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6C0 - defines: - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6C1 - defines: - - VC - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6C2 - defines: - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6C3 - defines: - - VC - - NORMAL_TEXCOORD - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6C8 - defines: - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6C9 - defines: - - VC - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6CA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6CB - defines: - - VC - - NORMAL_TEXCOORD - - REFRACTIONS - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6D0 - defines: - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6D1 - defines: - - VC - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6D3 - defines: - - VC - - NORMAL_TEXCOORD - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:6DA - defines: - - NORMAL_TEXCOORD - - REFRACTIONS - - DEPTH - - WADING - - VERTEX_ALPHA_DEPTH - - FLOWMAP - - BLEND_NORMALS - - SPECULAR - - NUM_SPECULAR_LIGHTS=0 - - entry: Water:Vertex:1800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:2800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:3800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Vertex:4800 - defines: - - LOD - - entry: Water:Vertex:800 - defines: - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:1802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:2802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:3802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=7 - - entry: Water:Vertex:5802 - defines: - - NORMAL_TEXCOORD - - SIMPLE - - entry: Water:Vertex:4802 - defines: - - NORMAL_TEXCOORD - - LOD - - entry: Water:Vertex:802 - defines: - - NORMAL_TEXCOORD - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:1840 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:2840 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:840 - defines: - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - entry: Water:Vertex:1841 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=3 - - entry: Water:Vertex:2841 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=5 - - entry: Water:Vertex:841 - defines: - - VC - - WADING - - SPECULAR - - NUM_SPECULAR_LIGHTS=1 - - file: Utility.hlsl - configs: - PSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - PSHADER - - SHADOWSPLITCOUNT=3 - entries: - - entry: Utility:Pixel:462102 - defines: - - TEXTURE - - FOCUS_SHADOW - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=3 - - entry: Utility:Pixel:262102 - defines: - - TEXTURE - - FOCUS_SHADOW - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=3 - - entry: Utility:Pixel:202102 - defines: - - TEXTURE - - FOCUS_SHADOW - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Pixel:1002002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:1000002 - defines: - - TEXTURE - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:862002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=3 - - entry: Utility:Pixel:800002 - defines: - - TEXTURE - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:462002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=3 - - entry: Utility:Pixel:422002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=1 - - entry: Utility:Pixel:262002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=3 - - entry: Utility:Pixel:222002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=1 - - entry: Utility:Pixel:80002 - defines: - - TEXTURE - - DEBUG_COLOR - - entry: Utility:Pixel:40002 - defines: - - TEXTURE - - DEBUG_SHADOWSPLIT - - entry: Utility:Pixel:14002 - defines: - - TEXTURE - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Pixel:12002 - defines: - - TEXTURE - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Pixel:1002 - defines: - - TEXTURE - - RENDER_NORMAL_CLEAR - - entry: Utility:Pixel:1062002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=3 - - entry: Utility:Pixel:2000002 - defines: - - TEXTURE - - RENDER_BASE_TEXTURE - - entry: Utility:Pixel:1022002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=1 - - entry: Utility:Pixel:1002083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:1000083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:800083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:422083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=1 - - entry: Utility:Pixel:400083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Pixel:202083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Pixel:200083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Pixel:40083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Pixel:2083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Pixel:6083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - entry: Utility:Pixel:4083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - entry: Utility:Pixel:20083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - DEBUG_COLOR - - entry: Utility:Pixel:21083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - DEBUG_COLOR - - entry: Utility:Pixel:22083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:2E083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:32083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:1022083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=1 - - entry: Utility:Pixel:2020083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - DEBUG_COLOR - - entry: Utility:Pixel:4002083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - TREE_ANIM - - entry: Utility:Pixel:400E083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - TREE_ANIM - - entry: Utility:Pixel:4012083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - TREE_ANIM - - entry: Utility:Pixel:4014083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - TREE_ANIM - - entry: Utility:Pixel:4102083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - GRAYSCALE_MASK - - TREE_ANIM - - entry: Utility:Pixel:4202083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Pixel:4400083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Pixel:4802083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Pixel:6000083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - TREE_ANIM - - entry: Utility:Pixel:8002083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - LOD_OBJECT - - entry: Utility:Pixel:2000 - defines: - - RENDER_DEPTH - - NO_PIXEL_SHADER - - entry: Utility:Pixel:1000003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:802003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:402003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Pixel:400003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Pixel:202003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Pixel:80003 - defines: - - VC - - TEXTURE - - DEBUG_COLOR - - entry: Utility:Pixel:40003 - defines: - - VC - - TEXTURE - - DEBUG_SHADOWSPLIT - - entry: Utility:Pixel:12003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Pixel:10003 - defines: - - VC - - TEXTURE - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Pixel:8003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Pixel:1003 - defines: - - VC - - TEXTURE - - RENDER_NORMAL_CLEAR - - entry: Utility:Pixel:14003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Pixel:2000003 - defines: - - VC - - TEXTURE - - RENDER_BASE_TEXTURE - - entry: Utility:Pixel:10000003 - defines: - - VC - - TEXTURE - - LOCALMAP_FOGOFWAR - - entry: Utility:Pixel:1002003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:A03 - defines: - - VC - - TEXTURE - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Pixel:203 - defines: - - VC - - TEXTURE - - RENDER_NORMAL - - entry: Utility:Pixel:1202 - defines: - - TEXTURE - - STENCIL_ABOVE_WATER - - entry: Utility:Pixel:1020082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=1 - - entry: Utility:Pixel:1000082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:800082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Pixel:420082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=1 - - entry: Utility:Pixel:400082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Pixel:220082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASK - - SHADOWFILTER=1 - - entry: Utility:Pixel:200082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Pixel:122082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - GRAYSCALE_MASK - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:60082 - defines: - - TEXTURE - - ALPHA_TEST - - DEBUG_COLOR - - DEBUG_SHADOWSPLIT - - entry: Utility:Pixel:40082 - defines: - - TEXTURE - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Pixel:12082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Pixel:C082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Pixel:6082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - entry: Utility:Pixel:4082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - entry: Utility:Pixel:1082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - entry: Utility:Pixel:2082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Pixel:14082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Pixel:16082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Pixel:21082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - DEBUG_COLOR - - entry: Utility:Pixel:24082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:26082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:2C082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:2E082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:32082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:34082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:36082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - DEPTH_WRITE_DECALS - - entry: Utility:Pixel:2000082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - entry: Utility:Pixel:2020082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - DEBUG_COLOR - - entry: Utility:Pixel:8002082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - LOD_OBJECT - - entry: Utility:Pixel:283 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Pixel:20283 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - DEBUG_COLOR - - entry: Utility:Pixel:4000283 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - TREE_ANIM - - entry: Utility:Pixel:A02 - defines: - - TEXTURE - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Pixel:20A83 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - DEBUG_COLOR - - entry: Utility:Pixel:4000A83 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - TREE_ANIM - - entry: Utility:Pixel:20A82 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - DEBUG_COLOR - - entry: Utility:Pixel:A82 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Pixel:282 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Pixel:20282 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - DEBUG_COLOR - VSHADER: - common_defines: - - VR - - D3DCOMPILE_DEBUG - - D3DCOMPILE_SKIP_OPTIMIZATION - - VSHADER - - SHADOWSPLITCOUNT=3 - entries: - - entry: Utility:Vertex:402102 - defines: - - TEXTURE - - FOCUS_SHADOW - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:842002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=2 - - entry: Utility:Vertex:802002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:800002 - defines: - - TEXTURE - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:400002 - defines: - - TEXTURE - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:242002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=2 - - entry: Utility:Vertex:200002 - defines: - - TEXTURE - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:40002 - defines: - - TEXTURE - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:16002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:14002 - defines: - - TEXTURE - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1002 - defines: - - TEXTURE - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:12002 - defines: - - TEXTURE - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:1042002 - defines: - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=2 - - entry: Utility:Vertex:2000002 - defines: - - TEXTURE - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:800083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:400083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:202083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:40083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:83 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - entry: Utility:Vertex:1083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:2083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:4083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_SHADOWMAP - - entry: Utility:Vertex:E083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:1002083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:20002083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - OPAQUE_EFFECT - - entry: Utility:Vertex:2000A083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - OPAQUE_EFFECT - - GRAYSCALE_TO_ALPHA - - entry: Utility:Vertex:802083 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:80201B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:1201B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:80001B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:40201B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:40001B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:20201B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:20001B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:4001B - defines: - - VC - - TEXTURE - - NORMALS - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:1601B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1401B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1B - defines: - - VC - - TEXTURE - - NORMALS - - entry: Utility:Vertex:801B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:101B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:1001B - defines: - - VC - - TEXTURE - - NORMALS - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:100201B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:200001B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:100001B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:4000 - defines: - - RENDER_SHADOWMAP - - NO_PIXEL_SHADER - - entry: Utility:Vertex:6000 - defines: - - RENDER_DEPTH - - RENDER_SHADOWMAP - - NO_PIXEL_SHADER - - entry: Utility:Vertex:C000 - defines: - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - NO_PIXEL_SHADER - - entry: Utility:Vertex:E000 - defines: - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - NO_PIXEL_SHADER - - entry: Utility:Vertex:2000 - defines: - - RENDER_DEPTH - - NO_PIXEL_SHADER - - entry: Utility:Vertex:1000003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:802003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:402003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:400003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:202003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:200003 - defines: - - VC - - TEXTURE - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:40003 - defines: - - VC - - TEXTURE - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:16003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1003 - defines: - - VC - - TEXTURE - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:3 - defines: - - VC - - TEXTURE - - entry: Utility:Vertex:12003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:1002003 - defines: - - VC - - TEXTURE - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:2000003 - defines: - - VC - - TEXTURE - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:10000003 - defines: - - VC - - TEXTURE - - LOCALMAP_FOGOFWAR - - entry: Utility:Vertex:6004 - defines: - - SKINNED - - RENDER_DEPTH - - RENDER_SHADOWMAP - - NO_PIXEL_SHADER - - entry: Utility:Vertex:C004 - defines: - - SKINNED - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - NO_PIXEL_SHADER - - entry: Utility:Vertex:E004 - defines: - - SKINNED - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - NO_PIXEL_SHADER - - entry: Utility:Vertex:2004 - defines: - - SKINNED - - RENDER_DEPTH - - NO_PIXEL_SHADER - - entry: Utility:Vertex:800006 - defines: - - TEXTURE - - SKINNED - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:400006 - defines: - - TEXTURE - - SKINNED - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:200006 - defines: - - TEXTURE - - SKINNED - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:14006 - defines: - - TEXTURE - - SKINNED - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1006 - defines: - - TEXTURE - - SKINNED - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:6 - defines: - - TEXTURE - - SKINNED - - entry: Utility:Vertex:1000007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:802007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:800007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:402007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:200007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:40007 - defines: - - VC - - TEXTURE - - SKINNED - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:16007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:1002007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:2000007 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:207 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_NORMAL - - entry: Utility:Vertex:603 - defines: - - VC - - TEXTURE - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:1202 - defines: - - TEXTURE - - STENCIL_ABOVE_WATER - - entry: Utility:Vertex:202 - defines: - - TEXTURE - - RENDER_NORMAL - - entry: Utility:Vertex:80001A - defines: - - TEXTURE - - NORMALS - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:40001A - defines: - - TEXTURE - - NORMALS - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:20001A - defines: - - TEXTURE - - NORMALS - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:1401A - defines: - - TEXTURE - - NORMALS - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1A - defines: - - TEXTURE - - NORMALS - - entry: Utility:Vertex:101A - defines: - - TEXTURE - - NORMALS - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:200001A - defines: - - TEXTURE - - NORMALS - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:100001A - defines: - - TEXTURE - - NORMALS - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:1201E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:20001E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:4001E - defines: - - TEXTURE - - SKINNED - - NORMALS - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:1601E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1401E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1E - defines: - - TEXTURE - - SKINNED - - NORMALS - - entry: Utility:Vertex:101E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:200001E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:100001E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:80201F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:1201F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:40201F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:20201F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:20001F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:4001F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:1601F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1401F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - entry: Utility:Vertex:101F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:100201F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:200001F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:100001F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:20002082 - defines: - - TEXTURE - - ALPHA_TEST - - RENDER_DEPTH - - OPAQUE_EFFECT - - entry: Utility:Vertex:20002086 - defines: - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - OPAQUE_EFFECT - - entry: Utility:Vertex:2086 - defines: - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:800087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:402087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:400087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:202087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:200087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:40087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:16087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:12087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:87 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - entry: Utility:Vertex:2087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:4087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_SHADOWMAP - - entry: Utility:Vertex:6087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - entry: Utility:Vertex:C087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:E087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:1000087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:1002087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:2000087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:20002087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - OPAQUE_EFFECT - - entry: Utility:Vertex:802087 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:40009A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:4009A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:1609A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1409A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1209A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:9A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - entry: Utility:Vertex:109A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:209A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:409A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - entry: Utility:Vertex:C09A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:E09A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:100009A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:200009A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:80009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:40209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:40009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:20209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:4009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:1609B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1409B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:9B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - entry: Utility:Vertex:209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:109B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:609B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - entry: Utility:Vertex:C09B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:100009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:100209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:200009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:400009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - TREE_ANIM - - entry: Utility:Vertex:400109B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - TREE_ANIM - - entry: Utility:Vertex:400209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - TREE_ANIM - - entry: Utility:Vertex:400409B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - TREE_ANIM - - entry: Utility:Vertex:400C09B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - TREE_ANIM - - entry: Utility:Vertex:401209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - TREE_ANIM - - entry: Utility:Vertex:401409B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - TREE_ANIM - - entry: Utility:Vertex:401609B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - TREE_ANIM - - entry: Utility:Vertex:404009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - TREE_ANIM - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:420009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASK - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:420209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:440009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:440209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKSPOT - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:480009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:500209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:600009B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - TREE_ANIM - - entry: Utility:Vertex:80209B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:40009E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:20009E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:4009E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:1609E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1209E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:E09E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:9E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - entry: Utility:Vertex:109E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:209E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:609E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - entry: Utility:Vertex:C09E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:100009E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:200009E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - entry: Utility:Vertex:80009E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:80009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:40009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - SHADOWFILTER=0 - - entry: Utility:Vertex:20209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:20009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASK - - SHADOWFILTER=0 - - entry: Utility:Vertex:1609F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1409F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - entry: Utility:Vertex:1209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - entry: Utility:Vertex:E09F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:9F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - entry: Utility:Vertex:109F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - entry: Utility:Vertex:209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - entry: Utility:Vertex:609F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - entry: Utility:Vertex:C09F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - entry: Utility:Vertex:100009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:100209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - SHADOWFILTER=0 - - entry: Utility:Vertex:400009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - TREE_ANIM - - entry: Utility:Vertex:400109F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL_CLEAR - - TREE_ANIM - - entry: Utility:Vertex:400209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - TREE_ANIM - - entry: Utility:Vertex:400409F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - TREE_ANIM - - entry: Utility:Vertex:400609F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - TREE_ANIM - - entry: Utility:Vertex:400C09F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - TREE_ANIM - - entry: Utility:Vertex:400E09F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_CLAMPED - - TREE_ANIM - - entry: Utility:Vertex:401209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - ADDITIONAL_ALPHA_MASK - - TREE_ANIM - - entry: Utility:Vertex:401609F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMAP - - RENDER_SHADOWMAP_PB - - TREE_ANIM - - entry: Utility:Vertex:404009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - TREE_ANIM - - DEBUG_SHADOWSPLIT - - entry: Utility:Vertex:420009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASK - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:440009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKSPOT - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:480009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:480209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:500009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_SHADOWMASKDPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:500209F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_DEPTH - - RENDER_SHADOWMASKDPB - - TREE_ANIM - - SHADOWFILTER=0 - - entry: Utility:Vertex:600009F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_BASE_TEXTURE - - TREE_ANIM - - entry: Utility:Vertex:A9F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A9B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:4000A9B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - TREE_ANIM - - entry: Utility:Vertex:69F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:400069F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - TREE_ANIM - - entry: Utility:Vertex:69B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:400069B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - TREE_ANIM - - entry: Utility:Vertex:29F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Vertex:400029F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - TREE_ANIM - - entry: Utility:Vertex:29B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Vertex:400029B - defines: - - VC - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - TREE_ANIM - - entry: Utility:Vertex:2100 - defines: - - LOD_LANDSCAPE - - RENDER_DEPTH - - NO_PIXEL_SHADER - - entry: Utility:Vertex:602 - defines: - - TEXTURE - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:287 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Vertex:283 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Vertex:21E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_NORMAL - - entry: Utility:Vertex:21B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_NORMAL - - entry: Utility:Vertex:21A - defines: - - TEXTURE - - NORMALS - - RENDER_NORMAL - - entry: Utility:Vertex:206 - defines: - - TEXTURE - - SKINNED - - RENDER_NORMAL - - entry: Utility:Vertex:61A - defines: - - TEXTURE - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:61B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:61E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:61F - defines: - - VC - - TEXTURE - - SKINNED - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:683 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:69A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:29E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - entry: Utility:Vertex:69E - defines: - - TEXTURE - - SKINNED - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_FALLOFF - - entry: Utility:Vertex:A02 - defines: - - TEXTURE - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A06 - defines: - - TEXTURE - - SKINNED - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A07 - defines: - - VC - - TEXTURE - - SKINNED - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A1A - defines: - - TEXTURE - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A1B - defines: - - VC - - TEXTURE - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A1E - defines: - - TEXTURE - - SKINNED - - NORMALS - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A83 - defines: - - VC - - TEXTURE - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A87 - defines: - - VC - - TEXTURE - - SKINNED - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP - - entry: Utility:Vertex:A9A - defines: - - TEXTURE - - NORMALS - - ALPHA_TEST - - RENDER_NORMAL - - RENDER_NORMAL_CLAMP diff --git a/.github/workflows/_shared-build.yaml b/.github/workflows/_shared-build.yaml index ecf4319149..d7b71c3661 100644 --- a/.github/workflows/_shared-build.yaml +++ b/.github/workflows/_shared-build.yaml @@ -133,8 +133,6 @@ jobs: config: - name: "Flatrim" file: ".github/configs/shader-validation.yaml" - - name: "VR" - file: ".github/configs/shader-validation-vr.yaml" fail-fast: false steps: - name: Checkout code diff --git a/CMakePresets.json b/CMakePresets.json index 70e9da7bb7..5248788d68 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -56,7 +56,7 @@ "cacheVariables": { "ENABLE_SKYRIM_AE": "ON", "ENABLE_SKYRIM_SE": "ON", - "ENABLE_SKYRIM_VR": "ON", + "ENABLE_SKYRIM_VR": "OFF", "AUTO_PLUGIN_DEPLOYMENT": "OFF", "COMMONLIB_PREBUILT_MULTICONFIG": "ON" }, @@ -68,7 +68,7 @@ "cacheVariables": { "ENABLE_SKYRIM_AE": "ON", "ENABLE_SKYRIM_SE": "ON", - "ENABLE_SKYRIM_VR": "ON", + "ENABLE_SKYRIM_VR": "OFF", "AUTO_PLUGIN_DEPLOYMENT": "OFF", "COMMONLIB_PREBUILT_MULTICONFIG": "ON" }, diff --git a/CMakeUserPresets.json.template b/CMakeUserPresets.json.template index a316db4344..99bd69fa8d 100644 --- a/CMakeUserPresets.json.template +++ b/CMakeUserPresets.json.template @@ -8,7 +8,7 @@ "AUTO_PLUGIN_DEPLOYMENT": "ON" }, "environment": { - "CommunityShadersOutputDir": "F:/MySkyrimModpack/mods/CommunityShaders;F:/SteamLibrary/steamapps/common/SkyrimVR/Data;F:/SteamLibrary/steamapps/common/Skyrim Special Edition/Data" + "CommunityShadersOutputDir": "F:/MySkyrimModpack/mods/CommunityShaders;F:/SteamLibrary/steamapps/common/Skyrim Special Edition/Data" }, "inherits": "ALL" } diff --git a/docs/new-feature-template/NewFeature.h b/docs/new-feature-template/NewFeature.h index 1ae1ce3d69..86c53cfdf3 100644 --- a/docs/new-feature-template/NewFeature.h +++ b/docs/new-feature-template/NewFeature.h @@ -38,7 +38,6 @@ struct NewFeature : public Feature } // Functionality - virtual bool inline SupportsVR() override { return true; } virtual inline std::string_view GetShaderDefineName() override { return "SHADER_MACRO"; } virtual inline bool HasShaderDefine(RE::BSShader::Type t) override { return t == RE::BSShader::Type::Lighting; }; diff --git a/docs/new-feature-template/NewFeatureReadme.md b/docs/new-feature-template/NewFeatureReadme.md index 85c06059fa..4d420b9d94 100644 --- a/docs/new-feature-template/NewFeatureReadme.md +++ b/docs/new-feature-template/NewFeatureReadme.md @@ -60,13 +60,6 @@ YourFeature yourFeature{}; - Customize `DrawSettings()` UI controls - Update shader compilation paths in `CompileShaders()` -### VR Support - -Set `SupportsVR()` return value: - -- `return true;` - Feature works in VR -- `return false;` - Feature disabled in VR builds - ## Naming Conventions | Component | Convention | Example | diff --git a/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/UpdateCubemapCS.hlsl b/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/UpdateCubemapCS.hlsl index f6d535d635..b4ef83346f 100644 --- a/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/UpdateCubemapCS.hlsl +++ b/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/UpdateCubemapCS.hlsl @@ -1,7 +1,6 @@ #include "Common/Color.hlsli" #include "Common/FrameBuffer.hlsli" #include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" RWTexture2DArray DynamicCubemap : register(u0); RWTexture2DArray DynamicCubemapRaw : register(u1); @@ -73,7 +72,6 @@ float smoothbumpstep(float edge0, float edge1, float x) float weight = 0.0; uv = FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(uv); - uv = Stereo::ConvertToStereoUV(uv, 0); float depth = DepthTexture.SampleLevel(LinearSampler, uv, 0); float linearDepth = SharedData::GetScreenDepth(depth); @@ -84,7 +82,7 @@ float smoothbumpstep(float edge0, float edge1, float x) if (linearDepth > 16.5 && depth != 1.0) { // Ignore objects which are too close or the sky #endif half4 positionCS = half4(2 * half2(uv.x, -uv.y + 1) - 1, depth, 1); - positionCS = mul(FrameBuffer::CameraViewProjInverse[0], positionCS); + positionCS = mul(FrameBuffer::CameraViewProjInverse, positionCS); positionCS.xyz = positionCS.xyz / positionCS.w; position += positionCS.xyz; @@ -114,7 +112,7 @@ float smoothbumpstep(float edge0, float edge1, float x) } float4 position = DynamicCubemapPosition[ThreadID]; - position.xyz = (position.xyz + (CameraPreviousPosAdjust2.xyz * 0.001)) - (FrameBuffer::CameraPosAdjust[0].xyz * 0.001); // Remove adjustment, add new adjustment + position.xyz = (position.xyz + (CameraPreviousPosAdjust2.xyz * 0.001)) - (FrameBuffer::CameraPosAdjust.xyz * 0.001); // Remove adjustment, add new adjustment DynamicCubemapPosition[ThreadID] = position; float4 color = DynamicCubemapRaw[ThreadID]; diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/ExponentialHeightFog.hlsli b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/ExponentialHeightFog.hlsli index c15a0280d3..ede4395433 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/ExponentialHeightFog.hlsli +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/ExponentialHeightFog.hlsli @@ -23,15 +23,6 @@ namespace ExponentialHeightFog return SharedData::exponentialHeightFogSettings.enabled && SharedData::exponentialHeightFogSettings.disableVanillaFog != 0; } - uint GetEyeIndexFromCameraWS(float3 cameraWS) - { -#if defined(VR) - return distance(cameraWS, FrameBuffer::CameraPosAdjust[1].xyz) < distance(cameraWS, FrameBuffer::CameraPosAdjust[0].xyz) ? 1u : 0u; -#else - return 0u; -#endif - } - bool ShouldApplyVolumetricFog() { return SharedData::exponentialHeightFogSettings.enabled != 0 && @@ -44,9 +35,9 @@ namespace ExponentialHeightFog return max(clipPosition.w, SharedData::CameraData.y); } - float GetSceneDepthForFog(float3 positionWS, uint eyeIndex, out float2 volumeUV, out float projectedDepth) + float GetSceneDepthForFog(float3 positionWS, out float2 volumeUV, out float projectedDepth) { - float4 clipPosition = mul(FrameBuffer::CameraViewProj[eyeIndex], float4(positionWS, 1.0f)); + float4 clipPosition = mul(FrameBuffer::CameraViewProj, float4(positionWS, 1.0f)); [branch] if (clipPosition.w <= 0.0f) { volumeUV = 0.0f.xx; @@ -61,7 +52,7 @@ namespace ExponentialHeightFog return projectedDepth; } - float4 SampleVolumetricFog(float3 positionWS, uint eyeIndex) + float4 SampleVolumetricFog(float3 positionWS) { if (!ShouldApplyVolumetricFog()) return float4(0.0f, 0.0f, 0.0f, 1.0f); @@ -75,25 +66,15 @@ namespace ExponentialHeightFog float2 volumeUV; float projectedDepth; - float sceneDepth = GetSceneDepthForFog(positionWS, eyeIndex, volumeUV, projectedDepth); + float sceneDepth = GetSceneDepthForFog(positionWS, volumeUV, projectedDepth); if (projectedDepth <= 0.0f) return float4(0.0f, 0.0f, 0.0f, 1.0f); -#if defined(VR) - volumeUV = Stereo::ConvertToStereoUV(volumeUV, eyeIndex); -#endif - float volumeZ = saturate(ComputeVolumetricNormalizedSlice(sceneDepth, float(volumeDepth))); float3 volumeTexelCenter = 0.5f / float3(volumeWidth, volumeHeight, volumeDepth); float2 volumeUVMin = volumeTexelCenter.xy; float2 volumeUVMax = 1.0f.xx - volumeTexelCenter.xy; -#if defined(VR) - float eyeMinX = (eyeIndex == 0u ? 0.0f : 0.5f) + volumeTexelCenter.x; - float eyeMaxX = (eyeIndex == 0u ? 0.5f : 1.0f) - volumeTexelCenter.x; - volumeUVMin.x = eyeMinX; - volumeUVMax.x = eyeMaxX; -#endif float3 volumeUVW = float3(clamp(volumeUV, volumeUVMin, volumeUVMax), clamp(volumeZ, volumeTexelCenter.z, 1.0f - volumeTexelCenter.z)); float4 volumetricFog = ExponentialHeightFogIntegratedLightScattering.SampleLevel(SampColorSampler, volumeUVW, 0); return lerp(float4(0.0f, 0.0f, 0.0f, 1.0f), volumetricFog, saturate((sceneDepth - GetVolumetricStartDistance()) * 100000000.0f)); @@ -106,7 +87,7 @@ namespace ExponentialHeightFog return saturate(viewSizeSafe / physicalSize); } - float4 SampleVolumetricFog(float4 screenPosition, uint eyeIndex) + float4 SampleVolumetricFog(float4 screenPosition) { if (!ShouldApplyVolumetricFog()) return float4(0.0f, 0.0f, 0.0f, 1.0f); @@ -137,10 +118,6 @@ namespace ExponentialHeightFog float3 volumeTexelCenter = 0.5f / float3(volumeWidth, volumeHeight, volumeDepth); float2 volumeUVMin = volumeTexelCenter.xy; float2 volumeUVMax = max(GetVolumetricFogUVMax(volumeSize, gridPixelSize), volumeUVMin); -#if defined(VR) - volumeUVMin.x = (eyeIndex == 0u ? 0.0f : 0.5f) + volumeTexelCenter.x; - volumeUVMax.x = max(volumeUVMin.x, min(volumeUVMax.x, (eyeIndex == 0u ? 0.5f : 1.0f) - volumeTexelCenter.x)); -#endif float3 volumeUVW = float3(clamp(volumeUV, volumeUVMin, volumeUVMax), clamp(volumeZ, volumeTexelCenter.z, 1.0f - volumeTexelCenter.z)); float4 volumetricFog = ExponentialHeightFogIntegratedLightScattering.SampleLevel(SampColorSampler, volumeUVW, 0); return lerp(float4(0.0f, 0.0f, 0.0f, 1.0f), volumetricFog, saturate((sceneDepth - GetVolumetricStartDistance()) * 100000000.0f)); @@ -172,9 +149,9 @@ namespace ExponentialHeightFog return volumetricFog; } - float4 CombineVolumetricFog(float4 analyticalFog, float3 positionWS, uint eyeIndex, float3 viewDirection) + float4 CombineVolumetricFog(float4 analyticalFog, float3 positionWS, float3 viewDirection) { - float4 volumetricFog = SampleVolumetricFog(positionWS, eyeIndex); + float4 volumetricFog = SampleVolumetricFog(positionWS); volumetricFog = ApplyDirectionalPhaseCorrection(volumetricFog, viewDirection); float analyticalTransmittance = 1.0f - analyticalFog.w; float combinedTransmittance = volumetricFog.a * analyticalTransmittance; @@ -184,9 +161,9 @@ namespace ExponentialHeightFog return float4(combinedOpacity > 1e-4f ? combinedPremultiplied / combinedOpacity : float3(0.0f, 0.0f, 0.0f), combinedOpacity); } - float4 CombineVolumetricFog(float4 analyticalFog, float4 screenPosition, uint eyeIndex, float3 viewDirection) + float4 CombineVolumetricFog(float4 analyticalFog, float4 screenPosition, float3 viewDirection) { - float4 volumetricFog = SampleVolumetricFog(screenPosition, eyeIndex); + float4 volumetricFog = SampleVolumetricFog(screenPosition); volumetricFog = ApplyDirectionalPhaseCorrection(volumetricFog, viewDirection); float analyticalTransmittance = 1.0f - analyticalFog.w; float combinedTransmittance = volumetricFog.a * analyticalTransmittance; @@ -203,11 +180,10 @@ namespace ExponentialHeightFog if (fogDensity <= 0.0f) { return 0.0f; } - uint eyeIndex = GetEyeIndexFromCameraWS(cameraWS); float3 viewToPos = positionWS; float2 volumeUV; float projectedDepth; - float sceneDepth = GetSceneDepthForFog(positionWS, eyeIndex, volumeUV, projectedDepth); + float sceneDepth = GetSceneDepthForFog(positionWS, volumeUV, projectedDepth); [branch] if (projectedDepth > 1e-4f && sceneDepth > projectedDepth) { viewToPos *= sceneDepth / projectedDepth; @@ -276,7 +252,7 @@ namespace ExponentialHeightFog if (!applyVolumetricFog) { return analyticalFog; } - return useScreenPosition ? CombineVolumetricFog(analyticalFog, screenPosition, eyeIndex, viewDirection) : CombineVolumetricFog(analyticalFog, positionWS, eyeIndex, viewDirection); + return useScreenPosition ? CombineVolumetricFog(analyticalFog, screenPosition, viewDirection) : CombineVolumetricFog(analyticalFog, positionWS, viewDirection); } float4 GetExponentialHeightFog(float3 positionWS, float3 cameraWS, float3 fogColor) diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli index bdd69fb861..e2a0a4b5c3 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli @@ -2,7 +2,6 @@ #define __EXPONENTIAL_HEIGHT_FOG_VOLUMETRIC_CS_COMMON_HLSLI__ #include "Common/FrameBuffer.hlsli" -#include "Common/VR.hlsli" cbuffer VolumetricFogCB : register(b0) { @@ -40,17 +39,15 @@ namespace ExponentialHeightFog return all(coord < VolumetricFogGridSize); } - float3 ComputeCellWorldPosition(uint3 coord, float3 cellOffset, out uint eyeIndex, out float viewDepth) + float3 ComputeCellWorldPosition(uint3 coord, float3 cellOffset, out float viewDepth) { float2 volumeUV = (float2(coord.xy) + cellOffset.xy) * VolumetricFogInvGridSize.xy; - eyeIndex = Stereo::GetEyeIndexFromTexCoord(volumeUV); - float2 eyeUV = Stereo::ConvertFromStereoUV(volumeUV, eyeIndex); viewDepth = ComputeVolumetricSliceDepth(max(float(coord.z) + cellOffset.z, 0.0f)); - float2 ndc = eyeUV * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f); + float2 ndc = volumeUV * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f); float deviceZ = (SharedData::CameraData.x - SharedData::CameraData.w / viewDepth) / SharedData::CameraData.z; - float4 worldPosition = mul(VolumetricFogClipToWorld[eyeIndex], float4(ndc, deviceZ, 1.0f)); + float4 worldPosition = mul(VolumetricFogClipToWorld[0], float4(ndc, deviceZ, 1.0f)); return worldPosition.xyz / worldPosition.w; } } diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl index 7a87efa39e..b2e7fb3943 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl @@ -8,14 +8,12 @@ RWTexture2D ConservativeDepthTexture : register(u0); float2 volumeUVMin = (float2(dispatchID.xy) - 0.5f.xx) * VolumetricFogInvGridSize.xy; float2 volumeUVMax = (float2(dispatchID.xy + 1u) + 0.5f.xx) * VolumetricFogInvGridSize.xy; - float2 volumeUVCenter = (float2(dispatchID.xy) + 0.5f.xx) * VolumetricFogInvGridSize.xy; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(volumeUVCenter); - float2 eyeUVMin = saturate(Stereo::ConvertFromStereoUV(volumeUVMin, eyeIndex)); - float2 eyeUVMax = saturate(Stereo::ConvertFromStereoUV(volumeUVMax, eyeIndex)); + float2 eyeUVMin = saturate(volumeUVMin); + float2 eyeUVMax = saturate(volumeUVMax); - int2 minCoord = SharedData::ConvertUVToSampleCoord(min(eyeUVMin, eyeUVMax), eyeIndex).xy; - int2 maxCoord = SharedData::ConvertUVToSampleCoord(max(eyeUVMin, eyeUVMax), eyeIndex).xy - 1; + int2 minCoord = SharedData::ConvertUVToSampleCoord(min(eyeUVMin, eyeUVMax), 0).xy; + int2 maxCoord = SharedData::ConvertUVToSampleCoord(max(eyeUVMin, eyeUVMax), 0).xy - 1; maxCoord = max(maxCoord, minCoord); int2 bufferMax = int2(SharedData::BufferDim.xy) - 1; diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogIntegrationCS.hlsl b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogIntegrationCS.hlsl index e009d7885b..16da9896bc 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogIntegrationCS.hlsl +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogIntegrationCS.hlsl @@ -11,18 +11,16 @@ RWTexture3D IntegratedLightScattering : register(u0); float accumulatedTransmittance = 1.0f; float accumulatedDepth = 0.0f; - uint eyeIndex; float previousDepth; - float3 previousPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(uint3(dispatchID.xy, 0), float3(0.5f, 0.5f, 0.0f), eyeIndex, previousDepth); + float3 previousPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(uint3(dispatchID.xy, 0), float3(0.5f, 0.5f, 0.0f), previousDepth); [loop] for (uint layerIndex = 0; layerIndex < VolumetricFogGridSize.z; layerIndex++) { uint3 layerCoordinate = uint3(dispatchID.xy, layerIndex); float4 scatteringAndExtinction = LightScattering[layerCoordinate]; - uint layerEyeIndex; float layerDepth; - float3 layerPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(layerCoordinate, 0.5f.xxx, layerEyeIndex, layerDepth); + float3 layerPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(layerCoordinate, 0.5f.xxx, layerDepth); float stepLength = length(layerPositionWS - previousPositionWS); previousPositionWS = layerPositionWS; diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl index 9263c88ba8..2eb4d819cf 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl @@ -68,10 +68,10 @@ bool IsFroxelBehindSceneDepth(uint3 coord) return sceneDepth < frontDepth; } -float3 ComputeHistoryVolumeUVAndDepth(float3 positionWS, uint eyeIndex, out bool validHistory, out float previousViewDepth) +float3 ComputeHistoryVolumeUVAndDepth(float3 positionWS, out bool validHistory, out float previousViewDepth) { - float3 previousPositionWS = positionWS + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPreviousPosAdjust[eyeIndex].xyz; - float4 previousClip = mul(FrameBuffer::CameraPreviousViewProjUnjittered[eyeIndex], float4(previousPositionWS, 1.0f)); + float3 previousPositionWS = positionWS + FrameBuffer::CameraPosAdjust.xyz - FrameBuffer::CameraPreviousPosAdjust.xyz; + float4 previousClip = mul(FrameBuffer::CameraPreviousViewProjUnjittered, float4(previousPositionWS, 1.0f)); previousViewDepth = abs(previousClip.w); validHistory = previousClip.w > 0.0f; @@ -79,9 +79,6 @@ float3 ComputeHistoryVolumeUVAndDepth(float3 positionWS, uint eyeIndex, out bool return 0.0f.xxx; float2 historyUV = previousClip.xy / previousClip.w * float2(0.5f, -0.5f) + 0.5f; -#if defined(VR) - historyUV = Stereo::ConvertToStereoUV(historyUV, eyeIndex); -#endif float historyZ = ExponentialHeightFog::ComputeVolumetricNormalizedSlice(previousViewDepth); float3 volumeUV = float3(historyUV, historyZ); @@ -89,10 +86,10 @@ float3 ComputeHistoryVolumeUVAndDepth(float3 positionWS, uint eyeIndex, out bool return saturate(volumeUV); } -float3 ComputeHistoryVolumeUV(float3 positionWS, uint eyeIndex, out bool validHistory) +float3 ComputeHistoryVolumeUV(float3 positionWS, out bool validHistory) { float previousViewDepth; - return ComputeHistoryVolumeUVAndDepth(positionWS, eyeIndex, validHistory, previousViewDepth); + return ComputeHistoryVolumeUVAndDepth(positionWS, validHistory, previousViewDepth); } float2 FixupHistoryUV(float2 uv, float previousCellDepth, out bool validHistory) @@ -159,7 +156,7 @@ float SampleDirectionalShadowPCF(float3 positionLS, uint cascadeIndex) return (center * 4.0f + cross) * rcp(8.0f); } -float SampleDirectionalShadow(float3 positionWS, uint eyeIndex) +float SampleDirectionalShadow(float3 positionWS) { if (SharedData::InInterior || SharedData::HideSky || SharedData::InMapMenu) return 1.0f; @@ -167,7 +164,7 @@ float SampleDirectionalShadow(float3 positionWS, uint eyeIndex) return 1.0f; DirectionalShadowLightData directionalShadowLightData = DirectionalShadowLights[0]; - float shadowMapDepth = SharedData::GetScreenDepth(FrameBuffer::GetShadowDepth(positionWS, eyeIndex)); + float shadowMapDepth = SharedData::GetScreenDepth(FrameBuffer::GetShadowDepth(positionWS)); if (shadowMapDepth >= directionalShadowLightData.EndSplitDistances.y) return 1.0f; @@ -175,7 +172,7 @@ float SampleDirectionalShadow(float3 positionWS, uint eyeIndex) float cascadeSelect = smoothstep(0.0f, 1.0f, saturate((shadowMapDepth - directionalShadowLightData.StartSplitDistances.y) / splitDenom)); uint primaryCascade = (uint)cascadeSelect; - float3 absolutePositionWS = positionWS + FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + float3 absolutePositionWS = positionWS + FrameBuffer::CameraPosAdjust.xyz; float3 positionLS = mul(directionalShadowLightData.ShadowProj[primaryCascade], float4(absolutePositionWS, 1.0f)).xyz; if (any(positionLS.xy < 0.0f) || any(positionLS.xy > 1.0f)) return 1.0f; @@ -197,14 +194,14 @@ float SampleDirectionalShadow(float3 positionWS, uint eyeIndex) return lerp(1.0f, shadow, fadeFactor); } -float SampleDirectionalWorldShadow(float3 positionWS, uint eyeIndex) +float SampleDirectionalWorldShadow(float3 positionWS) { if (SharedData::InInterior || SharedData::HideSky || SharedData::InMapMenu) return 1.0f; float worldShadow = 1.0f; #if defined(TERRAIN_SHADOWS) - worldShadow *= TerrainShadows::GetTerrainShadow(positionWS + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, LinearSampler); + worldShadow *= TerrainShadows::GetTerrainShadow(positionWS + FrameBuffer::CameraPosAdjust.xyz, LinearSampler); #endif #if defined(CLOUD_SHADOWS) worldShadow *= CloudShadows::GetCloudShadowMult(positionWS, LinearSampler); @@ -212,18 +209,14 @@ float SampleDirectionalWorldShadow(float3 positionWS, uint eyeIndex) return worldShadow; } -float3 ComputeSkyLightScattering(float3 positionWS, float3 viewDirection, uint eyeIndex) +float3 ComputeSkyLightScattering(float3 positionWS, float3 viewDirection) { float phaseG = SharedData::exponentialHeightFogSettings.volumetricFogScatteringDistribution; float3 skyDirection = abs(phaseG) > 0.001f ? normalize(-viewDirection * phaseG) : 0.0f.xxx; float3 skyVisibilityDirection = abs(phaseG) > 0.001f ? skyDirection : float3(0.0f, 0.0f, 1.0f); float skyVisibility = 1.0f; if (VolumetricFogHasSkylighting && !SharedData::InInterior) { -#if defined(VR) - float3 skylightingPosition = positionWS + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -#else float3 skylightingPosition = positionWS; -#endif sh2 skylightingSH = Skylighting::SampleNoBias(skylightingPosition); skyVisibility = Skylighting::EvaluateDiffuse(skylightingSH, skyVisibilityDirection, Skylighting::GetFadeOutFactor(skylightingPosition)); } @@ -258,14 +251,13 @@ float3 AccumulateLocalLightScattering( float3 positionWS, float viewDepth, float3 viewDirection, - uint eyeIndex, float3 materialScattering) { if (!VolumetricFogHasLocalLights) return 0.0f.xxx; float2 volumeUV = (float2(coord.xy) + cellOffset.xy) * VolumetricFogInvGridSize.xy; - float2 screenUV = Stereo::ConvertFromStereoUV(volumeUV, eyeIndex); + float2 screenUV = volumeUV; uint clusterIndex = 0; if (!LightLimitFix::GetClusterIndex(screenUV, viewDepth, clusterIndex)) @@ -274,9 +266,8 @@ float3 AccumulateLocalLightScattering( LightLimitFix::LightGrid grid = LightLimitFix::lightGrid[clusterIndex]; uint lightCount = min(grid.lightCount, (uint)MAX_CLUSTER_LIGHTS); - uint cornerEyeIndex; float cornerViewDepth; - float3 cellCornerWS = ExponentialHeightFog::ComputeCellWorldPosition(coord + uint3(1, 1, 1), cellOffset, cornerEyeIndex, cornerViewDepth); + float3 cellCornerWS = ExponentialHeightFog::ComputeCellWorldPosition(coord + uint3(1, 1, 1), cellOffset, cornerViewDepth); float cellRadius = max(length(cellCornerWS - positionWS), 1.0f); float phaseG = SharedData::exponentialHeightFogSettings.volumetricFogScatteringDistribution; @@ -289,7 +280,7 @@ float3 AccumulateLocalLightScattering( if (light.lightFlags & LightLimitFix::LightFlags::Disabled) continue; - float3 toLight = light.positionWS[eyeIndex].xyz - positionWS; + float3 toLight = light.positionWS[0].xyz - positionWS; float distanceSqr = dot(toLight, toLight); if (distanceSqr < 1e-6f) continue; @@ -317,7 +308,6 @@ float3 AccumulateLocalLightScattering( float3 positionWS, float viewDepth, float3 viewDirection, - uint eyeIndex, float3 materialScattering) { return 0.0f.xxx; @@ -326,9 +316,8 @@ float3 AccumulateLocalLightScattering( float4 ComputeLightScattering(uint3 coord, float3 cellOffset) { - uint eyeIndex; float viewDepth; - float3 positionWS = ExponentialHeightFog::ComputeCellWorldPosition(coord, cellOffset, eyeIndex, viewDepth); + float3 positionWS = ExponentialHeightFog::ComputeCellWorldPosition(coord, cellOffset, viewDepth); float4 materialScatteringAndExtinction = VBufferA[coord]; float extinction = materialScatteringAndExtinction.w; @@ -340,8 +329,8 @@ float4 ComputeLightScattering(uint3 coord, float3 cellOffset) // resolution during compositing in SampleVolumetricFog(). float directionalPhase = 1.0f / (4.0f * Math::PI); - float directionalShadow = SampleDirectionalShadow(positionWS, eyeIndex) * - SampleDirectionalWorldShadow(positionWS, eyeIndex); + float directionalShadow = SampleDirectionalShadow(positionWS) * + SampleDirectionalWorldShadow(positionWS); float3 directionalScattering = SharedData::DirLightColor.xyz * SharedData::exponentialHeightFogSettings.volumetricDirectionalScatteringIntensity * @@ -349,7 +338,7 @@ float4 ComputeLightScattering(uint3 coord, float3 cellOffset) directionalPhase * materialScatteringAndExtinction.rgb; - float3 skyScattering = ComputeSkyLightScattering(positionWS, viewDirection, eyeIndex) * + float3 skyScattering = ComputeSkyLightScattering(positionWS, viewDirection) * materialScatteringAndExtinction.rgb; float3 localScattering = AccumulateLocalLightScattering( @@ -358,7 +347,6 @@ float4 ComputeLightScattering(uint3 coord, float3 cellOffset) positionWS, viewDepth, viewDirection, - eyeIndex, materialScatteringAndExtinction.rgb); float3 emissive = SharedData::exponentialHeightFogSettings.volumetricFogEmissive.rgb * @@ -372,23 +360,21 @@ float4 ComputeLightScattering(uint3 coord, float3 cellOffset) if (!ExponentialHeightFog::IsInsideVolumetricGrid(dispatchID)) return; - uint eyeIndex; float viewDepth; - float3 centerPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(dispatchID, 0.5f.xxx, eyeIndex, viewDepth); + float3 centerPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(dispatchID, 0.5f.xxx, viewDepth); if (VolumetricFogHasConservativeDepth && IsFroxelBehindSceneDepth(dispatchID)) { LightScattering[dispatchID] = 0.0f.xxxx; return; } bool validHistory; - float3 historyUV = ComputeHistoryVolumeUV(centerPositionWS, eyeIndex, validHistory); + float3 historyUV = ComputeHistoryVolumeUV(centerPositionWS, validHistory); if (VolumetricFogHasPrevConservativeDepth && validHistory) { - uint frontEyeIndex; float frontDepth; - float3 frontPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(dispatchID, float3(0.5f, 0.5f, -0.5f), frontEyeIndex, frontDepth); + float3 frontPositionWS = ExponentialHeightFog::ComputeCellWorldPosition(dispatchID, float3(0.5f, 0.5f, -0.5f), frontDepth); bool validFrontHistory; float previousFrontDepth; - ComputeHistoryVolumeUVAndDepth(frontPositionWS, frontEyeIndex, validFrontHistory, previousFrontDepth); + ComputeHistoryVolumeUVAndDepth(frontPositionWS, validFrontHistory, previousFrontDepth); if (validFrontHistory) { historyUV.xy = saturate(FixupHistoryUV(historyUV.xy, previousFrontDepth, validHistory)); } else { diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogMaterialCS.hlsl b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogMaterialCS.hlsl index 07687f7015..7375d1fed5 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogMaterialCS.hlsl +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogMaterialCS.hlsl @@ -6,11 +6,10 @@ RWTexture3D VBufferA : register(u0); if (!ExponentialHeightFog::IsInsideVolumetricGrid(dispatchID)) return; - uint eyeIndex; float viewDepth; - float3 positionWS = ExponentialHeightFog::ComputeCellWorldPosition(dispatchID, 0.5f.xxx, eyeIndex, viewDepth); + float3 positionWS = ExponentialHeightFog::ComputeCellWorldPosition(dispatchID, 0.5f.xxx, viewDepth); - float extinction = ExponentialHeightFog::EvaluateHeightFogExtinction(positionWS, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + float extinction = ExponentialHeightFog::EvaluateHeightFogExtinction(positionWS, FrameBuffer::CameraPosAdjust.xyz); float3 albedo = saturate(SharedData::exponentialHeightFogSettings.volumetricFogAlbedo.rgb); float3 scattering = extinction * albedo * SharedData::exponentialHeightFogSettings.volumetricFogAlbedo.a; diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index f66859c9da..07631d0038 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -46,10 +46,6 @@ namespace ExtendedMaterials textureDims /= 2.0; #endif -#if defined(VR) - textureDims /= 2.0; -#endif - float2 texCoordsPerSize = coords * textureDims; float2 dxSize = ddx(texCoordsPerSize); @@ -68,11 +64,6 @@ namespace ExtendedMaterials mipLevel++; #endif -// VR: Apply more conservative mipmap level adjustments to reduce over-blurring and shimmering -#if defined(VR) - mipLevel++; -#endif - // Stochastic mip selection: use screen noise to select between adjacent mip levels mipLevel = floor(mipLevel) + (screenNoise < frac(mipLevel) ? 1.0 : 0.0); @@ -321,23 +312,12 @@ namespace ExtendedMaterials StochasticOffsets sharedOffset, float2 dx, float2 dy, # endif out float pixelOffset, -# if defined(VR_STEREO_OPT) - out bool hasPOM, -# endif out float weights[6]) #else - float2 GetParallaxCoords(float distance, float2 coords, float mipLevel, float3 viewDir, float3x3 tbn, float noise, Texture2D tex, SamplerState texSampler, uint channel, DisplacementParams params, out float pixelOffset -# if defined(VR_STEREO_OPT) - , - out bool hasPOM -# endif - ) + float2 GetParallaxCoords(float distance, float2 coords, float mipLevel, float3 viewDir, float3x3 tbn, float noise, Texture2D tex, SamplerState texSampler, uint channel, DisplacementParams params, out float pixelOffset) #endif { pixelOffset = 0.0; -#if defined(VR_STEREO_OPT) - hasPOM = false; -#endif float3 viewDirTS = normalize(mul(tbn, viewDir)); #if defined(LANDSCAPE) viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3 + params[0].FlattenAmount; // Fix for objects at extreme viewing angles @@ -510,9 +490,6 @@ namespace ExtendedMaterials nearBlendToFar *= nearBlendToFar; float offset = (1.0 - parallaxAmount) * -maxHeight + minHeight; pixelOffset = saturate(lerp(parallaxAmount, 0.5, nearBlendToFar)); -#if defined(VR_STEREO_OPT) - hasPOM = true; -#endif return lerp(viewDirTS.xy * offset + coords.xy, coords, nearBlendToFar); } diff --git a/features/Hair Specular/Shaders/Hair/Hair.hlsli b/features/Hair Specular/Shaders/Hair/Hair.hlsli index d7d1ea07bb..15abfbed67 100644 --- a/features/Hair Specular/Shaders/Hair/Hair.hlsli +++ b/features/Hair Specular/Shaders/Hair/Hair.hlsli @@ -261,7 +261,7 @@ namespace Hair return saturate(lerp(float3(luminance, luminance, luminance), color, saturation)); } - float HairSelfShadow(float3 positionWS, float3 lightDirWS, float noise, uint eyeIndex) + float HairSelfShadow(float3 positionWS, float3 lightDirWS, float noise) { if (!SharedData::hairSpecularSettings.EnableSelfShadow) { return 1.0; @@ -270,8 +270,8 @@ namespace Hair // Simple raymarch const int stepCount = 4; - float3 positionVS = FrameBuffer::WorldToView(positionWS, true, eyeIndex); - float3 lightDirVS = FrameBuffer::WorldToView(lightDirWS, false, eyeIndex); + float3 positionVS = FrameBuffer::WorldToView(positionWS); + float3 lightDirVS = FrameBuffer::WorldToView(lightDirWS, false); lightDirVS *= max(SharedData::hairSpecularSettings.SelfShadowScale * GAME_UNIT_TO_CM, 0.05); float stepSize = 1.0 / stepCount; @@ -282,11 +282,11 @@ namespace Hair [unroll(stepCount)] for (int i = 0; i < stepCount; ++i) { ray += lightDirVS * stepSize; - float2 rayUV = FrameBuffer::ViewToUV(ray, true, eyeIndex); + float2 rayUV = FrameBuffer::ViewToUV(ray); if (FrameBuffer::IsOutsideFrame(rayUV)) continue; float rayDepth = ray.z; - float sampleDepth = SharedData::GetScreenDepth(rayUV, eyeIndex); + float sampleDepth = SharedData::GetScreenDepth(rayUV); if (sampleDepth < rayDepth) { hitCount++; } diff --git a/features/Light Limit Fix/Shaders/LightLimitFix/ClusterBuildingCS.hlsl b/features/Light Limit Fix/Shaders/LightLimitFix/ClusterBuildingCS.hlsl index 8d0134aafa..da0f1d87b4 100644 --- a/features/Light Limit Fix/Shaders/LightLimitFix/ClusterBuildingCS.hlsl +++ b/features/Light Limit Fix/Shaders/LightLimitFix/ClusterBuildingCS.hlsl @@ -10,14 +10,14 @@ cbuffer PerFrame : register(b0) uint4 ClusterSize; } -float3 GetPositionVS(float2 texcoord, float depth, int eyeIndex = 0) +float3 GetPositionVS(float2 texcoord, float depth) { float4 clipSpaceLocation; clipSpaceLocation.xy = texcoord * 2.0f - 1.0f; // convert from [0,1] to [-1,1] clipSpaceLocation.y *= -1; clipSpaceLocation.z = depth; clipSpaceLocation.w = 1.0f; - float4 homogenousLocation = mul(FrameBuffer::CameraProjInverse[eyeIndex], clipSpaceLocation); + float4 homogenousLocation = mul(FrameBuffer::CameraProjInverse, clipSpaceLocation); return homogenousLocation.xyz / homogenousLocation.w; } @@ -52,13 +52,8 @@ float3 IntersectionZPlane(float3 B, float z_dist) float2 texcoordMax = (groupId.xy + 1) * clusterSize; float2 texcoordMin = groupId.xy * clusterSize; -#if !defined(VR) float3 maxPointVS = GetPositionVS(texcoordMax, 1.0f); float3 minPointVS = GetPositionVS(texcoordMin, 1.0f); -#else - float3 maxPointVS = max(GetPositionVS(texcoordMax, 1.0f, 0), GetPositionVS(texcoordMax, 1.0f, 1)); - float3 minPointVS = min(GetPositionVS(texcoordMin, 1.0f, 0), GetPositionVS(texcoordMin, 1.0f, 1)); -#endif // !VR float clusterNear = LightsNear * pow(abs(LightsFar / LightsNear), groupId.z / float(ClusterSize.z)); float clusterFar = LightsNear * pow(abs(LightsFar / LightsNear), (groupId.z + 1) / float(ClusterSize.z)); diff --git a/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl b/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl index 53ac13fc19..4cff80fd16 100644 --- a/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl +++ b/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl @@ -55,18 +55,10 @@ bool LightIntersectsCluster(float3 position, float radiusSquared, ClusterAABB cl float radiusSquared = light.radius * light.radius; -#if defined(VR) - float3 positionVSLeft = FrameBuffer::WorldToView(light.positionWS[0].xyz, true, 0); - float3 positionVSRight = FrameBuffer::WorldToView(light.positionWS[1].xyz, true, 1); - - [branch] if (LightIntersectsCluster(positionVSLeft, radiusSquared, cluster) || LightIntersectsCluster(positionVSRight, radiusSquared, cluster)) - { -#else - float3 positionVS = FrameBuffer::WorldToView(light.positionWS[0].xyz, true, 0); + float3 positionVS = FrameBuffer::WorldToView(light.positionWS[0].xyz); [branch] if (LightIntersectsCluster(positionVS, radiusSquared, cluster)) { -#endif visibleLightIndices[visibleLightCount] = i; visibleLightCount++; if (visibleLightCount >= MAX_CLUSTER_LIGHTS) diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/blur.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/blur.cs.hlsl index 46e34b175e..92e37d802c 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/blur.cs.hlsl +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/blur.cs.hlsl @@ -6,7 +6,6 @@ #include "Common/GBuffer.hlsli" #include "Common/Math.hlsli" #include "Common/Random.hlsli" -#include "Common/VR.hlsli" #include "ScreenSpaceGI/common.hlsli" Texture2D srcDepth : register(t0); @@ -98,14 +97,13 @@ float2x2 getRotationMatrix(float noise) const uint numSamples = 8; const float2 uv = (dtid + .5) * RCP_OUT_FRAME_DIM; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - const float2 screenPos = Stereo::ConvertFromStereoUV(uv, eyeIndex); + const float2 screenPos = uv; float depth = READ_DEPTH(srcDepth, dtid); - float3 pos = ScreenToViewPosition(screenPos, depth, eyeIndex); + float3 pos = ScreenToViewPosition(screenPos, depth); float3 normal = GBuffer::DecodeNormal(FULLRES_LOAD(srcNormalRoughness, dtid, uv, samplerLinearClamp).xy); - const float2 pixelDirRBViewspaceSizeAtCenterZ = depth.xx * (eyeIndex == 0 ? NDCToViewMul.xy : NDCToViewMul.zw) * RCP_OUT_FRAME_DIM; + const float2 pixelDirRBViewspaceSizeAtCenterZ = depth.xx * NDCToViewMul.xy * RCP_OUT_FRAME_DIM; const float worldRadius = radius * pixelDirRBViewspaceSizeAtCenterZ.x; float2x3 TvBv = getKernelBasis(normal, normal); // D = N float halfAngle = Math::HALF_PI; @@ -130,30 +128,18 @@ float2x2 getRotationMatrix(float noise) float2 poissonOffset = g_Poisson8[i].xy; - // Project viewspace blur offset to screen. In VR, if the sample leaves the - // current eye, try the other eye for cross-eye consistency at the seam. - // Shi, Billeter, Eisemann 2022, "Stereo-consistent screen-space ambient occlusion" float3 viewSamplePos = pos + TvBv[0] * poissonOffset.x + TvBv[1] * poissonOffset.y; - float2 screenPosSample = FrameBuffer::ViewToUV(viewSamplePos, true, eyeIndex); - uint sampleEyeIndex = eyeIndex; + float2 screenPosSample = FrameBuffer::ViewToUV(viewSamplePos); if (any(screenPosSample < 0) || any(screenPosSample > 1)) { -#ifdef VR - float3 worldSamplePos = FrameBuffer::ViewToWorld(viewSamplePos, true, eyeIndex); - screenPosSample = FrameBuffer::ViewToUV(FrameBuffer::WorldToView(worldSamplePos, true, 1 - eyeIndex), true, 1 - eyeIndex); - sampleEyeIndex = 1 - eyeIndex; - if (any(screenPosSample < 0) || any(screenPosSample > 1)) -#endif continue; } - float2 uvSample = Stereo::ConvertToStereoUV(screenPosSample, sampleEyeIndex); + float2 uvSample = screenPosSample; uvSample = (floor(uvSample * OUT_FRAME_DIM) + 0.5) * RCP_OUT_FRAME_DIM; // Snap to the pixel centre float depthSample = srcDepth.SampleLevel(samplerPointClamp, uvSample * frameScale, RES_MIP); - float3 posSample = ScreenToViewPosition(screenPosSample, depthSample, sampleEyeIndex); - if (sampleEyeIndex != eyeIndex) - posSample = FrameBuffer::WorldToView(FrameBuffer::ViewToWorld(posSample, true, sampleEyeIndex), true, eyeIndex); + float3 posSample = ScreenToViewPosition(screenPosSample, depthSample); float4 normalRoughnessSample = srcNormalRoughness.SampleLevel(samplerPointClamp, uvSample * frameScale, 0); float3 normalSample = GBuffer::DecodeNormal(normalRoughnessSample.xy); diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli b/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli index 8abea7831f..d87adfb493 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli @@ -116,13 +116,10 @@ float4 filterInf(float4 v) { return float4(filterInf(v.x), filterInf(v.y), filte /////////////////////////////////////////////////////////////////////////////// // Inputs are screen XY and viewspace depth, output is viewspace position -float3 ScreenToViewPosition(const float2 screenPos, const float viewspaceDepth, const uint eyeIndex) +float3 ScreenToViewPosition(const float2 screenPos, const float viewspaceDepth) { - const float2 _mul = eyeIndex == 0 ? NDCToViewMul.xy : NDCToViewMul.zw; - const float2 _add = eyeIndex == 0 ? NDCToViewAdd.xy : NDCToViewAdd.zw; - float3 ret; - ret.xy = (_mul * screenPos.xy + _add) * viewspaceDepth; + ret.xy = (NDCToViewMul.xy * screenPos.xy + NDCToViewAdd.xy) * viewspaceDepth; ret.z = viewspaceDepth; return ret; } diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl index d04b4caa7b..28c4aea445 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl @@ -31,7 +31,6 @@ #include "Common/GBuffer.hlsli" #include "Common/Math.hlsli" #include "Common/Spherical Harmonics/SphericalHarmonics.hlsli" -#include "Common/VR.hlsli" #include "ScreenSpaceGI/common.hlsli" Texture2D srcWorkingDepth : register(t0); @@ -89,8 +88,7 @@ void CalculateGI( { const float2 frameScale = FrameDim * RcpTexDim; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - float2 normalizedScreenPos = Stereo::ConvertFromStereoUV(uv, eyeIndex); + float2 normalizedScreenPos = uv; const float rcpNumSlices = rcp((float)NumSlices); const float rcpNumSteps = rcp((float)NumSteps); @@ -98,7 +96,7 @@ void CalculateGI( // if the offset is under approx pixel size (pixelTooCloseThreshold), push it out to the minimum distance const float pixelTooCloseThreshold = 1.3; // approx viewspace pixel size at pixCoord; approximation of NDCToViewspace( uv.xy + ViewportSize.xy, pixCenterPos.z ).xy - pixCenterPos.xy; - const float2 pixelDirRBViewspaceSizeAtCenterZ = viewspaceZ.xx * (eyeIndex == 0 ? NDCToViewMul.xy : NDCToViewMul.zw) * RCP_OUT_FRAME_DIM; + const float2 pixelDirRBViewspaceSizeAtCenterZ = viewspaceZ.xx * NDCToViewMul.xy * RCP_OUT_FRAME_DIM; float screenspaceRadius = EffectRadius / pixelDirRBViewspaceSizeAtCenterZ.x; screenspaceRadius = max(MinScreenRadius, screenspaceRadius); @@ -116,7 +114,7 @@ void CalculateGI( ////////////////////////////////////////////////////////////////// - const float3 pixCenterPos = ScreenToViewPosition(normalizedScreenPos, viewspaceZ, eyeIndex); + const float3 pixCenterPos = ScreenToViewPosition(normalizedScreenPos, viewspaceZ); const float3 viewVec = normalize(-pixCenterPos); #ifdef GI_SPECULAR const float NoV = clamp(dot(viewVec, viewspaceNormal), 1e-5, 1); @@ -186,11 +184,7 @@ void CalculateGI( float2 samplePxCoord = dtid + .5 + sampleOffset * sideSign; float2 sampleUV = samplePxCoord * RCP_OUT_FRAME_DIM; - // Resolve which eye owns this sample. In VR, radial steps can cross the - // eye boundary in the side-by-side buffer; re-decode with the correct eye. - // Shi, Billeter, Eisemann 2022, "Stereo-consistent screen-space ambient occlusion" - uint sampleEyeIndex = Stereo::GetEyeIndexFromTexCoord(sampleUV); - float2 sampleScreenPos = Stereo::ConvertFromStereoUV(sampleUV, sampleEyeIndex); + float2 sampleScreenPos = sampleUV; [branch] if (any(sampleScreenPos > 1.0) || any(sampleScreenPos < 0.0)) continue; // Mip level grows with pixel-space distance from the centre. @@ -210,16 +204,9 @@ void CalculateGI( float SZ = srcWorkingDepth.SampleLevel(samplerPointClamp, sampleUV * frameScale, mipLevel); // Reconstruct sample in current eye's viewspace for correct horizon angles. - float3 samplePos = ScreenToViewPosition(sampleScreenPos, SZ, sampleEyeIndex); + float3 samplePos = ScreenToViewPosition(sampleScreenPos, SZ); // For cross-eye samples, reject if the depth differs too much from the // center pixel -- the other eye may see a different surface due to occlusion. -#if defined(VR) - if (sampleEyeIndex != eyeIndex) { - if (abs(SZ - viewspaceZ) > viewspaceZ * 0.1) - continue; - samplePos = FrameBuffer::WorldToView(FrameBuffer::ViewToWorld(samplePos, true, sampleEyeIndex), true, eyeIndex); - } -#endif float3 sampleDelta = samplePos - pixCenterPos; float3 sampleHorizonVec = normalize(sampleDelta); @@ -276,7 +263,7 @@ void CalculateGI( frontBackMult = frontBackMult < 0 ? 0.0 : frontBackMult; // backface if (frontBackMult > 0.f) { - float3 sampleHorizonVecWS = normalize(mul(FrameBuffer::CameraViewInverse[eyeIndex], half4(sampleHorizonVec, 0)).xyz); + float3 sampleHorizonVecWS = normalize(mul(FrameBuffer::CameraViewInverse, half4(sampleHorizonVec, 0)).xyz); float3 sampleRadiance = srcRadiance.SampleLevel(samplerPointClamp, sampleUV * OUT_FRAME_SCALE, mipLevelRadiance).rgb * frontBackMult * giBoost * countbits(validBits) * 0.03125; sampleRadiance = max(sampleRadiance, 0); @@ -347,14 +334,13 @@ void CalculateGI( uint2 pxCoord = dtid; float2 uv = (pxCoord + .5) * RCP_OUT_FRAME_DIM; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); float viewspaceZ = READ_DEPTH(srcWorkingDepth, pxCoord); float2 normalSample = FULLRES_LOAD(srcNormal, pxCoord, uv * OUT_FRAME_SCALE, samplerLinearClamp); float3 viewspaceNormal = GBuffer::DecodeNormal(normalSample); - half2 encodedWorldNormal = GBuffer::EncodeNormal(ViewToWorldVector(viewspaceNormal, FrameBuffer::CameraViewInverse[eyeIndex])); + half2 encodedWorldNormal = GBuffer::EncodeNormal(ViewToWorldVector(viewspaceNormal, FrameBuffer::CameraViewInverse)); outPrevGeo[pxCoord] = half3(viewspaceZ, encodedWorldNormal); // Move center pixel slightly towards camera to avoid imprecision artifacts due to depth buffer imprecision; offset depends on depth texture format used diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/prefilterDepths.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/prefilterDepths.cs.hlsl index 62ae96f1ec..442ce5a87d 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/prefilterDepths.cs.hlsl +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/prefilterDepths.cs.hlsl @@ -27,10 +27,6 @@ RWTexture2D outDepth4 : register(u4); // is required to be non-linear (i.e. very large outdoors environments). float ClampDepth(float depth) { -#ifdef VR - if (depth == 0.0) // VR 0 indicates a mask - return 0.0; -#endif depth = ScreenToViewDepth(depth); return clamp(depth, 0.0, 3.402823466e+38); } diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl index d0fc087d63..2b188e533b 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl @@ -2,7 +2,6 @@ #include "Common/FrameBuffer.hlsli" #include "Common/GBuffer.hlsli" #include "Common/Math.hlsli" -#include "Common/VR.hlsli" #include "ScreenSpaceGI/common.hlsli" Texture2D srcDiffuse : register(t0); @@ -28,11 +27,11 @@ RWTexture2D outRemappedPrevGISpecular : register(u5); #endif void readHistory( - uint eyeIndex, float curr_depth, float3 curr_pos, int2 pixCoord, float bilinear_weight, + float curr_depth, float3 curr_pos, int2 pixCoord, float bilinear_weight, inout half prev_ao, inout half4 prev_y, inout half2 prev_co_cg, inout half3 prev_ambient, inout float accum_frames, inout half4 prev_gi_specular, inout float wsum) { const float2 uv = (pixCoord + .5) * RCP_OUT_FRAME_DIM; - const float2 screen_pos = Stereo::ConvertFromStereoUV(uv, eyeIndex); + const float2 screen_pos = uv; if (any(screen_pos < 0) || any(screen_pos > 1)) return; @@ -43,12 +42,12 @@ void readHistory( // Early reject: skip bilinear taps on a different surface before the // expensive world-space reconstruction. Use a wider threshold than the // world-space check to avoid rejecting valid taps displaced by parallax - // (e.g. VR head rotation). + // (e.g. camera rotation). if (abs(curr_depth - prev_depth) > curr_depth * DepthDisocclusion * 3) return; - float3 prev_pos = ScreenToViewPosition(screen_pos, prev_depth, eyeIndex); - prev_pos = ViewToWorldPosition(prev_pos, PrevInvViewMat[eyeIndex]) + FrameBuffer::CameraPreviousPosAdjust[eyeIndex].xyz; + float3 prev_pos = ScreenToViewPosition(screen_pos, prev_depth); + prev_pos = ViewToWorldPosition(prev_pos, PrevInvViewMat[0]) + FrameBuffer::CameraPreviousPosAdjust.xyz; float3 delta_pos = curr_pos - prev_pos; // float normal_prod = dot(curr_normal, prev_normal); @@ -75,14 +74,13 @@ void readHistory( const float2 frameScale = FrameDim * RcpTexDim; const float2 uv = (pixCoord + .5) * RCP_OUT_FRAME_DIM; - const uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - const float2 screen_pos = Stereo::ConvertFromStereoUV(uv, eyeIndex); + const float2 screen_pos = uv; float2 prev_screen_pos = screen_pos; #ifdef REPROJECTION prev_screen_pos += FULLRES_LOAD(srcMotionVec, pixCoord, uv * frameScale, samplerLinearClamp).xy; #endif - float2 prev_uv = Stereo::ConvertToStereoUV(prev_screen_pos, eyeIndex); + float2 prev_uv = prev_screen_pos; half3 prev_ambient = 0; half prev_ao = 0; @@ -105,24 +103,24 @@ void readHistory( #ifdef REPROJECTION if ((curr_depth <= DepthFadeRange.y) && !(any(prev_screen_pos < 0) || any(prev_screen_pos > 1))) { // float3 curr_normal = GBuffer::DecodeNormal(srcCurrNormal[pixCoord]); - // curr_normal = ViewToWorldVector(curr_normal, FrameBuffer::CameraViewInverse[eyeIndex]); - float3 curr_pos = ScreenToViewPosition(screen_pos, curr_depth, eyeIndex); - curr_pos = ViewToWorldPosition(curr_pos, FrameBuffer::CameraViewInverse[eyeIndex]) + FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + // curr_normal = ViewToWorldVector(curr_normal, FrameBuffer::CameraViewInverse); + float3 curr_pos = ScreenToViewPosition(screen_pos, curr_depth); + curr_pos = ViewToWorldPosition(curr_pos, FrameBuffer::CameraViewInverse) + FrameBuffer::CameraPosAdjust.xyz; float2 prev_px_coord = prev_uv * OUT_FRAME_DIM; int2 prev_px_lu = floor(prev_px_coord - 0.5); float2 bilinear_weights = prev_px_coord - 0.5 - prev_px_lu; - readHistory(eyeIndex, curr_depth, curr_pos, + readHistory(curr_depth, curr_pos, prev_px_lu, (1 - bilinear_weights.x) * (1 - bilinear_weights.y), prev_ao, prev_y, prev_co_cg, prev_ambient, accum_frames, prev_gi_specular, wsum); - readHistory(eyeIndex, curr_depth, curr_pos, + readHistory(curr_depth, curr_pos, prev_px_lu + int2(1, 0), bilinear_weights.x * (1 - bilinear_weights.y), prev_ao, prev_y, prev_co_cg, prev_ambient, accum_frames, prev_gi_specular, wsum); - readHistory(eyeIndex, curr_depth, curr_pos, + readHistory(curr_depth, curr_pos, prev_px_lu + int2(0, 1), (1 - bilinear_weights.x) * bilinear_weights.y, prev_ao, prev_y, prev_co_cg, prev_ambient, accum_frames, prev_gi_specular, wsum); - readHistory(eyeIndex, curr_depth, curr_pos, + readHistory(curr_depth, curr_pos, prev_px_lu + int2(1, 1), bilinear_weights.x * bilinear_weights.y, prev_ao, prev_y, prev_co_cg, prev_ambient, accum_frames, prev_gi_specular, wsum); diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/stereoSync.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/stereoSync.cs.hlsl deleted file mode 100644 index 365e50236f..0000000000 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/stereoSync.cs.hlsl +++ /dev/null @@ -1,122 +0,0 @@ -// Stereo Sync - Bilateral blend of SSGI buffers between eyes -// -// Reprojects each pixel to the other eye and blends AO/IL based on depth -// agreement. Runs after the SSGI blur to reduce per-eye GI disparities. -// -// Based on: Shi, Billeter, Eisemann 2022, "Stereo-consistent screen-space -// ambient occlusion" https://eprints.whiterose.ac.uk/id/eprint/187713/ - -#include "Common/FrameBuffer.hlsli" -#include "Common/VR.hlsli" -#include "ScreenSpaceGI/common.hlsli" - -#ifdef VR - -Texture2D srcDepth : register(t0); -Texture2D srcAo : register(t1); -Texture2D srcIlY : register(t2); -Texture2D srcIlCoCg : register(t3); - -RWTexture2D outAo : register(u0); -RWTexture2D outIlY : register(u1); -RWTexture2D outIlCoCg : register(u2); - -static const float kDepthSigma = 0.01; // Bilateral depth tolerance (NDC): surfaces within this range are considered the same and blended -static const float kMaxBlend = 0.5; // Maximum stereo blend weight; 0.5 gives equal weighting between eyes -static const float kEdgeRelThreshold = 0.5; // Relative linear-depth difference above which a pixel is a depth discontinuity (50% change) -static const float kMaskDepth = 0.01; // Linear depth sentinel: values below this are outside the HMD lens area -static const int kEdgeMargin = 2; // Neighbor offset (pixels) for destination edge + mask boundary check - -// Writes all output channels from the source buffers (passthrough / no-blend path). -void Passthrough(uint2 dtid) -{ - outAo[dtid] = srcAo[dtid]; - outIlY[dtid] = srcIlY[dtid]; - outIlCoCg[dtid] = srcIlCoCg[dtid]; -} - -// Samples four depth neighbors in a cross pattern (±step.x, ±step.y) around centerUV, -// scaled by texScale to map from output UV space to texture sample coords. -// centerUV is clamped to eyeIndex's half of the stereo buffer before offsetting -// to prevent neighbor reads from crossing the x=0.5 seam into the other eye. -float4 SampleCrossDepths(float2 centerUV, float2 step, float2 texScale, uint eyeIndex) -{ - float2 uv = Stereo::ClampToEyeUV(centerUV, eyeIndex); - return float4( - srcDepth.SampleLevel(samplerPointClamp, (uv + float2(step.x, 0)) * texScale, RES_MIP), - srcDepth.SampleLevel(samplerPointClamp, (uv + float2(-step.x, 0)) * texScale, RES_MIP), - srcDepth.SampleLevel(samplerPointClamp, (uv + float2(0, step.y)) * texScale, RES_MIP), - srcDepth.SampleLevel(samplerPointClamp, (uv + float2(0, -step.y)) * texScale, RES_MIP)); -} - -[numthreads(8, 8, 1)] void main(uint2 dtid : SV_DispatchThreadID) { - const float2 outFrameDim = OUT_FRAME_DIM; - if (any(dtid >= uint2(outFrameDim))) - return; - - const float2 frameScale = FrameDim * RcpTexDim; - float2 uv = (dtid + 0.5) / outFrameDim; - - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - - // SSGI working depth is linear view-space Z. - // 0.0 = mask (outside lens area). FP_Z = first-person hands threshold (~18.0). - float depth = srcDepth.SampleLevel(samplerPointClamp, uv * frameScale, RES_MIP); - if (depth < FP_Z) { - Passthrough(dtid); - return; - } - - // Source edge detection: skip stereo sync at depth discontinuities. - // Uses a relative threshold since depth is linear view-space (not NDC). - // Placed before rawDepth conversion and reprojection to save VP matrix work - // for edge pixels. - float2 pixelStep = 1.0 / outFrameDim; - float4 srcNeighborDepths = SampleCrossDepths(uv, pixelStep, frameScale, eyeIndex); - if (Stereo::MaxDepthDiff(depth, srcNeighborDepths) / max(depth, 1.0) > kEdgeRelThreshold) { - Passthrough(dtid); - return; - } - - // Convert linear depth to raw depth (NDC Z) for reprojection matrix math. - // raw = (CameraData.x - CameraData.w / depth) / CameraData.z - // where x=n*f, w=f, z=f-n - float rawDepth = (SharedData::CameraData.x - SharedData::CameraData.w / depth) / SharedData::CameraData.z; - - Stereo::StereoBilateralResult r = Stereo::ReprojectToOtherEye(uv, rawDepth, eyeIndex, outFrameDim); - - if (!r.valid) { - Passthrough(dtid); - return; - } - - float otherLinearDepth = srcDepth.SampleLevel(samplerPointClamp, r.otherStereoUV * frameScale, RES_MIP); - if (otherLinearDepth < FP_Z) { - Passthrough(dtid); - return; - } - - // Destination edge detection: skip if the reprojected pixel is near the HMD mask - // boundary or at a depth discontinuity in the other eye. Due to VR parallax the - // arm silhouette appears at a different screen position per eye, so the reprojection - // can cross a boundary invisible from this eye's perspective. - float2 marginStep = float(kEdgeMargin) / outFrameDim; - float4 otherNeighborDepths = SampleCrossDepths(r.otherStereoUV, marginStep, frameScale, 1 - eyeIndex); - if (any(otherNeighborDepths < kMaskDepth) || - Stereo::MaxDepthDiff(otherLinearDepth, otherNeighborDepths) / max(otherLinearDepth, 1.0) > kEdgeRelThreshold) { - Passthrough(dtid); - return; - } - - float otherRawDepth = (SharedData::CameraData.x - SharedData::CameraData.w / otherLinearDepth) / SharedData::CameraData.z; - - // Back-check disabled: source + destination edge detection covers the occlusion - // boundary cases it was guarding, saving 2 VP matrix multiplies per blended pixel. - Stereo::FinalizeStereoBlend(r, uv, rawDepth, otherRawDepth, eyeIndex, outFrameDim, kDepthSigma, kMaxBlend, 0.0); - - outAo[dtid] = lerp(srcAo[dtid], srcAo[r.otherPx], r.blendWeight); - outIlY[dtid] = lerp(srcIlY[dtid], srcIlY[r.otherPx], r.blendWeight); - outIlCoCg[dtid] = lerp(srcIlCoCg[dtid], srcIlCoCg[r.otherPx], r.blendWeight); -} - -#endif // VR diff --git a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/RaymarchCS.hlsl b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/RaymarchCS.hlsl index 17078de682..62971b5383 100644 --- a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/RaymarchCS.hlsl +++ b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/RaymarchCS.hlsl @@ -56,12 +56,7 @@ cbuffer PerFrame : register(b1) parameters.DynamicRes = DynamicRes; -#if defined(VR) - // Disabled in VR: depth bias causes subtle shadow shifting at stereo seams on camera motion. - parameters.UsePrecisionOffset = false; -#else parameters.UsePrecisionOffset = true; -#endif WriteScreenSpaceShadow(parameters, groupID, groupThreadID); } \ No newline at end of file diff --git a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/ScreenSpaceShadows.hlsli b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/ScreenSpaceShadows.hlsli index a1a6929c33..9f94e4c708 100644 --- a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/ScreenSpaceShadows.hlsli +++ b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/ScreenSpaceShadows.hlsli @@ -3,7 +3,7 @@ namespace ScreenSpaceShadows { Texture2D ScreenSpaceShadowsTexture : register(t45); - float GetScreenSpaceShadow(float3 screenPosition, float2 uv, float noise, uint eyeIndex) + float GetScreenSpaceShadow(float3 screenPosition, float2 uv, float noise) { return ScreenSpaceShadowsTexture.Load(int3(int2(screenPosition.xy + 0.5f), 0)).x; } diff --git a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/StereoSyncCS.hlsl b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/StereoSyncCS.hlsl deleted file mode 100644 index 47e88e9f90..0000000000 --- a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/StereoSyncCS.hlsl +++ /dev/null @@ -1,169 +0,0 @@ -// Stereo Sync + Blur - Combined bilateral stereo blend and depth-weighted -// blur for VR screen-space shadows. Runs as a single compute pass after the -// raymarch to both synchronize shadow data between eyes and smooth per-pixel -// noise. -// -// Based on: Shi, Billeter, Eisemann 2022, "Stereo-consistent screen-space -// ambient occlusion" https://eprints.whiterose.ac.uk/id/eprint/187713/ - -#include "Common/FrameBuffer.hlsli" -#include "Common/Math.hlsli" -#include "Common/Random.hlsli" -#include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" - -#ifdef VR - -// Match the C++ depth binding format for strict typing. -// TERRAIN_BLENDING ON -> R32_FLOAT (no unorm). OFF -> R24_UNORM_X8_TYPELESS (unorm). -# if defined(TERRAIN_BLENDING) -Texture2D SrcDepthTexture : register(t0); -# else -Texture2D SrcDepthTexture : register(t0); -# endif -Texture2D SrcShadowTexture : register(t1); - -RWTexture2D OutShadowTexture : register(u0); - -cbuffer StereoSyncCB : register(b1) -{ - float2 FrameDim; - float2 RcpFrameDim; -}; - -static const float kDepthSigma = 0.01; // Bilateral depth tolerance (NDC): surfaces within this range are considered the same and blended -static const float kMaxBlend = 1.0; // Maximum stereo blend weight; reduce below 1.0 to soften the cross-eye contribution -static const float kEdgeDepthThreshold = 0.05; // NDC depth difference above which a pixel is considered a depth discontinuity and excluded from stereo sync -static const int kEdgeMargin = 2; // Neighbor offset (pixels) for destination edge + mask boundary check - -// Depth-weighted 4-sample blur using a rotated Poisson disk. -// Uses dtid hash for per-pixel rotation to break structured patterns. -float BlurShadow(int2 dtid, float centerDepth) -{ - // Per-pixel rotation from interleaved gradient noise - float noise = Random::InterleavedGradientNoise(float2(dtid)); - float angle = noise * Math::TAU; - float sn, cs; - sincos(angle, sn, cs); - float2x2 rot = float2x2(cs, sn, -sn, cs); - - static const float2 kOffsets[4] = { - float2(0.382, 0.892), - float2(0.491, 0.217), - float2(0.938, 0.735), - float2(0.009, 0.056), - }; - - float weight = 0; - float shadow = 0; - - [unroll] for (uint i = 0; i < 4; i++) - { - float2 offset = mul(kOffsets[i], rot); - int2 samplePx = dtid + int2(offset * 2.5); - samplePx = clamp(samplePx, int2(0, 0), int2(FrameDim) - 1); - - float sampleDepth = SrcDepthTexture[samplePx]; - - if (sampleDepth < 1e-5) - continue; - - float attenuation = 1.0 - saturate(100.0 * abs(sampleDepth - centerDepth) / max(centerDepth, 1e-5)); - - if (attenuation > 0.0) { - shadow += SrcShadowTexture[samplePx] * attenuation; - weight += attenuation; - } - } - - return weight > 0.0 ? shadow / weight : SrcShadowTexture[dtid]; -} - -// Samples four depth neighbors in a cross pattern (±offset pixels) around center, -// clamped to eyeIndex's half of the packed stereo buffer to avoid seam contamination. -float4 SampleCrossDepths(int2 center, int offset, uint eyeIndex) -{ - return float4( - SrcDepthTexture[Stereo::ClampToEyeBounds(center + int2(offset, 0), eyeIndex, FrameDim)], - SrcDepthTexture[Stereo::ClampToEyeBounds(center + int2(-offset, 0), eyeIndex, FrameDim)], - SrcDepthTexture[Stereo::ClampToEyeBounds(center + int2(0, offset), eyeIndex, FrameDim)], - SrcDepthTexture[Stereo::ClampToEyeBounds(center + int2(0, -offset), eyeIndex, FrameDim)]); -} - -[numthreads(8, 8, 1)] void main(uint2 dtid : SV_DispatchThreadID) { - if (any(dtid >= uint2(FrameDim))) - return; - - float2 uv = (dtid + 0.5) * RcpFrameDim; - - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - - float depth = SrcDepthTexture[dtid]; - - // depth == 0: VR HMD mask; depth == 1: sky/far plane - if (depth < 1e-5 || depth >= 1.0) { - OutShadowTexture[dtid] = SrcShadowTexture[dtid]; - return; - } - - // Skip stereo sync for first-person geometry interior (hands/weapons). - // Placed before the blur: arm shadow is uniform so the bilateral blur - // would return SrcShadowTexture[dtid] unchanged anyway. - float linearDepth = SharedData::GetScreenDepth(depth); - if (linearDepth < VR_FP_Z) { - OutShadowTexture[dtid] = SrcShadowTexture[dtid]; - return; - } - - // Skip stereo sync at depth discontinuities (arm/world silhouettes, object edges). - // Placed before the blur: the bilateral depth weighting zeroes out cross-edge - // samples, so the blur collapses to SrcShadowTexture[dtid] at these pixels anyway. - float4 edgeDepths = SampleCrossDepths(dtid, 1, eyeIndex); - if (Stereo::MaxDepthDiff(depth, edgeDepths) > kEdgeDepthThreshold) { - OutShadowTexture[dtid] = SrcShadowTexture[dtid]; - return; - } - - // Depth-weighted blur on this eye's shadow data. - // Only reached by world pixels that will attempt stereo sync. - float myShadow = BlurShadow(dtid, depth); - - Stereo::StereoBilateralResult r = Stereo::ReprojectToOtherEye(uv, depth, eyeIndex, FrameDim); - - if (!r.valid) { - OutShadowTexture[dtid] = myShadow; - return; - } - - float otherDepth = SrcDepthTexture[r.otherPx]; - - // Skip if other eye sees mask, sky, or first-person geometry - if (otherDepth < 1e-5 || otherDepth >= 1.0 || SharedData::GetScreenDepth(otherDepth) < VR_FP_Z) { - OutShadowTexture[dtid] = myShadow; - return; - } - - // Reject if reprojected pixel is near the HMD mask boundary, or if it sits - // at a depth discontinuity in the other eye. The source-side edge check above - // only fires when *this* eye sees the boundary; due to VR parallax the arm - // silhouette appears at a different screen position in each eye, so the - // reprojection can cross a boundary invisible from this eye's perspective. - // Reusing the same four neighbor reads covers both purposes at no extra cost. - float4 otherNeighbors = SampleCrossDepths(r.otherPx, kEdgeMargin, 1 - eyeIndex); - if (any(otherNeighbors < 1e-5) || Stereo::MaxDepthDiff(otherDepth, otherNeighbors) > kEdgeDepthThreshold) { - OutShadowTexture[dtid] = myShadow; - return; - } - - // Source + destination edge detection - Stereo::FinalizeStereoBlend(r, uv, depth, otherDepth, eyeIndex, FrameDim, kDepthSigma, kMaxBlend, 0.0); - - float otherShadow = SrcShadowTexture[r.otherPx]; - - // Use min (darkest) when depths agree: if either eye detected an - // occluder, that shadow should be visible. - float combined = min(myShadow, otherShadow); - OutShadowTexture[dtid] = lerp(myShadow, combined, r.blendWeight); -} - -#endif // VR diff --git a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/bend_sss_gpu.hlsli b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/bend_sss_gpu.hlsli index 832f578fc3..5ca905514a 100644 --- a/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/bend_sss_gpu.hlsli +++ b/features/Screen-Space Shadows/Shaders/ScreenSpaceShadows/bend_sss_gpu.hlsli @@ -253,35 +253,8 @@ void WriteScreenSpaceShadow(DispatchParameters inParameters, int3 inGroupID, int half2 coord = read_xy * inParameters.InvDepthTextureSize * inParameters.DynamicRes; half2 coord_with_offset = (read_xy + offset_xy) * inParameters.InvDepthTextureSize * inParameters.DynamicRes; -#if defined(VR) - // VR side-by-side: halve x to map stereo pixel coords to texture UV. - coord *= half2(0.5, 1.0); - coord_with_offset *= half2(0.5, 1.0); - -# if defined(RIGHT) - // Right eye: valid UV range is [0.5*DynRes.x, DynRes.x] - bool coord_out_of_eye = coord.x < 0.5 * inParameters.DynamicRes.x; - bool coord_offset_out_of_eye = coord_with_offset.x < 0.5 * inParameters.DynamicRes.x; -# else - // Left eye: valid UV range is [0.0, 0.5*DynRes.x) - bool coord_out_of_eye = coord.x >= 0.5 * inParameters.DynamicRes.x; - bool coord_offset_out_of_eye = coord_with_offset.x >= 0.5 * inParameters.DynamicRes.x; -# endif - - // Clamp cross-eye depth reads to FarDepthValue (1.0) so rays near the SBS center - // seam see no occluder at the boundary. Shadow weakens by ~1 pixel at the seam but - // stays temporally stable across camera movement. - depths.x = coord_out_of_eye ? 1.0 : inParameters.DepthTexture.SampleLevel(inParameters.PointBorderSampler, coord, 0); - depths.y = coord_offset_out_of_eye ? 1.0 : inParameters.DepthTexture.SampleLevel(inParameters.PointBorderSampler, coord_with_offset, 0); - - // HMD mask: depth==0 is outside the visible lens area. Remap to FarDepthValue so - // mask pixels do not cast false shadows. - depths.x = lerp(depths.x, 1.0, (float)(depths.x == 0)); // Stencil area - depths.y = lerp(depths.y, 1.0, (float)(depths.y == 0)); // Stencil area -#else depths.x = inParameters.DepthTexture.SampleLevel(inParameters.PointBorderSampler, coord, 0); depths.y = inParameters.DepthTexture.SampleLevel(inParameters.PointBorderSampler, coord_with_offset, 0); -#endif // Depth thresholds (bilinear/shadow thickness) are based on a fractional ratio of the difference between sampled depth and the far clip depth static const half kDepthThicknessFloor = 1e-4h; // Prevents division by zero in depth_scale when depth is at the far clip plane @@ -332,19 +305,6 @@ void WriteScreenSpaceShadow(DispatchParameters inParameters, int3 inGroupID, int // Sync wavefronts now groupshared DepthData is written GroupMemoryBarrierWithGroupSync(); -#if defined(VR) - // Check if the pixel we're writing to is on the correct eye side - half writeX = write_xy.x * inParameters.InvDepthTextureSize.x; - -# if defined(RIGHT) - if (writeX < 0.0) - return; -# else - if (writeX > 1.0) - return; -# endif -#endif - half start_depth = sampling_depth[0]; if (start_depth == 0.0 || start_depth == 1.0) diff --git a/features/Subsurface Scattering/Shaders/SubsurfaceScattering/Burley.hlsli b/features/Subsurface Scattering/Shaders/SubsurfaceScattering/Burley.hlsli index 6fb969ff35..39281513cb 100644 --- a/features/Subsurface Scattering/Shaders/SubsurfaceScattering/Burley.hlsli +++ b/features/Subsurface Scattering/Shaders/SubsurfaceScattering/Burley.hlsli @@ -48,7 +48,7 @@ float3 GetScalingFactor(float3 albedo) return 3.5f + 100.f * pow(abs(value), 4); } -float4 BurleyNormalizedSS(uint2 DTid, float2 texCoord, uint eyeIndex, float sssAmount, bool humanProfile) +float4 BurleyNormalizedSS(uint2 DTid, float2 texCoord, float sssAmount, bool humanProfile) { float centerDepth = SharedData::GetScreenDepth(DepthTexture[DTid].x); @@ -71,7 +71,7 @@ float4 BurleyNormalizedSS(uint2 DTid, float2 texCoord, uint eyeIndex, float sssA float3 d3d = diffuseMeanFreePath.xyz * dmfpForSampling / s3d; const float3 normalVS = GBuffer::DecodeNormal(NormalTexture[DTid].xy); - const float3 normalWS = normalize(mul(FrameBuffer::CameraViewInverse[eyeIndex], float4(normalVS, 0)).xyz); + const float3 normalWS = normalize(mul(FrameBuffer::CameraViewInverse, float4(normalVS, 0)).xyz); float3 weightSum = 0.0f; float3 colorSum = 0.0f; @@ -115,7 +115,7 @@ float4 BurleyNormalizedSS(uint2 DTid, float2 texCoord, uint eyeIndex, float sssA float3 sampleColor = ColorTexture[samplePixcoord].xyz * maskSample; float sampleDepth = SharedData::GetScreenDepth(DepthTexture[samplePixcoord].x); float3 sampleNormalVS = GBuffer::DecodeNormal(NormalTexture[samplePixcoord].xy); - float3 sampleNormalWS = normalize(mul(FrameBuffer::CameraViewInverse[eyeIndex], float4(sampleNormalVS, 0)).xyz); + float3 sampleNormalWS = normalize(mul(FrameBuffer::CameraViewInverse, float4(sampleNormalVS, 0)).xyz); float deltaDepth = (sampleDepth - centerDepth) * 10.f / GAME_UNIT_TO_CM; // convert to mm float radiusSampledInMM = sqrt(radius * radius + deltaDepth * deltaDepth); diff --git a/features/Subsurface Scattering/Shaders/SubsurfaceScattering/SeparableSSSCS.hlsl b/features/Subsurface Scattering/Shaders/SubsurfaceScattering/SeparableSSSCS.hlsl index e6457a05af..7b595fc74d 100644 --- a/features/Subsurface Scattering/Shaders/SubsurfaceScattering/SeparableSSSCS.hlsl +++ b/features/Subsurface Scattering/Shaders/SubsurfaceScattering/SeparableSSSCS.hlsl @@ -25,7 +25,6 @@ SamplerState PointSampler : register(s0); return; float2 texCoord = (DTid.xy + 0.5) * SharedData::BufferDim.zw; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(texCoord); #if defined(BURLEY) @@ -34,7 +33,7 @@ SamplerState PointSampler : register(s0); if (sssAmount > 0.0) { bool humanProfile = MaskTexture[DTid.xy].y > 0.0; - float4 color = BurleyNormalizedSS(DTid.xy, texCoord, eyeIndex, sssAmount, humanProfile); + float4 color = BurleyNormalizedSS(DTid.xy, texCoord, sssAmount, humanProfile); SSSRW[DTid.xy] = max(0, color); } diff --git a/features/Upscaling/Shaders/Upscaling/DepthRefractionUpscalePS.hlsl b/features/Upscaling/Shaders/Upscaling/DepthRefractionUpscalePS.hlsl index 2788b913cf..1a88fd3530 100644 --- a/features/Upscaling/Shaders/Upscaling/DepthRefractionUpscalePS.hlsl +++ b/features/Upscaling/Shaders/Upscaling/DepthRefractionUpscalePS.hlsl @@ -18,10 +18,6 @@ SamplerState LinearSampler : register(s0); Texture2D RefractionNormals : register(t0); Texture2D DepthTex : register(t1); -# if defined(VR) -Texture2D StencilTex : register(t2); -# endif - cbuffer JitterCB : register(b0) { float2 jitter; @@ -59,36 +55,14 @@ PS_OUTPUT main(PS_INPUT input) // Remove jitter offset to get the correct sampling coordinates float2 uv = originalUV - (jitter * SharedData::BufferDim.zw); - // Clamp within dynamic-resolution bounds (VR: preserve per-eye bounds). + // Clamp within dynamic-resolution bounds. uv = FrameBuffer::ClampDynamicResolutionAdjustedScreenPosition(uv, input.TexCoord); -# if defined(VR) - uint4 stencilSamples = StencilTex.GatherRed(LinearSampler, uv); - - // Choose the minimum stencil value - uint minStencil = min(min(stencilSamples.x, stencilSamples.y), min(stencilSamples.z, stencilSamples.w)); - - // Only write depth/stencil that is inside the viewable area - if (minStencil > 0x00) - discard; -# endif - // Upscale using linear sampling psout.RefractionNormals = RefractionNormals.SampleLevel(LinearSampler, uv, 0); psout.Depth = DepthTex.SampleLevel(LinearSampler, uv, 0); -# if defined(VR) - float bilinearDepth = psout.Depth; - if (useWideKernel > 0.5f) { - psout.Depth = SampleMinDepthWideGather(uv); - } else { - psout.Depth = SampleMinDepth2x2(uv); - } - // Keep SAO camera Z smooth to avoid over-occlusion; depth culling uses SV_Depth. - psout.SAOCameraZ = bilinearDepth; -# else psout.SAOCameraZ = psout.Depth; -# endif return psout; } diff --git a/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl b/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl index 34ea8250a8..4053b46106 100644 --- a/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl +++ b/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl @@ -2,8 +2,8 @@ cbuffer UpscalingData : register(b0) { - float2 TrueSamplingDim; // per-eye render dim in VR, full render dim otherwise - uint EyeOffsetX; // X offset into stereo source buffers; 0 for non-VR / left eye + float2 TrueSamplingDim; + uint EyeOffsetX; uint pad0; }; @@ -20,11 +20,11 @@ RWTexture2D DepthOutput : register(u3); #endif [numthreads(8, 8, 1)] void main(uint3 dispatchID : SV_DispatchThreadID) { - // Bounds check in per-eye space; EyeOffsetX=0 makes this identical to the old path for non-VR + // Bounds check if (any(dispatchID.xy >= uint2(TrueSamplingDim))) return; - // All source reads are in full stereo space; outputs are 0-based (per-eye or full-frame) + // All source reads use offset; outputs are 0-based uint2 srcCoord = dispatchID.xy + uint2(EyeOffsetX, 0); float2 taaMask = TAAMask[srcCoord]; @@ -45,12 +45,11 @@ RWTexture2D DepthOutput : register(u3); { int2 samplePos = int2(dispatchID.xy) + int2(x, y); - // Bounds check stays in per-eye space — prevents cross-eye contamination in VR - // and out-of-bounds reads in non-VR (EyeOffsetX=0 makes these equivalent) + // Bounds check if (any(samplePos < 0) || any(samplePos >= int2(TrueSamplingDim))) continue; - // Source read uses full stereo offset + // Source read uses offset int2 srcPos = samplePos + int2(EyeOffsetX, 0); float neighborDepth = DepthMask[srcPos]; @@ -74,7 +73,7 @@ RWTexture2D DepthOutput : register(u3); #if defined(DEPTH_OUTPUT) // Copy depth as R32_FLOAT so FSR DX11 backend receives a typed format. - // The raw depth resource is R24G8_TYPELESS in VR which maps to FFX_SURFACE_FORMAT_UNKNOWN. + // The raw depth resource is R24G8_TYPELESS which maps to FFX_SURFACE_FORMAT_UNKNOWN. DepthOutput[dispatchID.xy] = DepthMask[srcCoord]; #endif diff --git a/features/Upscaling/Shaders/Upscaling/UnderwaterMaskUpscalePS.hlsl b/features/Upscaling/Shaders/Upscaling/UnderwaterMaskUpscalePS.hlsl index 213ccd6931..37386b8438 100644 --- a/features/Upscaling/Shaders/Upscaling/UnderwaterMaskUpscalePS.hlsl +++ b/features/Upscaling/Shaders/Upscaling/UnderwaterMaskUpscalePS.hlsl @@ -15,9 +15,6 @@ struct PS_OUTPUT SamplerState LinearSampler : register(s0); Texture2D UnderwaterMask : register(t0); -# if defined(VR) -Texture2D SceneDepth : register(t1); -# endif cbuffer JitterCB : register(b0) { @@ -38,95 +35,6 @@ PS_OUTPUT main(PS_INPUT input) // Clamp within bounds uv = clamp(uv, 0.0, FrameBuffer::DynamicResolutionParams1.xy); -# if defined(VR) - // In VR the vanilla waterline draw (DrawIndexedInstanced, 2 instances) emits - // identical left-eye clip positions for both instances. The internal-res mask - // therefore only represents the left eye: the right-eye half of the buffer - // contains the tapered apex of the left-eye polygon, which is nearly all black. - // GetDynamicResolutionAdjustedScreenPosition then samples that black region for - // the right eye, making the entire right-eye underwater fog incorrect. - // - // Fix: reconstruct the mask analytically per-eye. For a horizontal water plane - // at height waterHeight, a pixel is "underwater" (mask = 1) when: - // - the camera itself is below the water surface, OR - // - the ray from the per-eye camera through this pixel points downward - // (rayDir.z < 0), meaning it looks below the water plane. - // This exactly reproduces what the vanilla waterline polygon approximates, - // but correctly per-eye. - - uint eyeIndex = (input.TexCoord.x >= 0.5) ? 1 : 0; - - // WaterData is a 5×5 grid centered on the camera; tile 12 (row 2, col 2) is - // always the camera's own tile. Pass eyeIndex so GetWaterData corrects the .w - // (water surface height) from eye-0 camera-relative Z into the current eye's frame. - // GetWaterData expects a camera-relative XY position; float3(0,0,0) is the camera - // itself, which always maps to the center tile (12). - float waterHeight = SharedData::GetWaterData(float3(0, 0, 0), eyeIndex).w; - - // Tile sentinel: try TESWaterSystem fallback. WaterSystemHeight is valid only when - // playerUnderwater == true (fully submerged); it is stored eye-0 camera-relative so - // the same per-eye correction as GetWaterData applies. - if (waterHeight <= WATER_HEIGHT_NO_TILE_SENTINEL) { - float sysHeight = SharedData::WaterSystemHeight; - if (sysHeight > WATER_HEIGHT_NO_TILE_SENTINEL) - waterHeight = sysHeight + FrameBuffer::CameraPosAdjust[0].z - FrameBuffer::CameraPosAdjust[eyeIndex].z; - } - - // GetWaterData returns INT_MIN (~-2.147e9) when the tile is outside the 5x5 grid. - if (waterHeight > WATER_HEIGHT_NO_TILE_SENTINEL) { - // Unpack from side-by-side stereo layout to per-eye UV [0, 1] - float2 eyeUV = float2(input.TexCoord.x * 2.0 - (float)eyeIndex, input.TexCoord.y); - - // Convert to NDC [-1, 1]. UV y=0 is the top of the screen; NDC y=+1 is the top. - float2 ndc = float2(eyeUV.x * 2.0 - 1.0, 1.0 - eyeUV.y * 2.0); - - // Sample depth using the shared de-jittered stereo UV (already DR-adjusted above). - // uv is in stereo space so no ConvertUVToSampleCoord round-trip is needed. - float depth = SceneDepth.Load(int3(uv * SharedData::BufferDim.xy, 0)).x; - - if (depth > EPSILON_DEPTH_SKY) { - // Geometry pixel: reconstruct world position from depth. - // CameraViewProjInverse[eyeIndex] maps clip-space back to the per-eye - // camera-relative world space. waterHeight has been adjusted to the same - // frame, so the comparison is correct for both eyes. - float4 worldPos = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], float4(ndc, depth, 1.0)); - worldPos /= worldPos.w; - // kSurfaceBias (Skyrim world units, ~1 unit ≈ 1.4 cm) anchors the mask - // threshold relative to the flat waterHeight plane to absorb wave-vertex - // displacement (measured max trough ≈ 2.92 units; 3.5 gives margin). - // - // The threshold direction depends on view orientation: - // Looking UP (worldPos.z > 0, pixel above camera in world space): - // Camera is below the surface viewing it from underneath. - // Expand threshold upward by +kSurfaceBias so the entire wave surface - // (crests and troughs alike) is included in the masked region. - // Looking DOWN (worldPos.z <= 0, pixel below or level with camera): - // The surface is seen from above or the camera is above water. - // Shrink threshold downward by -kSurfaceBias so the surface itself - // is excluded from the mask (no fog on the surface seen from above). - static const float kSurfaceBias = 3.5; - bool lookingUp = worldPos.z > 0.0; - bool cameraUnderwater = waterHeight > 0.0; - float threshold = (cameraUnderwater && lookingUp) ? waterHeight + kSurfaceBias : waterHeight - kSurfaceBias; - psout.UnderwaterMask = (worldPos.z < threshold) ? 1.0 : 0.0; - } else { - // depth <= EPSILON_DEPTH_SKY: sky / unrendered pixels (reversed-Z depth clear value). - // Unproject to obtain the per-pixel ray direction and decide based on that. - float4 worldFarPos = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], float4(ndc, 0.0, 1.0)); - worldFarPos /= worldFarPos.w; - float3 rayDir = normalize(worldFarPos.xyz); - // Per-eye waterHeight > 0 means the water surface is above THIS eye's camera - // (eye is below water); <= 0 means the eye camera is above the water surface. - psout.UnderwaterMask = (waterHeight > 0.0 || rayDir.z < 0.0) ? 1.0 : 0.0; - } - return psout; - } - // No water tile or system height available: fall through to the standard sampler path. - // The left-eye result from the vanilla mask is still accurate here; the right-eye - // will be approximate, but both sources failing implies no nearby water so the - // visual impact is nil. -# endif - // Upscale using linear sampling with jitter-corrected coordinates psout.UnderwaterMask = UnderwaterMask.SampleLevel(LinearSampler, uv, 0); diff --git a/features/VR/CORE b/features/VR/CORE deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/features/VR/Shaders/Features/VR.ini b/features/VR/Shaders/Features/VR.ini deleted file mode 100644 index 5dd39c9cbd..0000000000 --- a/features/VR/Shaders/Features/VR.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Info] -Version = 1-1-0 diff --git a/features/Volumetric Shadows/Shaders/VolumetricShadows/VolumetricShadows.hlsli b/features/Volumetric Shadows/Shaders/VolumetricShadows/VolumetricShadows.hlsli index cdfb339ba2..bf703beedf 100644 --- a/features/Volumetric Shadows/Shaders/VolumetricShadows/VolumetricShadows.hlsli +++ b/features/Volumetric Shadows/Shaders/VolumetricShadows/VolumetricShadows.hlsli @@ -57,17 +57,17 @@ namespace VolumetricShadows return shadow * rcpSampleCount; } - float GetVSMShadow3D(float3 startPosition, float3 endPosition, float noise, uint baseSampleCount, uint eyeIndex, out float surfaceShadow) + float GetVSMShadow3D(float3 startPosition, float3 endPosition, float noise, uint baseSampleCount, out float surfaceShadow) { DirectionalShadowLightData directionalShadowLightData = DirectionalShadowLights[0]; // View-space z — matches the linear cascade split distances from BSShadowDirectionalLight. float3 midPosition = (startPosition + endPosition) * 0.5; - float shadowMapDepth = SharedData::GetScreenDepth(FrameBuffer::GetShadowDepth(midPosition, eyeIndex)); + float shadowMapDepth = SharedData::GetScreenDepth(FrameBuffer::GetShadowDepth(midPosition)); // Cascade projections are world-space; positions come in camera-relative. - startPosition += FrameBuffer::CameraPosAdjust[eyeIndex].xyz; - endPosition += FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + startPosition += FrameBuffer::CameraPosAdjust.xyz; + endPosition += FrameBuffer::CameraPosAdjust.xyz; // Early out beyond cascade range if (shadowMapDepth >= directionalShadowLightData.EndSplitDistances.y) { @@ -130,11 +130,11 @@ namespace VolumetricShadows return ComputeVSM(moments, positionLS.z); } - float GetVSMShadow2D(float3 position, uint eyeIndex, out float detailedShadow) + float GetVSMShadow2D(float3 position, out float detailedShadow) { DirectionalShadowLightData directionalShadowLightData = DirectionalShadowLights[0]; - float shadowMapDepth = SharedData::GetScreenDepth(FrameBuffer::GetShadowDepth(position, eyeIndex)); + float shadowMapDepth = SharedData::GetScreenDepth(FrameBuffer::GetShadowDepth(position)); // Early out beyond cascade range if (shadowMapDepth >= directionalShadowLightData.EndSplitDistances.y) { @@ -146,7 +146,7 @@ namespace VolumetricShadows float fade = saturate(shadowMapDepth / directionalShadowLightData.EndSplitDistances.y); // Cascade projections are world-space; position comes in camera-relative. - float3 positionWS = position + FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + float3 positionWS = position + FrameBuffer::CameraPosAdjust.xyz; // Compute cascade blend factor with smoothstep float cascadeSelect = saturate((shadowMapDepth - directionalShadowLightData.StartSplitDistances.y) / (directionalShadowLightData.EndSplitDistances.x - directionalShadowLightData.StartSplitDistances.y)); diff --git a/features/Water Effects/Shaders/WaterEffects/WaterCaustics.hlsli b/features/Water Effects/Shaders/WaterEffects/WaterCaustics.hlsli index 7a9d793453..caa6b41bf9 100644 --- a/features/Water Effects/Shaders/WaterEffects/WaterCaustics.hlsli +++ b/features/Water Effects/Shaders/WaterEffects/WaterCaustics.hlsli @@ -23,7 +23,7 @@ namespace WaterEffects return lerp(center.xxx, dispersed, 0.5); } - float3 ComputeCaustics(float4 waterData, float3 worldPosition, uint eyeIndex) + float3 ComputeCaustics(float4 waterData, float3 worldPosition) { float causticsDistToWater = waterData.w - worldPosition.z; float shoreFactorCaustics = saturate(causticsDistToWater / 64.0); @@ -32,7 +32,7 @@ namespace WaterEffects float causticsFade = 1.0 - saturate(causticsDistToWater / 1024.0); causticsFade *= causticsFade; - float2 causticsUV = (worldPosition.xy + FrameBuffer::CameraPosAdjust[eyeIndex].xy) * 0.005; + float2 causticsUV = (worldPosition.xy + FrameBuffer::CameraPosAdjust.xy) * 0.005; float2 dispersionOffset = float2(0.6, 0.8) * (0.025 * shoreFactorCaustics * saturate(causticsDistToWater / 256.0)); float2 causticsUV1 = PanCausticsUV(causticsUV, 0.5 * 0.2, 1.0); diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/en.json b/package/SKSE/Plugins/CommunityShaders/Translations/en.json index 4d6b3de2dd..82afef5350 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/en.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/en.json @@ -546,7 +546,6 @@ "feature.cs_editor.wind_vs_player_tooltip_1": "- ~0° = Tailwind (wind behind player)", "feature.cs_editor.wind_vs_player_tooltip_2": "- ~±90° = Crosswind (left/right)", "feature.cs_editor.wind_vs_player_tooltip_3": "- ~±180° = Headwind (wind coming toward player)", - "feature.dynamic_cubemaps.advanced_vr_settings": "Advanced VR Settings", "feature.dynamic_cubemaps.color": "Color", "feature.dynamic_cubemaps.creator_info": "You must enable creator mode by adding the shader define CREATOR", "feature.dynamic_cubemaps.description": "Provides real-time environment mapping and reflections by generating dynamic cube maps that capture the surrounding environment, enabling realistic reflections on surfaces.", @@ -558,12 +557,11 @@ "feature.dynamic_cubemaps.key_feature_1": "Real-time environment capture for realistic reflections", "feature.dynamic_cubemaps.key_feature_2": "Dynamic cube map generation based on camera position", "feature.dynamic_cubemaps.key_feature_3": "Enhanced water reflections with environmental details", - "feature.dynamic_cubemaps.key_feature_4": "Support for both standard and VR rendering modes", + "feature.dynamic_cubemaps.key_feature_4": "Support for standard rendering modes", "feature.dynamic_cubemaps.key_feature_5": "Optimized cubemap inference and irradiance calculation", "feature.dynamic_cubemaps.name": "Dynamic Cubemaps", "feature.dynamic_cubemaps.roughness": "Roughness", "feature.dynamic_cubemaps.screen_space_reflections": "Screen Space Reflections", - "feature.dynamic_cubemaps.vr_restart_required": "A restart is required to enable in VR. Save Settings after enabling and restart the game.", "feature.exp_height_fog.apply_vanilla_fade": "Apply Vanilla Fade", "feature.exp_height_fog.apply_vanilla_fade_tooltip": "Applies vanilla fade brightness to exponential height fog.", "feature.exp_height_fog.cubemap_mip_level": "Cubemap Mip Level", @@ -1058,11 +1056,9 @@ "feature.screen_space_gi.toggles": "Toggles", "feature.screen_space_gi.vanilla_ssao": "Vanilla SSAO", "feature.screen_space_gi.vanilla_ssao_tooltip": "Enable Skyrim's built-in SSAO. Usually disabled when using SSGI to avoid double-darkening.", - "feature.screen_space_gi.vanilla_ssao_tooltip_vr": "Vanilla SSAO is not supported in VR.", "feature.screen_space_gi.view_resize": "View Resize", "feature.screen_space_gi.visual": "Visual", "feature.screen_space_gi.visual_il": "Visual - IL", - "feature.screen_space_gi.vr_warning": "\n\nWarning: In VR, this feature may have visual artifacts and can have a significant performance impact due to the nature of screen space effects.", "feature.screen_space_shadows.bilinear_threshold": "Bilinear Threshold", "feature.screen_space_shadows.bilinear_threshold_tooltip": "Depth threshold for edge detection during bilinear interpolation. Higher values smooth more aggressively across edges.", "feature.screen_space_shadows.description": "Screen Space Shadows enhances shadow quality by adding detailed contact shadows and improving shadow accuracy.\nThis technique adds fine-detail shadows that traditional shadow mapping might miss.", @@ -1081,8 +1077,6 @@ "feature.screen_space_shadows.shadow_contrast_tooltip": "Contrast boost for the shadow transition. Higher values produce harder shadow edges.", "feature.screen_space_shadows.surface_thickness": "Surface Thickness", "feature.screen_space_shadows.surface_thickness_tooltip": "Assumed thickness of surfaces for shadow detection. Lower values produce thinner, more precise shadows.", - "feature.screen_space_shadows.vr_stereo_sync": "VR Stereo Sync", - "feature.screen_space_shadows.vr_stereo_sync_tooltip": "Synchronizes shadow data between left and right eyes via bilateral reprojection and applies a depth-weighted blur to reduce per-eye noise. Uses min-blend so if either eye detects an occluder, the shadow is preserved. ", "feature.screenshot.apply_crop": "Apply crop", "feature.screenshot.async_note": "Capture and save run asynchronously without stalling the game.", "feature.screenshot.crop": "Crop", @@ -1096,7 +1090,7 @@ "feature.screenshot.name": "Screenshot", "feature.screenshot.open": "Open", "feature.screenshot.output": "Output", - "feature.screenshot.sdr_note": "Enable HDR Display to capture HDR PNG screenshots with HDR10 metadata. SDR and VR captures use the lossless format selected below.", + "feature.screenshot.sdr_note": "Enable HDR Display to capture HDR PNG screenshots with HDR10 metadata. SDR captures use the lossless format selected below.", "feature.screenshot.take_screenshot": "Take Screenshot Now", "feature.skin.a_multiplier_for_the_vanilla_specular_map_applied": "A multiplier for the vanilla specular map, applied to the first layer's roughness", "feature.skin.adds_a_constant_layer_of_wetness_to_all": "Adds a constant layer of wetness to all skin, making it look slightly damp or sweaty at all times, even when not in water or exerting effort.", @@ -1384,7 +1378,6 @@ "feature.upscaling.use_markers_to_optimize_tooltip_1": "Uses frame markers for tighter Reflex timing.", "feature.upscaling.use_markers_to_optimize_tooltip_2": "Try On first; turn Off if it causes stutter on your setup.", "feature.upscaling.view_resize": "View Resize", - "feature.upscaling.vr_intermediates_not_created": "VR intermediates not yet created (enter game world)", "feature.volumetric_lighting.description": "Volumetric Lighting creates realistic light scattering effects through fog, dust, and atmospheric particles.\nThis adds dramatic god rays and atmospheric depth to both interior and exterior environments.", "feature.volumetric_lighting.enable_exteriors": "Enable Volumetric Lighting in Exteriors", "feature.volumetric_lighting.enable_interiors": "Enable Volumetric Lighting in Interiors", @@ -1412,31 +1405,6 @@ "feature.volumetric_shadows.key_feature_3": "Multi-cascade support", "feature.volumetric_shadows.key_feature_4": "Optimized for effects rendering", "feature.volumetric_shadows.name": "Volumetric Shadows", - "feature.vr.description": "Provides VR-specific optimizations and enhancements for Community Shaders, improving performance and visual quality in virtual reality environments.", - "feature.vr.key_feature_1": "Depth buffer culling optimization for VR performance", - "feature.vr.key_feature_2": "In-scene overlay menu with HMD/Controller/Fixed World attach modes", - "feature.vr.key_feature_3": "VR controller input with customizable button mappings", - "feature.vr.key_feature_4": "Grip-to-drag overlay positioning with depth control", - "feature.vr.key_feature_5": "Configurable occlusion culling parameters", - "feature.vr.key_feature_6": "Enhanced VR compatibility with SteamVR and OpenComposite", - "feature.vr.name": "VR", - "feature.vr_stereo.debug": "Debug", - "feature.vr_stereo.debug_pom_depth": "Debug POM Depth", - "feature.vr_stereo.disocclusion_depth_threshold": "Disocclusion Depth Threshold", - "feature.vr_stereo.enable": "Enable", - "feature.vr_stereo.enable_stereo_reprojection": "Enable Stereo Reprojection", - "feature.vr_stereo.enable_stereo_reprojection_tooltip": "Reprojects Eye 0 (left) pixels into Eye 1 (right) using depth and motion data,\nskipping redundant full shading where the views overlap.\nReduces GPU cost in VR by shading each pixel fewer times per frame.", - "feature.vr_stereo.forward_occlusion_scale": "Forward Occlusion Scale", - "feature.vr_stereo.forward_occlusion_scale_tooltip": "Prevents Eye 0 silhouette edges from bleeding onto Eye 1 backgrounds.\nFires when Eye 0 depth is within this fraction of Eye 1 depth (e.g. 0.5 = Eye 0 less than 2x Eye 1 depth).\nLower = more aggressive. 0 = disabled.", - "feature.vr_stereo.full_blend_depth_view": "Full Blend Depth View", - "feature.vr_stereo.full_blend_distance": "Full Blend Distance", - "feature.vr_stereo.full_blend_distance_tooltip": "Geometry closer than this distance (game units) is fully shaded in both eyes and bilaterally blended for 2x supersampling. 0 = disabled.", - "feature.vr_stereo.full_blend_zone_hint": " Cyan = full blend zone (closer = stronger tint)", - "feature.vr_stereo.off": "Off", - "feature.vr_stereo.pom_depth_scale": "POM Depth Scale", - "feature.vr_stereo.pom_depth_scale_tooltip": "Scale factor for POM depth correction in stereo reprojection.\n1.0 = physical scale. Increase for more visible POM stereo depth.", - "feature.vr_stereo.restart_required": "Restart is required to enable VR stereo reprojection.", - "feature.vr_stereo.skip_pixel_reprojection": "Skip Pixel Reprojection", "feature.water_effects.description": "Water Effects enhances water rendering with realistic caustics and underwater lighting effects.\nThis feature adds dynamic light patterns and improved water visual quality.", "feature.water_effects.key_feature_1": "Realistic water caustics", "feature.water_effects.key_feature_2": "Enhanced underwater lighting", diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json index 30264ab701..5258198f85 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json @@ -545,7 +545,6 @@ "feature.cs_editor.wind_vs_player_tooltip_1": "- ~0° = 顺风(风在玩家背后)", "feature.cs_editor.wind_vs_player_tooltip_2": "- ~±90° = 横风(左/右)", "feature.cs_editor.wind_vs_player_tooltip_3": "- ~±180° = 逆风(风朝向玩家)", - "feature.dynamic_cubemaps.advanced_vr_settings": "高级VR设置", "feature.dynamic_cubemaps.color": "颜色", "feature.dynamic_cubemaps.creator_info": "您必须通过添加着色器定义 CREATOR 来启用创作者模式", "feature.dynamic_cubemaps.description": "通过生成捕获周围环境的动态立方体贴图,提供实时环境映射和反射,实现逼真的表面反射效果。", @@ -562,7 +561,6 @@ "feature.dynamic_cubemaps.name": "动态立方体贴图", "feature.dynamic_cubemaps.roughness": "粗糙度", "feature.dynamic_cubemaps.screen_space_reflections": "屏幕空间反射", - "feature.dynamic_cubemaps.vr_restart_required": "在VR中启用需要重启。启用后保存设置并重启游戏。", "feature.exp_height_fog.apply_vanilla_fade": "应用原版渐隐", "feature.exp_height_fog.apply_vanilla_fade_tooltip": "将原版渐隐亮度应用于指数高度雾。", "feature.exp_height_fog.cubemap_mip_level": "立方体贴图Mip级别", @@ -1057,11 +1055,9 @@ "feature.screen_space_gi.toggles": "开关", "feature.screen_space_gi.vanilla_ssao": "原版SSAO", "feature.screen_space_gi.vanilla_ssao_tooltip": "启用Skyrim内置的SSAO。使用SSGI时通常禁用此选项以避免双重变暗。", - "feature.screen_space_gi.vanilla_ssao_tooltip_vr": "VR不支持原版SSAO。", "feature.screen_space_gi.view_resize": "视图调整大小", "feature.screen_space_gi.visual": "视觉", "feature.screen_space_gi.visual_il": "视觉 - IL", - "feature.screen_space_gi.vr_warning": "\n\n警告:在VR中,由于屏幕空间效果的特性,此功能可能存在视觉瑕疵并显著影响性能。", "feature.screen_space_shadows.bilinear_threshold": "双线性阈值", "feature.screen_space_shadows.bilinear_threshold_tooltip": "双线性插值期间边缘检测的深度阈值。较高值跨边缘更积极地平滑。", "feature.screen_space_shadows.description": "通过添加详细的接触阴影和提高阴影精度来增强阴影质量。\n此技术添加了传统阴影映射可能遗漏的精细细节阴影。", @@ -1080,8 +1076,6 @@ "feature.screen_space_shadows.shadow_contrast_tooltip": "阴影过渡的对比度增强。较高值产生更硬的阴影边缘。", "feature.screen_space_shadows.surface_thickness": "表面厚度", "feature.screen_space_shadows.surface_thickness_tooltip": "阴影检测的假设表面厚度。较低值产生更薄、更精确的阴影。", - "feature.screen_space_shadows.vr_stereo_sync": "VR立体同步", - "feature.screen_space_shadows.vr_stereo_sync_tooltip": "通过双向重投影同步左右眼之间的阴影数据,并应用深度加权模糊以减少每只眼睛的噪点。使用最小混合,如果任一眼睛检测到遮挡物,则保留阴影。", "feature.screenshot.apply_crop": "应用裁剪", "feature.screenshot.async_note": "捕获和保存异步运行,不会让游戏停顿。", "feature.screenshot.crop": "裁剪", @@ -1383,7 +1377,6 @@ "feature.upscaling.use_markers_to_optimize_tooltip_1": "使用帧标记以实现更紧密的Reflex计时。", "feature.upscaling.use_markers_to_optimize_tooltip_2": "先尝试开启;如果在您的设置上造成卡顿则关闭。", "feature.upscaling.view_resize": "视图调整大小", - "feature.upscaling.vr_intermediates_not_created": "VR中间结果尚未创建(进入游戏世界)", "feature.volumetric_lighting.description": "体积光照通过雾、尘埃和大气粒子创造逼真的光散射效果。\n为室内和室外环境添加戏剧化的上帝射线和大气深度。", "feature.volumetric_lighting.enable_exteriors": "在室外启用体积光照", "feature.volumetric_lighting.enable_interiors": "在室内启用体积光照", @@ -1411,31 +1404,6 @@ "feature.volumetric_shadows.key_feature_3": "多级联支持", "feature.volumetric_shadows.key_feature_4": "针对效果渲染优化", "feature.volumetric_shadows.name": "体积阴影", - "feature.vr.description": "为Community Shaders提供VR专用优化和增强,提升虚拟现实环境中的性能和视觉质量。", - "feature.vr.key_feature_1": "深度缓冲区剔除优化,提升VR性能", - "feature.vr.key_feature_2": "场景内叠加菜单,支持HMD/控制器/固定世界附着模式", - "feature.vr.key_feature_3": "VR控制器输入,可自定义按键映射", - "feature.vr.key_feature_4": "握持拖拽叠加层定位,带深度控制", - "feature.vr.key_feature_5": "可配置的遮挡剔除参数", - "feature.vr.key_feature_6": "增强的VR兼容性,支持SteamVR和OpenComposite", - "feature.vr.name": "VR", - "feature.vr_stereo.debug": "调试", - "feature.vr_stereo.debug_pom_depth": "调试POM深度", - "feature.vr_stereo.disocclusion_depth_threshold": "去遮挡深度阈值", - "feature.vr_stereo.enable": "启用", - "feature.vr_stereo.enable_stereo_reprojection": "启用立体重投影", - "feature.vr_stereo.enable_stereo_reprojection_tooltip": "使用深度和运动数据将眼0(左)像素重投影到眼1(右),\n在视图重叠处跳过冗余的完整着色。\n通过每帧对每个像素减少着色次数来降低VR中的GPU成本。", - "feature.vr_stereo.forward_occlusion_scale": "前向遮挡缩放", - "feature.vr_stereo.forward_occlusion_scale_tooltip": "防止眼0轮廓边缘渗到眼1背景上。\n当眼0深度在眼1深度的此比例内时触发(例如0.5 = 眼0小于2倍眼1深度)。\n更低 = 更激进。0 = 禁用。", - "feature.vr_stereo.full_blend_depth_view": "完全混合深度视图", - "feature.vr_stereo.full_blend_distance": "完全混合距离", - "feature.vr_stereo.full_blend_distance_tooltip": "比此距离(游戏单位)更近的几何体在双眼完全着色并双向混合以实现2倍超采样。0 = 禁用。", - "feature.vr_stereo.full_blend_zone_hint": " 青色 = 完全混合区域(越近色调越强)", - "feature.vr_stereo.off": "关闭", - "feature.vr_stereo.pom_depth_scale": "POM深度缩放", - "feature.vr_stereo.pom_depth_scale_tooltip": "立体重投影中POM深度校正的缩放因子。\n1.0 = 物理缩放。增加以获得更明显的POM立体深度。", - "feature.vr_stereo.restart_required": "需要重启才能启用VR立体重投影。", - "feature.vr_stereo.skip_pixel_reprojection": "跳过像素重投影", "feature.water_effects.description": "通过逼真的焦散和水下光照效果增强水面渲染。\n添加动态光影图案并提升水面视觉质量。", "feature.water_effects.key_feature_1": "逼真的水面焦散", "feature.water_effects.key_feature_2": "增强的水下光照", diff --git a/package/Shaders/Common/FrameBuffer.hlsli b/package/Shaders/Common/FrameBuffer.hlsli index 68f0f90371..7113da11df 100644 --- a/package/Shaders/Common/FrameBuffer.hlsli +++ b/package/Shaders/Common/FrameBuffer.hlsli @@ -6,19 +6,18 @@ namespace FrameBuffer cbuffer PerFrame : register(b12) { -#if !defined(VR) - row_major float4x4 CameraView[1] : packoffset(c0); - row_major float4x4 CameraProj[1] : packoffset(c4); - row_major float4x4 CameraViewProj[1] : packoffset(c8); - row_major float4x4 CameraViewProjUnjittered[1] : packoffset(c12); - row_major float4x4 CameraPreviousViewProjUnjittered[1] : packoffset(c16); - row_major float4x4 CameraProjUnjittered[1] : packoffset(c20); - row_major float4x4 CameraProjUnjitteredInverse[1] : packoffset(c24); - row_major float4x4 CameraViewInverse[1] : packoffset(c28); - row_major float4x4 CameraViewProjInverse[1] : packoffset(c32); - row_major float4x4 CameraProjInverse[1] : packoffset(c36); - float4 CameraPosAdjust[1] : packoffset(c40); - float4 CameraPreviousPosAdjust[1] : packoffset(c41); // fDRClampOffset in w + row_major float4x4 CameraView : packoffset(c0); + row_major float4x4 CameraProj : packoffset(c4); + row_major float4x4 CameraViewProj : packoffset(c8); + row_major float4x4 CameraViewProjUnjittered : packoffset(c12); + row_major float4x4 CameraPreviousViewProjUnjittered : packoffset(c16); + row_major float4x4 CameraProjUnjittered : packoffset(c20); + row_major float4x4 CameraProjUnjitteredInverse : packoffset(c24); + row_major float4x4 CameraViewInverse : packoffset(c28); + row_major float4x4 CameraViewProjInverse : packoffset(c32); + row_major float4x4 CameraProjInverse : packoffset(c36); + float4 CameraPosAdjust : packoffset(c40); + float4 CameraPreviousPosAdjust : packoffset(c41); // fDRClampOffset in w float4 FrameParams : packoffset(c42); // inverse fGamma in x, some flags in yzw float4 DynamicResolutionParams1 : packoffset(c43); // fDynamicResolutionWidthRatio in x, // fDynamicResolutionHeightRatio in y, @@ -28,29 +27,6 @@ namespace FrameBuffer // fDynamicResolutionHeightRatio in y, // fDynamicResolutionWidthRatio - fDRClampOffset in z, // fDynamicResolutionPreviousWidthRatio - fDRClampOffset in w -#else - row_major float4x4 CameraView[2] : packoffset(c0); - row_major float4x4 CameraProj[2] : packoffset(c8); - row_major float4x4 CameraViewProj[2] : packoffset(c16); - row_major float4x4 CameraViewProjUnjittered[2] : packoffset(c24); - row_major float4x4 CameraPreviousViewProjUnjittered[2] : packoffset(c32); - row_major float4x4 CameraProjUnjittered[2] : packoffset(c40); - row_major float4x4 CameraProjUnjitteredInverse[2] : packoffset(c48); - row_major float4x4 CameraViewInverse[2] : packoffset(c56); - row_major float4x4 CameraViewProjInverse[2] : packoffset(c64); - row_major float4x4 CameraProjInverse[2] : packoffset(c72); - float4 CameraPosAdjust[2] : packoffset(c80); - float4 CameraPreviousPosAdjust[2] : packoffset(c82); // fDRClampOffset in w - float4 FrameParams : packoffset(c84); // inverse fGamma in x, some flags in yzw - float4 DynamicResolutionParams1 : packoffset(c85); // fDynamicResolutionWidthRatio in x, - // fDynamicResolutionHeightRatio in y, - // fDynamicResolutionPreviousWidthRatio in z, - // fDynamicResolutionPreviousHeightRatio in w - float4 DynamicResolutionParams2 : packoffset(c86); // inverse fDynamicResolutionWidthRatio in x, inverse - // fDynamicResolutionHeightRatio in y, - // fDynamicResolutionWidthRatio - fDRClampOffset in z, - // fDynamicResolutionPreviousWidthRatio - fDRClampOffset in w -#endif // !VR } /** @@ -60,37 +36,24 @@ namespace FrameBuffer * space by custom math (for example, after jitter removal or other UV manipulation). * This function only clamps; it does not apply dynamic-resolution scaling. * - * In VR, clamping is restricted to the current eye half to avoid cross-eye sampling. - * * @param[in] screenPositionDR UVs already expressed in dynamic-resolution space. - * @param[in] screenPosition Original normalized screen UVs (used to infer eye in VR). - * @param[in] stereo Whether to apply stereo eye-half clamping in VR. Default is 1. + * @param[in] screenPosition Original normalized screen UVs. + * @param[in] stereo Unused, kept for call-site compatibility. Default is 1. * @return Clamped dynamic-resolution UVs. */ float2 ClampDynamicResolutionAdjustedScreenPosition(float2 screenPositionDR, float2 screenPosition, uint stereo = 1) { float2 minValue = 0; float2 maxValue = float2(DynamicResolutionParams2.z, DynamicResolutionParams1.y); -#if defined(VR) - // VR uses side-by-side stereo packing in the shared render target. - // Clamp within the current eye's half to avoid cross-eye sampling. - if (stereo) { - bool isRight = screenPosition.x >= 0.5; - float minFactor = isRight ? 1 : 0; - minValue.x = 0.5 * (DynamicResolutionParams2.z * minFactor); - float maxFactor = isRight ? 2 : 1; - maxValue.x = 0.5 * (DynamicResolutionParams2.z * maxFactor); - } -#endif return clamp(screenPositionDR, minValue, maxValue); } - // Projects a world-space (camera-relative) point into NDC using the eye's CameraViewProj + // Projects a world-space (camera-relative) point into NDC using CameraViewProj // and returns the post-perspective z (NDC depth). Combine with SharedData::GetScreenDepth // to get a linear view-space distance suitable for cascade-split comparisons. - float GetShadowDepth(float3 positionWS, uint eyeIndex) + float GetShadowDepth(float3 positionWS) { - float4 positionCS = mul(FrameBuffer::CameraViewProj[eyeIndex], float4(positionWS, 1)); + float4 positionCS = mul(FrameBuffer::CameraViewProj, float4(positionWS, 1)); return positionCS.z / positionCS.w; } @@ -104,7 +67,7 @@ namespace FrameBuffer * `ClampDynamicResolutionAdjustedScreenPosition(...)` instead. * * @param[in] screenPosition Normalized screen UVs in non-DR space. - * @param[in] stereo Whether to apply stereo eye-half clamping in VR. Default is 1. + * @param[in] stereo Unused, kept for call-site compatibility. Default is 1. * @return Dynamic-resolution-adjusted and clamped UVs. */ float2 GetDynamicResolutionAdjustedScreenPosition(float2 screenPosition, uint stereo = 1) @@ -146,13 +109,6 @@ namespace FrameBuffer float2 screenPositionDR = DynamicResolutionParams1.zw * screenPosition; float2 minValue = 0; float2 maxValue = float2(DynamicResolutionParams2.w, DynamicResolutionParams1.w); -#if defined(VR) - bool isRight = screenPosition.x >= 0.5; - float minFactor = isRight ? 1 : 0; - minValue.x = 0.5 * (DynamicResolutionParams2.w * minFactor); - float maxFactor = isRight ? 2 : 1; - maxValue.x = 0.5 * (DynamicResolutionParams2.w * maxFactor); -#endif return clamp(screenPositionDR, minValue, maxValue); } @@ -161,22 +117,22 @@ namespace FrameBuffer return pow(abs(linearColor), FrameParams.x); } - float3 WorldToView(float3 x, bool is_position = true, uint a_eyeIndex = 0) + float3 WorldToView(float3 x, bool is_position = true) { float4 newPosition = float4(x, (float)is_position); - return mul(CameraView[a_eyeIndex], newPosition).xyz; + return mul(CameraView, newPosition).xyz; } - float3 ViewToWorld(float3 x, bool is_position = true, uint a_eyeIndex = 0) + float3 ViewToWorld(float3 x, bool is_position = true) { float4 newPosition = float4(x, (float)is_position); - return mul(CameraViewInverse[a_eyeIndex], newPosition).xyz; + return mul(CameraViewInverse, newPosition).xyz; } - float2 ViewToUV(float3 x, bool is_position = true, uint a_eyeIndex = 0) + float2 ViewToUV(float3 x, bool is_position = true) { float4 newPosition = float4(x, (float)is_position); - float4 uv = mul(CameraProj[a_eyeIndex], newPosition); + float4 uv = mul(CameraProj, newPosition); return (uv.xy / uv.w) * float2(0.5f, -0.5f) + 0.5f; } diff --git a/package/Shaders/Common/MotionBlur.hlsli b/package/Shaders/Common/MotionBlur.hlsli index 36ba16fb45..a6cca62ace 100644 --- a/package/Shaders/Common/MotionBlur.hlsli +++ b/package/Shaders/Common/MotionBlur.hlsli @@ -5,10 +5,10 @@ namespace MotionBlur { - float2 GetSSMotionVector(float4 a_wsPosition, float4 a_previousWSPosition, uint a_eyeIndex = 0) + float2 GetSSMotionVector(float4 a_wsPosition, float4 a_previousWSPosition) { - float4 screenPosition = mul(FrameBuffer::CameraViewProjUnjittered[a_eyeIndex], a_wsPosition); - float4 previousScreenPosition = mul(FrameBuffer::CameraPreviousViewProjUnjittered[a_eyeIndex], a_previousWSPosition); + float4 screenPosition = mul(FrameBuffer::CameraViewProjUnjittered, a_wsPosition); + float4 previousScreenPosition = mul(FrameBuffer::CameraPreviousViewProjUnjittered, a_previousWSPosition); screenPosition.xy = screenPosition.xy / screenPosition.ww; previousScreenPosition.xy = previousScreenPosition.xy / previousScreenPosition.ww; return float2(-0.5, 0.5) * (screenPosition.xy - previousScreenPosition.xy); diff --git a/package/Shaders/Common/ShadowSampling.hlsli b/package/Shaders/Common/ShadowSampling.hlsli index 70e7143f54..076970839b 100644 --- a/package/Shaders/Common/ShadowSampling.hlsli +++ b/package/Shaders/Common/ShadowSampling.hlsli @@ -49,7 +49,7 @@ namespace ShadowSampling return SharedData::HasDirectionalShadows; } - float GetWorldShadow(float3 positionWS, float3 offset, uint eyeIndex) + float GetWorldShadow(float3 positionWS, float3 offset) { if (SharedData::InInterior || SharedData::HideSky || SharedData::InMapMenu) return 1.0; @@ -66,7 +66,7 @@ namespace ShadowSampling return worldShadow; } - float Get3DFilteredShadow(float3 positionWS, float3 viewDirection, float2 screenPosition, uint eyeIndex, out float surfaceShadow) + float Get3DFilteredShadow(float3 positionWS, float3 viewDirection, float2 screenPosition, out float surfaceShadow) { #if defined(EFFECT) float viewRayLength = min(Permutation::EffectRadius * 0.2, 256); @@ -95,7 +95,7 @@ namespace ShadowSampling for (uint i = 0; i < sampleCount; i++) { float t = (float(i) + noise) * rcpSampleCount; float3 sampledPositionWS = lerp(endPosition, startPosition, t); - float worldShadowSample = ShadowSampling::GetWorldShadow(sampledPositionWS, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + float worldShadowSample = ShadowSampling::GetWorldShadow(sampledPositionWS, FrameBuffer::CameraPosAdjust.xyz); surfaceShadow = worldShadowSample; worldShadow += worldShadowSample; } @@ -108,7 +108,7 @@ namespace ShadowSampling #if defined(VOLUMETRIC_SHADOWS) if (HasDirectionalShadows()) { float vsmSurfaceShadow; - float shadow = VolumetricShadows::GetVSMShadow3D(startPosition, endPosition, noise, sampleCount, eyeIndex, vsmSurfaceShadow); + float shadow = VolumetricShadows::GetVSMShadow3D(startPosition, endPosition, noise, sampleCount, 0, vsmSurfaceShadow); surfaceShadow *= vsmSurfaceShadow; return worldShadow * shadow; } @@ -119,7 +119,7 @@ namespace ShadowSampling return worldShadow; } - float GetLightingShadow(float3 worldPosition, uint eyeIndex, out float detailedShadow) + float GetLightingShadow(float3 worldPosition, out float detailedShadow) { if (!HasDirectionalShadows()) { detailedShadow = 1.0; @@ -127,7 +127,7 @@ namespace ShadowSampling } #if defined(VOLUMETRIC_SHADOWS) - float shadow = VolumetricShadows::GetVSMShadow2D(worldPosition, eyeIndex, detailedShadow); + float shadow = VolumetricShadows::GetVSMShadow2D(worldPosition, 0, detailedShadow); return shadow; #else detailedShadow = 1.0; diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index c848328844..f7221a063f 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -3,7 +3,6 @@ #include "Common/FrameBuffer.hlsli" #include "Common/Spherical Harmonics/SphericalHarmonics.hlsli" -#include "Common/VR.hlsli" namespace SharedData { @@ -31,7 +30,7 @@ namespace SharedData bool InMapMenu; // If the world/local map is open (note that the renderer is still deferred here) bool HideSky; // HideSky flag in WorldSpace, e.g. Blackreach float MipBias; // Offset to mip level for TAA sharpness - float WaterSystemHeight; // TES::GetWaterHeight at eye-0 in camera-relative Z; -FLT_MAX when no water body found (VR only) + float WaterSystemHeight; // TES::GetWaterHeight in camera-relative Z; -FLT_MAX when no water body found float3 pad0; float4 AmbientSHR; float4 AmbientSHG; @@ -336,17 +335,16 @@ namespace SharedData Texture2D DepthTexture : register(t17); // Get a int3 to be used as texture sample coord. [0,1] in uv space - int3 ConvertUVToSampleCoord(float2 uv, uint a_eyeIndex) + int3 ConvertUVToSampleCoord(float2 uv) { - uv = Stereo::ConvertToStereoUV(uv, a_eyeIndex); uv = FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(uv); return int3(uv * BufferDim.xy, 0); } // Get a raw depth from the depth buffer. [0,1] in uv space - float GetDepth(float2 uv, uint a_eyeIndex = 0) + float GetDepth(float2 uv) { - return DepthTexture.Load(ConvertUVToSampleCoord(uv, a_eyeIndex)).x; + return DepthTexture.Load(ConvertUVToSampleCoord(uv)).x; } float GetScreenDepth(float depth) @@ -359,19 +357,16 @@ namespace SharedData return (CameraData.w / (-depths * CameraData.z + CameraData.x)); } - float GetScreenDepth(float2 uv, uint a_eyeIndex = 0) + float GetScreenDepth(float2 uv) { - float depth = GetDepth(uv, a_eyeIndex); + float depth = GetDepth(uv); return GetScreenDepth(depth); } // Returns water data for the tile containing worldPosition (camera-relative XY). - // The .w component (water surface height) is stored in C++ as camera-relative Z of - // eye 0 (left eye). Pass eyeIndex to have .w corrected into the current eye's - // camera-relative frame; defaults to 0 (no correction, backwards-compatible). - float4 GetWaterData(float3 worldPosition, uint eyeIndex = 0) + float4 GetWaterData(float3 worldPosition) { - float2 cellF = (((worldPosition.xy + FrameBuffer::CameraPosAdjust[0].xy)) / 4096.0) + 64.0; // always positive + float2 cellF = (((worldPosition.xy + FrameBuffer::CameraPosAdjust.xy)) / 4096.0) + 64.0; // always positive int2 cellInt; float2 cellFrac = modf(cellF, cellInt); @@ -387,12 +382,6 @@ namespace SharedData [flatten] if (cellInt.x < 5 && cellInt.x >= 0 && cellInt.y < 5 && cellInt.y >= 0) waterData = WaterData[waterTile]; -# if defined(VR) - // Correct .w from eye-0 camera-relative Z to the current eye's camera-relative Z. - // No-op when eyeIndex == 0 (both terms are identical). - waterData.w += FrameBuffer::CameraPosAdjust[0].z - FrameBuffer::CameraPosAdjust[eyeIndex].z; -# endif - return waterData; } diff --git a/package/Shaders/Common/VR.hlsli b/package/Shaders/Common/VR.hlsli deleted file mode 100644 index 0b8ea117ba..0000000000 --- a/package/Shaders/Common/VR.hlsli +++ /dev/null @@ -1,668 +0,0 @@ -#ifndef __VR_DEPENDENCY_HLSL__ -#define __VR_DEPENDENCY_HLSL__ -#ifdef VR - -// First person model depth threshold for VR occlusion logic -# ifndef VR_FP_Z -# define VR_FP_Z 18.0 -# endif - -# if defined(VSHADER) -# include "Common/Math.hlsli" -# endif // VSHADER - -# if (!defined(COMPUTESHADER) && !defined(CSHADER)) || defined(FRAMEBUFFER) -# include "Common/FrameBuffer.hlsli" -# endif -cbuffer VRValues : register(b13) -{ - float AlphaTestRefRS : packoffset(c0); - float StereoEnabled : packoffset(c0.y); - float2 EyeOffsetScale : packoffset(c0.z); - float4 EyeClipEdge[2] : packoffset(c1); -} -#endif - -namespace Stereo -{ -#ifdef VR_STEREO_OPT - /// Sentinel written to PomOffsetTex when a pixel's Lighting PS did not run POM. - /// Convention: -1.0 = no POM; >= 0.0 = POM ran (StereoBlendCS detects by sign). - /// Must match kPomOffsetNoData in VRStereoOptimizations.h. - static const float POM_NO_DATA = -1.0; -#endif - /** - Converts to the eye specific uv [0,1]. - In VR, texture buffers include the left and right eye in the same buffer. Flat - only has a single camera for the entire width. This means the x value [0, .5] - represents the left eye, and the x value (.5, 1] are the right eye. This returns - the adjusted value - @param uv - uv coords [0,1] to be encoded for VR - @param a_eyeIndex The eyeIndex; 0 is left, 1 is right - @param a_invertY Whether to invert the Y direction - @returns uv with x coords adjusted for the VR texture buffer - */ - float2 ConvertToStereoUV(float2 uv, uint a_eyeIndex, uint a_invertY = 0) - { -#ifdef VR - // convert [0,1] to eye specific [0,.5] and [.5, 1] dependent on a_eyeIndex - uv.x = saturate(uv.x); - uv.x = (uv.x + (float)a_eyeIndex) / 2; - if (a_invertY) - uv.y = 1 - uv.y; -#endif - return uv; - } - - float3 ConvertToStereoUV(float3 uv, uint a_eyeIndex, uint a_invertY = 0) - { - uv.xy = ConvertToStereoUV(uv.xy, a_eyeIndex, a_invertY); - return uv; - } - - float4 ConvertToStereoUV(float4 uv, uint a_eyeIndex, uint a_invertY = 0) - { - uv.xy = ConvertToStereoUV(uv.xy, a_eyeIndex, a_invertY); - return uv; - } - - /** - Converts from eye specific uv to general uv [0,1]. - In VR, texture buffers include the left and right eye in the same buffer. - This means the x value [0, .5] represents the left eye, and the x value (.5, 1] are the right eye. - This returns the adjusted value - @param uv - eye specific uv coords [0,1]; if uv.x < 0.5, it's a left eye; otherwise right - @param a_eyeIndex The eyeIndex; 0 is left, 1 is right - @param a_invertY Whether to invert the Y direction - @returns uv with x coords adjusted to full range for either left or right eye - */ - float2 ConvertFromStereoUV(float2 uv, uint a_eyeIndex, uint a_invertY = 0) - { -#ifdef VR - // convert [0,.5] to [0, 1] and [.5, 1] to [0,1] - uv.x = 2 * uv.x - (float)a_eyeIndex; - if (a_invertY) - uv.y = 1 - uv.y; -#endif - return uv; - } - - float3 ConvertFromStereoUV(float3 uv, uint a_eyeIndex, uint a_invertY = 0) - { - uv.xy = ConvertFromStereoUV(uv.xy, a_eyeIndex, a_invertY); - return uv; - } - - float4 ConvertFromStereoUV(float4 uv, uint a_eyeIndex, uint a_invertY = 0) - { - uv.xy = ConvertFromStereoUV(uv.xy, a_eyeIndex, a_invertY); - return uv; - } - - /** - Gets the eyeIndex for Compute Shaders - @param texCoord Texcoord on the screen [0,1] - @returns eyeIndex (0 left, 1 right) - */ - uint GetEyeIndexFromTexCoord(float2 texCoord) - { -#ifdef VR - return (texCoord.x >= 0.5) ? 1 : 0; -#endif // VR - return 0; - } - - /** - * @brief Applies motion velocity to UV coordinates and determines if the resulting mono UV is out of screen bounds. - * @param uv Screen UV coordinates (stereo in VR, mono in SE) - * @param velocity Delta motion mapping - * @param isOutOfBounds Output flag indicating if the motion went out of bounds - * @return Newly displaced UV coordinate mapped back to correct space (stereo in VR, mono in SE). Clamped if necessary. - */ - float2 ApplyVelocityToUV(float2 uv, float2 velocity, out bool isOutOfBounds) - { - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - float2 prevUVmono = Stereo::ConvertFromStereoUV(uv, eyeIndex) + velocity; - float2 clampedMono = prevUVmono; - -#ifdef VR - // VR logic: mono.x < 0 is clamped to 0, not rejected. OOB fires for mono.x >= 1 or mono.y outside [0, 1] inclusive. - isOutOfBounds = (prevUVmono.x >= 1.0) || (prevUVmono.y <= 0.0) || (prevUVmono.y >= 1.0); - clampedMono.x = saturate(prevUVmono.x); -#else - // SE logic: inclusive boundaries on both sides. - isOutOfBounds = any(prevUVmono >= 1.0) || any(prevUVmono <= 0.0); -#endif - - return Stereo::ConvertToStereoUV(clampedMono, eyeIndex); - } - - /** - Converts to the eye specific screenposition [0,Resolution]. - In VR, texture buffers include the left and right eye in the same buffer. Flat only has a single camera for the entire width. - This means the x value [0, resx/2] represents the left eye, and the x value (resx/2, x] are the right eye. - This returns the adjusted value - @param screenPosition - Screenposition coords ([0,resx], [0,resy]) to be encoded for VR - @param a_eyeIndex The eyeIndex; 0 is left, 1 is right - @param a_resolution The resolution of the screen - @returns screenPosition with x coords adjusted for the VR texture buffer - */ - float2 ConvertToStereoSP(float2 screenPosition, uint a_eyeIndex, float2 a_resolution) - { - screenPosition.x /= a_resolution.x; - float2 stereoUV = ConvertToStereoUV(screenPosition, a_eyeIndex); - return stereoUV * a_resolution; - } - - float3 ConvertToStereoSP(float3 screenPosition, uint a_eyeIndex, float2 a_resolution) - { - float2 xy = screenPosition.xy / a_resolution; - xy = ConvertToStereoUV(xy, a_eyeIndex); - return float3(xy * a_resolution, screenPosition.z); - } - - float4 ConvertToStereoSP(float4 screenPosition, uint a_eyeIndex, float2 a_resolution) - { - float2 xy = screenPosition.xy / a_resolution; - xy = ConvertToStereoUV(xy, a_eyeIndex); - return float4(xy * a_resolution, screenPosition.zw); - } - - /** - * @brief Converts UV coordinates from the range [0, 1] to normalized screen space [-1, 1]. - * - * This function takes texture coordinates and transforms them into a normalized - * coordinate system centered at the origin. This is useful for various graphical - * calculations, especially in shaders that require symmetry around the center. - * - * @param uv The input UV coordinates in the range [0, 1]. - * @return float2 Normalized screen space coordinates in the range [-1, 1]. - */ - float2 ConvertUVToNormalizedScreenSpace(float2 uv) - { - float2 normalizedCoord; - normalizedCoord.x = 2.0 * (-0.5 + abs(2.0 * (uv.x - 0.5))); // Convert UV.x - normalizedCoord.y = 2.0 * uv.y - 1.0; // Convert UV.y - return normalizedCoord; - } - - /** - * @brief Returns the maximum absolute depth difference between a center depth and four neighbors. - * - * Used for depth-discontinuity edge detection in stereo sync passes. - * Works with both NDC depths (fixed absolute threshold) and linear view-space depths - * (relative threshold: divide result by max(center, 1.0)). - * - * @param[in] center Depth at the pixel being tested. - * @param[in] neighbors Depths at four neighboring pixels (e.g. ±1 or ±2 cross pattern). - * @return Maximum of |center - neighbor| across all four samples. - */ - float MaxDepthDiff(float center, float4 neighbors) - { - return max(max(abs(center - neighbors.x), abs(center - neighbors.y)), - max(abs(center - neighbors.z), abs(center - neighbors.w))); - } - - /** - * @brief Clamps a stereo UV coordinate to the eye-local X range of the packed stereo buffer. - * - * Prevents cross-neighbor UV samples from crossing the x=0.5 seam into the other eye's - * region of the side-by-side stereo texture. Y is not clamped; sampler address modes - * handle vertical out-of-bounds. - * - * @param[in] uv Stereo UV coordinate to clamp. - * @param[in] eyeIndex Eye index (0 = left [0, 0.5], 1 = right [0.5, 1]). - * @return UV with x restricted to eyeIndex's half of the stereo buffer. - */ - float2 ClampToEyeUV(float2 uv, uint eyeIndex) - { - uv.x = clamp(uv.x, eyeIndex == 0 ? 0.0f : 0.5f, eyeIndex == 0 ? 0.5f : 1.0f); - return uv; - } - - /** - * @brief Clamps a pixel coordinate to the eye-local X bounds of the packed stereo buffer. - * - * Prevents cross-neighbor pixel reads from crossing the half-width seam into the - * other eye's region of the side-by-side stereo texture. - * - * @param[in] px Pixel coordinate to clamp. - * @param[in] eyeIndex Eye index (0 = left, 1 = right). - * @param[in] frameDim Full stereo buffer dimensions (width covers both eyes). - * @return Clamped pixel coordinate, restricted to eyeIndex's half of the buffer. - */ - int2 ClampToEyeBounds(int2 px, uint eyeIndex, float2 frameDim) - { - int halfWidth = (int)((uint)frameDim.x >> 1); - px.x = clamp(px.x, eyeIndex == 0 ? 0 : halfWidth, eyeIndex == 0 ? (halfWidth - 1) : ((int)frameDim.x - 1)); - px.y = clamp(px.y, 0, (int)frameDim.y - 1); - return px; - } - -#if defined(PSHADER) || defined(FRAMEBUFFER) - // These functions require the framebuffer which is typically provided with the PSHADER - /** - Gets the eyeIndex for PSHADER - @returns eyeIndex (0 left, 1 right) - */ - uint GetEyeIndexPS(float4 position, float4 offset = 0.0.xxxx) - { -# if !defined(VR) - uint eyeIndex = 0; -# else - float4 stereoUV; - stereoUV.xy = position.xy * offset.xy + offset.zw; - stereoUV.x = FrameBuffer::DynamicResolutionParams2.x * stereoUV.x; - stereoUV.x = (stereoUV.x >= 0.5); - uint eyeIndex = (uint)(((int)((uint)StereoEnabled)) * (int)stereoUV.x); -# endif - return eyeIndex; - } - - /** - * @brief Checks if the color is non zero by testing if the color is greater than 0 by epsilon. - * - * This function check is a color is non black. It uses a small epsilon value to allow for - * floating point imprecision. - * - * For screen-space reflection (SSR), this acts as a mask and checks for an invalid reflection by - * checking if the reflection color is essentially black (close to zero). - * - * @param[in] ssrColor The color to check. - * @param[in] epsilon Small tolerance value used to determine if the color is close to zero. - * @return True if color is non zero, otherwise false. - */ - bool IsNonZeroColor(float4 ssrColor, float epsilon = 0.001) - { - return dot(ssrColor.xyz, ssrColor.xyz) > epsilon * epsilon; - } - -# ifdef VR - /** - * @brief Converts mono UV coordinates from one eye to the corresponding mono UV coordinates of the other eye. - * - * This function is used to transition UV coordinates from one eye's perspective to the other eye in a stereo rendering setup. - * It operates by converting the mono UV to clip space, transforming it into world space, and then reprojecting it - * into the other eye's clip space before converting back to UV coordinates. It supports dynamic resolution adjustments - * and applies eye offset adjustments for correct stereo separation. - * - * The function considers the aspect of VR by modifying the NDC to view space conversion based on the stereo setup, - * ensuring accurate rendering across both eyes. - * - * @param[in] monoUV The UV coordinates and depth value (Z component) for the current eye, in the range [0,1]. - * @param[in] eyeIndex Index of the source/current eye (0 for left, 1 for right). - * @param[in] dynamicres Optional flag indicating whether dynamic resolution is applied. Default is false. - * @return UV coordinates adjusted to the other eye, with depth. - */ - float3 ConvertMonoUVToOtherEye(float3 monoUV, uint eyeIndex, bool dynamicres = false) - { - // Convert from dynamic res to true UV space if necessary - if (dynamicres) - monoUV.xy *= FrameBuffer::DynamicResolutionParams2.xy; - - // Convert UV to Clip Space - float4 clipPos = float4(monoUV.xy * float2(2, -2) - float2(1, -1), monoUV.z, 1); - - // Convert Clip Space to World Space for the current eye - float4 worldPos = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], clipPos); - worldPos /= worldPos.w; - - // Apply eye offset adjustment in world space - worldPos.xyz += FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[1 - eyeIndex].xyz; - - // Convert World Space to Clip Space for the other eye - float4 clipPosOtherEye = mul(FrameBuffer::CameraViewProj[1 - eyeIndex], worldPos); - clipPosOtherEye /= clipPosOtherEye.w; - - // Convert Clip Space to UV (Y is flipped: clip +1 = top, UV 0 = top) - float3 monoUVOtherEye = float3(clipPosOtherEye.xy * float2(0.5f, -0.5f) + 0.5f, clipPosOtherEye.z); - - // Convert back to dynamic res space if necessary - if (dynamicres) - monoUVOtherEye.xy *= FrameBuffer::DynamicResolutionParams1.xy; - - return monoUVOtherEye; - } -# endif // VR - - /** - * @brief Resolves a mono UV to the eye that can see it, crossing to the other eye if needed. - * - * When a screen-space ray or sample position leaves the current eye's screen bounds, - * this function tries to find the corresponding location in the other eye via - * ConvertMonoUVToOtherEye. On flat (non-VR) this is a no-op: sampleUV and - * sampleEyeIndex are set to the input values unchanged. - * - * Based on concepts from https://cuteloong.github.io/publications/scssr24/ - * Wu, X., Xu, Y., & Wang, L. (2024). Stereo-consistent Screen Space Reflection. Computer Graphics Forum, 43(4). - * - * @param[in] monoUV Mono UV coordinates with depth in Z, [0-1]. Must not be dynamic resolution adjusted. - * @param[in] eyeIndex Index of the originating eye (0 or 1). - * @param[out] sampleUV Mono UV that should be used for sampling (may be in the other eye). - * @param[out] sampleEyeIndex Eye index that owns sampleUV. - */ - void ResolveMonoUVForEye(float3 monoUV, uint eyeIndex, out float2 sampleUV, out uint sampleEyeIndex) - { - sampleUV = monoUV.xy; - sampleEyeIndex = eyeIndex; -# ifdef VR - if (FrameBuffer::IsOutsideFrame(monoUV.xy, false)) { - float3 otherEyeUV = ConvertMonoUVToOtherEye(monoUV, eyeIndex); - if (!FrameBuffer::IsOutsideFrame(otherEyeUV.xy, false)) { - sampleUV = otherEyeUV.xy; - sampleEyeIndex = 1 - eyeIndex; - } - } -# endif - } - -# ifdef VR - /** - * @brief Adjusts UV coordinates for VR stereo rendering when transitioning between eyes or handling boundary conditions. - * - * This function is used in raymarching to check the next UV coordinate. It checks if the current UV coordinates are outside - * the frame. If so, it transitions the UV coordinates to the other eye and adjusts them if they are within the frame of the other eye. - * If the UV coordinates are outside the frame of both eyes, it returns the adjusted UV coordinates for the current eye. - * - * The function ensures that the UV coordinates are correctly adjusted for stereo rendering, taking into account boundary conditions - * and preserving accurate reflections. - * Based on concepts from https://cuteloong.github.io/publications/scssr24/ - * Wu, X., Xu, Y., & Wang, L. (2024). Stereo-consistent Screen Space Reflection. Computer Graphics Forum, 43(4). - * - * We do not have a backface depth so we may be ray marching even though the ray is in an object. - - * @param[in] monoUV Current UV coordinates with depth information, [0-1]. Must not be dynamic resolution adjusted. - * @param[in] eyeIndex Index of the current eye (0 or 1). - * @param[out] fromOtherEye Boolean indicating if the result UV coordinates are from the other eye. - * - * @return Adjusted stereo UV coordinates for rendering, [0-1]. Must be dynamic resolution adjusted later. - */ - float3 ConvertStereoRayMarchUV(float3 monoUV, uint eyeIndex, out bool fromOtherEye) - { - float2 resolvedUV; - uint resolvedEye; - ResolveMonoUVForEye(monoUV, eyeIndex, resolvedUV, resolvedEye); - fromOtherEye = (resolvedEye != eyeIndex); - return ConvertToStereoUV(float3(resolvedUV, monoUV.z), resolvedEye); - } - - /** - * @brief Converts stereo UV coordinates from one eye to the corresponding stereo UV coordinates of the other eye. - * - * This function is used to transition UV coordinates from one eye's perspective to the other eye in a stereo rendering setup. - * It works by converting the stereo UV to mono UV, then to clip space, transforming it into view space, and then reprojecting it into the other eye's - * clip space before converting back to stereo UV coordinates. It also supports dynamic resolution. - * - * @param[in] stereoUV The UV coordinates and depth value (Z component) for the current eye, in the range [0,1]. - * @param[in] eyeIndex Index of the current eye (0 or 1). - * @param[in] dynamicres Optional flag indicating whether dynamic resolution is applied. Default is false. - * @return UV coordinates adjusted to the other eye, with depth. - */ - float3 ConvertStereoUVToOtherEyeStereoUV(float3 stereoUV, uint eyeIndex, bool dynamicres = false) - { - // Convert from dynamic res to true UV space - if (dynamicres) - stereoUV.xy *= FrameBuffer::DynamicResolutionParams2.xy; - - stereoUV.xy = ConvertFromStereoUV(stereoUV.xy, eyeIndex); - stereoUV.xyz = ConvertMonoUVToOtherEye(stereoUV.xyz, eyeIndex); - stereoUV.xy = ConvertToStereoUV(stereoUV.xy, 1 - eyeIndex); - - // Convert back to dynamic res space if necessary - if (dynamicres) - stereoUV.xy *= FrameBuffer::DynamicResolutionParams1.xy; - return stereoUV; - } - - /** - * @brief Returns a smooth fade factor for UVs near the edge of the frame. - * - * This helps avoid abrupt transitions when one eye's SSGI is out of frame or occluded. - * Fade width is tunable; 0.02 is 2% of the frame. - */ - float IsOutsideFrameFade(float2 uv, bool dynamicres = false) - { - float2 max = dynamicres ? FrameBuffer::DynamicResolutionParams1.xy : float2(1, 1); - float2 min = float2(0, 0); - float fadeWidth = 0.02; - float edgeFade = 1.0; - edgeFade *= smoothstep(min.x, min.x + fadeWidth, uv.x); - edgeFade *= smoothstep(max.x, max.x - fadeWidth, uv.x); - edgeFade *= smoothstep(min.y, min.y + fadeWidth, uv.y); - edgeFade *= smoothstep(max.y, max.y - fadeWidth, uv.y); - return edgeFade; - } - - /** - * @brief Blends color data from two eyes based on their UV coordinates and validity. - * - * This function checks the validity of the colors based on their UV coordinates and - * alpha values. It blends the colors while ensuring proper handling of transparency. - * If one eye sees the first person model (depth < VR_FP_Z) and the other sees world geometry (depth > VR_FP_Z), - * the first person model's color is dropped from the blend to avoid outlines. - * - * @param uv1 UV coordinates for the first eye. - * @param color1 Color from the first eye. - * @param uv2 UV coordinates for the second eye. - * @param color2 Color from the second eye. - * @param dynamicres Whether the uvs have dynamic resolution applied - * @return Blended color, including the maximum alpha from both inputs. - */ - float4 BlendEyeColors( - float3 uv1, - float4 color1, - float3 uv2, - float4 color2, - bool dynamicres = false) - { - // Use smooth fade at edge for each eye - float fade1 = IsOutsideFrameFade(uv1.xy, dynamicres); - float fade2 = IsOutsideFrameFade(uv2.xy, dynamicres); - - // Stereo-consistent edge fade: use maximum fade so either eye can keep color if in bounds - float edgeFade = max(fade1, fade2); - - // Occlusion-aware confidence based on depth difference - float depthDiff = abs(uv1.z - uv2.z); - float confidence = 1.0 - smoothstep(0.01, 0.05, depthDiff); - - // Soft first person model mask: fade out FP model near threshold - float fp_fade1 = 1.0 - smoothstep(VR_FP_Z - 1.0, VR_FP_Z + 1.0, uv1.z); // fades from 1 to 0 as depth crosses VR_FP_Z - float fp_fade2 = 1.0 - smoothstep(VR_FP_Z - 1.0, VR_FP_Z + 1.0, uv2.z); - - // If one eye is world and the other is FP, fade out FP smoothly - bool eye1_is_fp = uv1.z < VR_FP_Z; - bool eye2_is_fp = uv2.z < VR_FP_Z; - bool eyes_disagree = eye1_is_fp != eye2_is_fp; - if (eyes_disagree) { - if (eye1_is_fp) - fade1 *= fp_fade1; - if (eye2_is_fp) - fade2 *= fp_fade2; - } - - fade1 *= confidence * edgeFade; - fade2 *= confidence * edgeFade; - - float totalFade = fade1 + fade2 + 1e-5; - float4 blendedColor = (color1 * fade1 + color2 * fade2) / totalFade; - blendedColor.a = max(color1.a * fade1, color2.a * fade2); - return blendedColor; - } - - float4 BlendEyeColors(float2 uv1, float4 color1, float2 uv2, float4 color2, bool dynamicres = false) - { - return BlendEyeColors(float3(uv1, 0), color1, float3(uv2, 0), color2, dynamicres); - } - - /** - * @brief Result of a stereo bilateral reprojection: other-eye pixel coords and blend weight. - */ - struct StereoBilateralResult - { - float2 otherStereoUV; ///< Stereo UV in the other eye - int2 otherPx; ///< Pixel coordinate in the other eye - float blendWeight; ///< [0, maxBlend] bilateral blend weight - bool valid; ///< True if reprojection succeeded - bool backCheckPassed; ///< True if round-trip reprojection validated - }; - - /** - * @brief Reprojects a pixel to the other eye and computes pixel coordinates. - * - * First stage of the stereo bilateral filter from Shi, Billeter, Eisemann 2022. - * Returns the other-eye pixel location; the caller must sample depth at that - * location and call FinalizeStereoBlend to complete the bilateral weight. - * - * @param[in] stereoUV Stereo UV of the source pixel [0,1] - * @param[in] depth Depth at the source pixel - * @param[in] eyeIndex Eye index of the source pixel (0 or 1) - * @param[in] frameDim Dimensions of the buffer (for pixel coord conversion) - * @return StereoBilateralResult with valid=false if reprojection is out of bounds. - */ - StereoBilateralResult ReprojectToOtherEye( - float2 stereoUV, - float depth, - uint eyeIndex, - float2 frameDim) - { - StereoBilateralResult result; - result.otherStereoUV = 0; - result.otherPx = int2(0, 0); - result.blendWeight = 0; - result.valid = false; - result.backCheckPassed = false; - - uint otherEyeIndex = 1 - eyeIndex; - - float2 monoUV = ConvertFromStereoUV(stereoUV, eyeIndex); - float3 otherEyeUV = ConvertMonoUVToOtherEye(float3(monoUV, depth), eyeIndex); - - if (FrameBuffer::IsOutsideFrame(otherEyeUV.xy, false)) - return result; - - result.otherStereoUV = ConvertToStereoUV(otherEyeUV.xy, otherEyeIndex); - result.otherPx = clamp(int2(result.otherStereoUV * frameDim), int2(0, 0), int2(frameDim) - 1); - result.valid = true; - return result; - } - - /** - * @brief Computes bilateral blend weight with depth comparison and back-check. - * - * Second stage of the stereo bilateral filter from Shi, Billeter, Eisemann 2022. - * Compares the sampled depth at the other eye's pixel against the expected depth, - * and performs the back-check (round-trip reprojection validation). - * - * @param[in,out] result Result from ReprojectToOtherEye; blendWeight and backCheckPassed are filled in. - * @param[in] stereoUV Stereo UV of the source pixel (same as passed to ReprojectToOtherEye) - * @param[in] depth Depth at the source pixel - * @param[in] otherEyeDepth Actual depth sampled at the other eye's pixel - * @param[in] eyeIndex Eye index of the source pixel - * @param[in] frameDim Dimensions of the buffer - * @param[in] depthSigma Gaussian sigma for bilateral depth weight - * @param[in] maxBlend Maximum blend factor - * @param[in] backCheckThreshold Max pixel distance for back-check (0 to disable). Default 8.0. - */ - void FinalizeStereoBlend( - inout StereoBilateralResult result, - float2 stereoUV, - float depth, - float otherEyeDepth, - uint eyeIndex, - float2 frameDim, - float depthSigma, - float maxBlend, - float backCheckThreshold = 8.0) - { - // Bilateral weight: compare sampled depth at other eye against source depth - float depthDiff = abs(depth - otherEyeDepth); - float depthWeight = exp(-depthDiff * depthDiff / (depthSigma * depthSigma + 1e-8)); - - // Back-check: reproject Q (in eye B) back to eye A and verify round-trip. - // Two VP matrix multiplications accumulate float32 error (~3-5px at medium range), - // so the threshold must be generous enough to pass valid surfaces while catching - // true occlusion discontinuities (which produce errors of tens to hundreds of pixels). - uint otherEyeIndex = 1 - eyeIndex; - result.backCheckPassed = true; - if (backCheckThreshold > 0) { - float2 otherMonoUV = ConvertFromStereoUV(result.otherStereoUV, otherEyeIndex); - float3 roundTripUV = ConvertMonoUVToOtherEye(float3(otherMonoUV, otherEyeDepth), otherEyeIndex); - float2 roundTripStereoUV = ConvertToStereoUV(roundTripUV.xy, eyeIndex); - float2 pixelDist = abs(roundTripStereoUV * frameDim - (stereoUV * frameDim)); - // Use max component so a large error in either axis triggers the check - result.backCheckPassed = max(pixelDist.x, pixelDist.y) < backCheckThreshold; - if (!result.backCheckPassed) - depthWeight *= 0.1; // Heavily penalize but don't fully reject - } - - result.blendWeight = depthWeight * maxBlend; - } -# endif // VR -#endif // PSHADER - -#ifdef VSHADER - struct VR_OUTPUT - { - float4 VRPosition; - float ClipDistance; - float CullDistance; - }; - - /** - Gets the eyeIndex for VSHADER - @returns eyeIndex (0 left, 1 right) - */ - uint GetEyeIndexVS(uint instanceID = 0) - { -# ifdef VR - return StereoEnabled * (instanceID & 1); -# endif // VR - return 0; - } - - /** - Gets VR Output - @param clipPos clipPosition. Typically the VSHADER position at SV_POSITION0 - @param a_eyeIndex The eyeIndex; 0 is left, 1 is right - @returns VR_OUTPUT with VR values - */ - VR_OUTPUT GetVRVSOutput(float4 clipPos, uint a_eyeIndex = 0) - { - VR_OUTPUT vsout = { - 0.0.xxxx, // VRPosition - 0.0f, // ClipDistance - 0.0f // CullDistance - }; - -# ifdef VR - bool isStereoEnabled = (StereoEnabled != 0); - float2 clipEdges; - - if (isStereoEnabled) { - clipEdges.x = dot(clipPos, EyeClipEdge[a_eyeIndex]); - clipEdges.y = clipEdges.x; // Both use the same calculation - } else { - clipEdges = float2(1.0f, 1.0f); - } - - float stereoAdjustment = 2.0f - StereoEnabled; - float eyeOffset = dot(EyeOffsetScale, Math::IdentityMatrix[a_eyeIndex].xy); - - float xPositionOffset = eyeOffset * clipPos.w * (isStereoEnabled ? 1.0f : 0.0f); - float xPositionBase = stereoAdjustment * clipPos.x; - - vsout.VRPosition.x = xPositionBase * 0.5f + xPositionOffset; - vsout.VRPosition.y = clipPos.y; - vsout.VRPosition.z = clipPos.z; - vsout.VRPosition.w = clipPos.w; - - vsout.ClipDistance = clipEdges.y; - vsout.CullDistance = clipEdges.x; -# endif // VR - return vsout; - } -#endif - -} -#endif //__VR_DEPENDENCY_HLSL__ \ No newline at end of file diff --git a/package/Shaders/DeferredCompositeCS.hlsl b/package/Shaders/DeferredCompositeCS.hlsl index cadbf90424..9075bfc0ba 100644 --- a/package/Shaders/DeferredCompositeCS.hlsl +++ b/package/Shaders/DeferredCompositeCS.hlsl @@ -7,8 +7,6 @@ #include "Common/Shading.hlsli" #include "Common/SharedData.hlsli" #include "Common/Spherical Harmonics/SphericalHarmonics.hlsli" -#include "Common/VR.hlsli" - Texture2D SpecularTexture : register(t0); Texture2D AlbedoTexture : register(t1); Texture2D NormalRoughnessTexture : register(t2); @@ -27,11 +25,6 @@ Texture2D DepthTexture : register(t4); Texture2D DepthTexture : register(t4); #endif -#if defined(VR_STEREO_OPT) -# include "VRStereoOptimizations/modes.hlsli" -Texture2D StereoOptModeTexture : register(t16); -#endif - #if defined(DYNAMIC_CUBEMAPS) Texture2D ReflectanceTexture : register(t5); TextureCube EnvTexture : register(t6); @@ -101,19 +94,6 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, float2 uv = float2(dispatchID.xy + 0.5) * SharedData::BufferDim.zw; uv *= FrameBuffer::DynamicResolutionParams2.xy; // adjust for dynamic res - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - -#if defined(VR_STEREO_OPT) - if (eyeIndex == 1) { - uint mode = StereoOptModeTexture[uint2(dispatchID.xy)] & 0x0F; - if (mode == MODE_MAIN) { // stencil-culled in Eye 1, filled by ReprojectionCS - return; - } - } -#endif - - uv = Stereo::ConvertFromStereoUV(uv, eyeIndex); - float3 normalGlossiness = NormalRoughnessTexture[dispatchID.xy]; float3 normalVS = GBuffer::DecodeNormal(normalGlossiness.xy); @@ -123,16 +103,16 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, float depth = DepthTexture[dispatchID.xy]; float4 positionWS = float4(2 * float2(uv.x, -uv.y + 1) - 1, depth, 1); - positionWS = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], positionWS); + positionWS = mul(FrameBuffer::CameraViewProjInverse, positionWS); positionWS.xyz = positionWS.xyz / positionWS.w; if (depth == 1.0) - MotionVectorsRW[dispatchID.xy] = MotionBlur::GetSSMotionVector(positionWS, positionWS, eyeIndex); // Apply sky motion vectors + MotionVectorsRW[dispatchID.xy] = MotionBlur::GetSSMotionVector(positionWS, positionWS); // Apply sky motion vectors float glossiness = normalGlossiness.z; float3 linDiffuseColor = Color::IrradianceToLinear(diffuseColor); - float3 normalWS = normalize(mul(FrameBuffer::CameraViewInverse[eyeIndex], float4(normalVS, 0)).xyz); + float3 normalWS = normalize(mul(FrameBuffer::CameraViewInverse, float4(normalVS, 0)).xyz); #if defined(SSGI) @@ -155,11 +135,7 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, float3 vanillaDALC = Color::Ambient(max(0, SharedData::GetAmbient(normalWS))); # if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMS = positionWS.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMS = positionWS.xyz; -# endif sh2 skylightingSH = Skylighting::Sample(positionMS.xyz, normalWS); float skylightingDiffuse = Skylighting::EvaluateDiffuse(skylightingSH, normalWS); directionalAmbientColor = ImageBasedLighting::GetDiffuseIBLOccluded(vanillaDALC, -normalWS, skylightingDiffuse) * albedo; @@ -224,11 +200,7 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, float directionalAmbientColorSpecular = Color::RGBToLuminance(Color::Ambient(max(0, SharedData::GetAmbient(R)))) * Color::ReflectionNormalisationScale; # if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMS = positionWS.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMS = positionWS.xyz; -# endif sh2 skylightingSH = Skylighting::Sample(positionMS.xyz, R); float skylightingSpecular = Skylighting::EvaluateSpecular(skylightingSH, specularLobe); @@ -322,10 +294,6 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, #if defined(DEBUG) -# if defined(VR) - uv.x += (eyeIndex ? 0.1 : -0.1); -# endif // VR - if (uv.x < 0.5 && uv.y < 0.5) { color = color; } else if (uv.x < 0.5) { diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index 3e510142a2..5797ee58a1 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -5,8 +5,6 @@ #include "Common/Permutation.hlsli" #include "Common/Random.hlsli" #include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" - #if !defined(DYNAMIC_CUBEMAPS) && defined(IBL) # undef IBL #endif @@ -19,9 +17,6 @@ struct VS_INPUT float4 InstanceData2: TEXCOORD5; float4 InstanceData3: TEXCOORD6; float4 InstanceData4: TEXCOORD7; -#if defined(VR) - uint InstanceID: SV_INSTANCEID; -#endif // VR }; struct VS_OUTPUT @@ -37,11 +32,6 @@ struct VS_OUTPUT #endif // RENDER_DEPTH float4 ViewPosition: POSITION3; -#if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 - uint EyeIndex: EYEIDX0; -#endif // VR }; #ifdef VSHADER @@ -52,25 +42,14 @@ cbuffer PerTechnique : register(b0) cbuffer PerGeometry : register(b2) { -# if !defined(VR) row_major float4x4 WorldViewProj[1] : packoffset(c0); row_major float4x4 World[1] : packoffset(c4); row_major float4x4 PreviousWorld[1] : packoffset(c8); -# else - row_major float4x4 WorldViewProj[2] : packoffset(c0); - row_major float4x4 World[2] : packoffset(c8); - row_major float4x4 PreviousWorld[2] : packoffset(c16); -# endif // !VR }; VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout = (VS_OUTPUT)0; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif // VR - ); float3 scaledModelPosition = input.InstanceData1.www * input.Position.xyz; float3 adjustedModelPosition = 0.0.xxx; @@ -78,28 +57,20 @@ VS_OUTPUT main(VS_INPUT input) adjustedModelPosition.y = dot(input.InstanceData2.yx, scaledModelPosition.xy); adjustedModelPosition.z = scaledModelPosition.z; float4 finalModelPosition = float4(input.InstanceData1.xyz + adjustedModelPosition.xyz, 1.0); - float4 viewPosition = mul(WorldViewProj[eyeIndex], finalModelPosition); + float4 viewPosition = mul(WorldViewProj[0], finalModelPosition); # ifdef RENDER_DEPTH vsout.Depth.xy = viewPosition.zw; vsout.Depth.zw = input.InstanceData2.zw; # else - vsout.WorldPosition = mul(World[eyeIndex], finalModelPosition); - vsout.PreviousWorldPosition = mul(PreviousWorld[eyeIndex], finalModelPosition); + vsout.WorldPosition = mul(World[0], finalModelPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld[0], finalModelPosition); vsout.ViewPosition = viewPosition; # endif // RENDER_DEPTH vsout.Position = viewPosition; vsout.TexCoord = float3(input.TexCoord0.xy, FogParam.z); -# ifdef VR - vsout.EyeIndex = eyeIndex; - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.Position, eyeIndex); - vsout.Position = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR - return vsout; } #endif // VSHADER @@ -125,12 +96,10 @@ SamplerState SampDiffuse : register(s0); Texture2D TexDiffuse : register(t0); -# if !defined(VR) cbuffer AlphaTestRefCB : register(b11) { float AlphaTestRefRS : packoffset(c0); } -# endif // !VR cbuffer PerFrame : register(b12) { @@ -182,10 +151,10 @@ const static float DepthOffsets[16] = { # include "Common/ShadowSampling.hlsli" # if defined(EXP_HEIGHT_FOG) -void ApplyReflectionExponentialHeightFog(inout float3 color, float3 positionWS, float4 screenPosition, uint eyeIndex) +void ApplyReflectionExponentialHeightFog(inout float3 color, float3 positionWS, float4 screenPosition) { float3 fogColor = Color::Fog(AmbientColor.xyz); - float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFogNoVolumetric(positionWS, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, fogColor, float4(screenPosition.xy * FrameBuffer::DynamicResolutionParams2.xy, screenPosition.z, 1)); + float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFogNoVolumetric(positionWS, FrameBuffer::CameraPosAdjust.xyz, fogColor, float4(screenPosition.xy * FrameBuffer::DynamicResolutionParams2.xy, screenPosition.z, 1)); color = lerp(color, exponentialHeightFog.xyz, exponentialHeightFog.w); } # endif @@ -194,11 +163,6 @@ PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout; -# if !defined(VR) - uint eyeIndex = 0; -# else - uint eyeIndex = input.EyeIndex; -# endif // !VR # if defined(EXP_HEIGHT_FOG) const bool inReflection = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection) != 0; # endif @@ -231,25 +195,25 @@ PS_OUTPUT main(PS_INPUT input) } # if defined(DEFERRED) - float3 viewPosition = mul(FrameBuffer::CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float3 viewPosition = mul(FrameBuffer::CameraView, float4(input.WorldPosition.xyz, 1)).xyz; + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); float screenNoise = Random::InterleavedGradientNoise(input.Position.xy, SharedData::FrameCount); float dirShadow = 1; # if defined(SCREEN_SPACE_SHADOWS) - dirShadow = lerp(1.0, ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, eyeIndex), 0.8); + dirShadow = lerp(1.0, ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise), 0.8); # endif if (dirShadow != 0.0) - dirShadow *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + dirShadow *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); float llDirLightMult = (SharedData::linearLightingSettings.enableLinearLighting && !SharedData::linearLightingSettings.isDirLightLinear) ? SharedData::linearLightingSettings.dirLightMult : 1.0f; float3 diffuseColor = Color::DirectionalLight(SharedData::DirLightColor.xyz / max(llDirLightMult, 1e-5), SharedData::linearLightingSettings.isDirLightLinear) * dirShadow * 0.5 * llDirLightMult * Color::VanillaNormalization(); # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - diffuseColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + diffuseColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif @@ -270,26 +234,26 @@ PS_OUTPUT main(PS_INPUT input) # if defined(EXP_HEIGHT_FOG) if (inReflection && SharedData::exponentialHeightFogSettings.enabled) { - ApplyReflectionExponentialHeightFog(psout.Diffuse.xyz, input.WorldPosition.xyz, input.Position, eyeIndex); + ApplyReflectionExponentialHeightFog(psout.Diffuse.xyz, input.WorldPosition.xyz, input.Position); } # endif - psout.MotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); + psout.MotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); - psout.Normal.xy = GBuffer::EncodeNormal(FrameBuffer::WorldToView(normal, false, eyeIndex)); + psout.Normal.xy = GBuffer::EncodeNormal(FrameBuffer::WorldToView(normal, false)); psout.Normal.zw = 0; psout.Albedo = float4(baseColor.xyz, 1); psout.Masks = float4(0, 0, 1, 0); # else - float dirShadow = ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + float dirShadow = ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); float llDirLightMult = (SharedData::linearLightingSettings.enableLinearLighting && !SharedData::linearLightingSettings.isDirLightLinear) ? SharedData::linearLightingSettings.dirLightMult : 1.0f; float3 diffuseColor = Color::DirectionalLight(SharedData::DirLightColor.xyz / max(llDirLightMult, 1e-5), SharedData::linearLightingSettings.isDirLightLinear) * dirShadow * 0.5 * llDirLightMult * Color::VanillaNormalization(); # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - diffuseColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + diffuseColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif @@ -308,7 +272,7 @@ PS_OUTPUT main(PS_INPUT input) float3 color = diffuseColor * baseColor.xyz; # if defined(EXP_HEIGHT_FOG) if (inReflection && SharedData::exponentialHeightFogSettings.enabled) { - ApplyReflectionExponentialHeightFog(color, input.WorldPosition.xyz, input.Position, eyeIndex); + ApplyReflectionExponentialHeightFog(color, input.WorldPosition.xyz, input.Position); } # endif psout.Diffuse = float4(color, 1.0); diff --git a/package/Shaders/Effect.hlsl b/package/Shaders/Effect.hlsl index 2094160a73..d611a20cad 100644 --- a/package/Shaders/Effect.hlsl +++ b/package/Shaders/Effect.hlsl @@ -7,8 +7,6 @@ #include "Common/Random.hlsli" #include "Common/SharedData.hlsli" #include "Common/Skinned.hlsli" -#include "Common/VR.hlsli" - #define EFFECT #if !defined(DYNAMIC_CUBEMAPS) && defined(IBL) @@ -39,9 +37,6 @@ struct VS_INPUT float4 BoneWeights: BLENDWEIGHT0; float4 BoneIndices: BLENDINDICES0; #endif -#if defined(VR) - uint InstanceID: SV_INSTANCEID; -#endif // VR }; struct VS_OUTPUT @@ -87,35 +82,19 @@ struct VS_OUTPUT float3 ScreenSpaceNormal: TEXCOORD7; # endif #endif -#if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 - uint EyeIndex: EYEIDX0; -#endif // VR }; #ifdef VSHADER cbuffer VS_PerFrame : register(b12) { -# if !defined(VR) row_major float4x4 ScreenProj[1] : packoffset(c0); row_major float4x4 ViewProj[1] : packoffset(c8); -# if defined(SKINNED) +# if defined(SKINNED) float3 BonesPivot[1] : packoffset(c40); -# if defined(MOTIONVECTORS_NORMALS) +# if defined(MOTIONVECTORS_NORMALS) float3 PreviousBonesPivot[1] : packoffset(c41); -# endif // MOTIONVECTORS_NORMALS -# endif // SKINNED -# else - row_major float4x4 ScreenProj[2] : packoffset(c0); - row_major float4x4 ViewProj[2] : packoffset(c16); -# if defined(SKINNED) - float3 BonesPivot[2] : packoffset(c80); -# if defined(MOTIONVECTORS_NORMALS) - float3 PreviousBonesPivot[2] : packoffset(c82); -# endif // MOTIONVECTORS_NORMALS -# endif // SKINNED -# endif // VR +# endif // MOTIONVECTORS_NORMALS +# endif // SKINNED }; cbuffer PerTechnique : register(b0) @@ -134,21 +113,12 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) row_major float3x4 World[1] : packoffset(c0); row_major float3x4 PreviousWorld[1] : packoffset(c3); float4 MatProj[3] : packoffset(c6); float4 EyePosition[1] : packoffset(c12); float4 PosAdjust[1] : packoffset(c13); float4 TexcoordOffsetMembrane : packoffset(c14); -# else - row_major float3x4 World[2] : packoffset(c0); - row_major float3x4 PreviousWorld[2] : packoffset(c6); - float4 MatProj[3] : packoffset(c12); - float4 EyePosition[2] : packoffset(c21); - float4 PosAdjust[2] : packoffset(c23); - float4 TexcoordOffsetMembrane : packoffset(c25); -# endif // VR } cbuffer IndexedTexcoordBuffer : register(b11) @@ -190,47 +160,42 @@ float GetProjectedU(float3 worldPosition, float4 texCoordOffset) return abs(0.318309158 * projUvTmp4) * texCoordOffset.w + texCoordOffset.y; } -float GetProjectedV(float3 worldPosition, uint a_eyeIndex = 0) +float GetProjectedV(float3 worldPosition) { - return (-PosAdjust[a_eyeIndex].x + (PosAdjust[a_eyeIndex].z + worldPosition.z)) / PosAdjust[a_eyeIndex].y; + return (-PosAdjust[0].x + (PosAdjust[0].z + worldPosition.z)) / PosAdjust[0].y; } # endif VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif // VR - ); precise float4 inputPosition = float4(input.Position.xyz, 1.0); - precise row_major float4x4 world4x4 = float4x4(World[eyeIndex][0], World[eyeIndex][1], World[eyeIndex][2], float4(0, 0, 0, 1)); + precise row_major float4x4 world4x4 = float4x4(World[0][0], World[0][1], World[0][2], float4(0, 0, 0, 1)); precise float3x3 world3x3 = - transpose(float3x3(transpose(World[eyeIndex])[0], transpose(World[eyeIndex])[1], transpose(World[eyeIndex])[2])); + transpose(float3x3(transpose(World[0])[0], transpose(World[0])[1], transpose(World[0])[2])); # if defined(SKY_OBJECT) - float4x4 viewProj = float4x4(ViewProj[eyeIndex][0], ViewProj[eyeIndex][1], ViewProj[eyeIndex][3], ViewProj[eyeIndex][3]); + float4x4 viewProj = float4x4(ViewProj[0][0], ViewProj[0][1], ViewProj[0][3], ViewProj[0][3]); # else - row_major float4x4 viewProj = ViewProj[eyeIndex]; + row_major float4x4 viewProj = ViewProj[0]; # endif # if defined(SKINNED) precise int4 actualIndices = 765.01.xxxx * input.BoneIndices.xyzw; # if defined(MOTIONVECTORS_NORMALS) float3x4 previousBoneTransformMatrix = - Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot[eyeIndex], input.BoneWeights); + Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot[0], input.BoneWeights); precise float4 previousWorldPosition = float4(mul(inputPosition, transpose(previousBoneTransformMatrix)), 1); # endif float3x4 boneTransformMatrix = - Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot[eyeIndex], input.BoneWeights); + Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot[0], input.BoneWeights); precise float4 worldPosition = float4(mul(inputPosition, transpose(boneTransformMatrix)), 1); float4 viewPos = mul(viewProj, worldPosition); # else - precise float4 worldPosition = float4(mul(World[eyeIndex], inputPosition), 1); - precise float4 previousWorldPosition = float4(mul(PreviousWorld[eyeIndex], inputPosition), 1); + precise float4 worldPosition = float4(mul(World[0], inputPosition), 1); + precise float4 previousWorldPosition = float4(mul(PreviousWorld[0], inputPosition), 1); precise row_major float4x4 modelView = mul(viewProj, world4x4); float4 viewPos = mul(modelView, inputPosition); # endif @@ -299,7 +264,7 @@ VS_OUTPUT main(VS_INPUT input) # if defined(NORMALS) && !defined(MEMBRANE) texCoord.y = dot(MatProj[1].xyz, inputPosition.xyz); # else - texCoord.y = GetProjectedV(worldPosition.xyz, eyeIndex); + texCoord.y = GetProjectedV(worldPosition.xyz); # endif # else # if defined(TEXTURE) @@ -332,7 +297,7 @@ VS_OUTPUT main(VS_INPUT input) float3 eyePosition = 0.0.xxx; # if defined(MEMBRANE) && defined(TEXTURE) && !defined(SKINNED) - eyePosition = EyePosition[eyeIndex].xyz; + eyePosition = EyePosition[0].xyz; # endif float3 viewPosition = inputPosition.xyz; @@ -375,7 +340,7 @@ VS_OUTPUT main(VS_INPUT input) # elif defined(FALLOFF) || (defined(SKINNED) && defined(MEMBRANE)) float3 screenSpaceNormal = worldNormal; # else - float4x4 modelScreen = mul(ScreenProj[eyeIndex], world4x4); + float4x4 modelScreen = mul(ScreenProj[0], world4x4); float3 screenSpaceNormal = normalize(mul(modelScreen, float4(normal, 0))).xyz; # endif @@ -397,13 +362,6 @@ VS_OUTPUT main(VS_INPUT input) vsout.PreviousWorldPosition = previousWorldPosition; # endif -# ifdef VR - vsout.EyeIndex = eyeIndex; - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.Position, eyeIndex); - vsout.Position = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR return vsout; } #endif @@ -451,12 +409,10 @@ struct PS_OUTPUT #ifdef PSHADER -# if !defined(VR) cbuffer AlphaTestRefCB : register(b11) { float AlphaTestRefRS : packoffset(c0); } -# endif // !VR cbuffer PerTechnique : register(b0) { @@ -474,7 +430,6 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) float4 PLightPositionX[1] : packoffset(c0); float4 PLightPositionY[1] : packoffset(c1); float4 PLightPositionZ[1] : packoffset(c2); @@ -487,20 +442,6 @@ cbuffer PerGeometry : register(b2) float4 AlphaTestRef : packoffset(c9); float4 MembraneRimColor : packoffset(c10); float4 MembraneVars : packoffset(c11); -# else - float4 PLightPositionX[2] : packoffset(c0); - float4 PLightPositionY[2] : packoffset(c2); - float4 PLightPositionZ[2] : packoffset(c4); - float4 PLightingRadiusInverseSquared : packoffset(c6); - float4 PLightColorR : packoffset(c7); - float4 PLightColorG : packoffset(c8); - float4 PLightColorB : packoffset(c9); - float4 DLightColor : packoffset(c10); - float4 PropertyColor : packoffset(c11); // VR should be 11; this could start earlier though - float4 AlphaTestRef : packoffset(c12); - float4 MembraneRimColor : packoffset(c13); - float4 MembraneVars : packoffset(c14); -# endif }; # if defined(LIGHT_LIMIT_FIX) @@ -566,7 +507,7 @@ void ExtractEffectLighting(float3 inputColor, out float3 dirColor, out float3 am } # if defined(LIGHTING) -float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPosition, uint eyeIndex, inout float shadowVariance) +float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPosition, inout float shadowVariance) { float3 color = DLightColor.xyz * Color::EffectLightingMult(); bool suppressExternalEmittance = SharedData::InInterior && (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::SuppressExternalEmittance); @@ -577,11 +518,7 @@ float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPo # if defined(SKYLIGHTING) float skylightingDiffuse = 1.0; if (!SharedData::InInterior) { -# if defined(VR) - float3 positionMSSkylight = worldPosition + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMSSkylight = worldPosition; -# endif sh2 skylightingSH = Skylighting::SampleNoBias(positionMSSkylight); skylightingDiffuse = Skylighting::EvaluateDiffuse(skylightingSH, float3(0, 0, 1), Skylighting::GetFadeOutFactor(positionMSSkylight)); @@ -604,7 +541,7 @@ float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPo const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); if (inWorld && ShadowSampling::HasDirectionalShadows()) - dirShadow = ShadowSampling::Get3DFilteredShadow(worldPosition.xyz, viewDirection, screenPosition, eyeIndex, unusedSurfaceShadow); + dirShadow = ShadowSampling::Get3DFilteredShadow(worldPosition.xyz, viewDirection, screenPosition, unusedSurfaceShadow); shadowVariance = 1.0 - sqrt(saturate(fwidth(dirShadow))); @@ -612,7 +549,7 @@ float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPo # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - dirColor *= ExponentialHeightFog::GetSunlightFogAttenuation(worldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + dirColor *= ExponentialHeightFog::GetSunlightFogAttenuation(worldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif @@ -633,7 +570,7 @@ float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPo if (!(Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld)) # endif { - float4 lightDistanceSquared = (PLightPositionX[eyeIndex] - msPosition.xxxx) * (PLightPositionX[eyeIndex] - msPosition.xxxx) + (PLightPositionY[eyeIndex] - msPosition.yyyy) * (PLightPositionY[eyeIndex] - msPosition.yyyy) + (PLightPositionZ[eyeIndex] - msPosition.zzzz) * (PLightPositionZ[eyeIndex] - msPosition.zzzz); + float4 lightDistanceSquared = (PLightPositionX[0] - msPosition.xxxx) * (PLightPositionX[0] - msPosition.xxxx) + (PLightPositionY[0] - msPosition.yyyy) * (PLightPositionY[0] - msPosition.yyyy) + (PLightPositionZ[0] - msPosition.zzzz) * (PLightPositionZ[0] - msPosition.zzzz); float4 lightFadeMul = 1.0.xxxx - saturate(PLightingRadiusInverseSquared * lightDistanceSquared); color.x += dot(Color::PointLight(PLightColorR.xxx).x * lightFadeMul * Color::EffectLightingMult(), 1.0.xxxx); color.y += dot(Color::PointLight(PLightColorG.xxx).x * lightFadeMul * Color::EffectLightingMult(), 1.0.xxxx); @@ -643,7 +580,7 @@ float3 GetLightingColor(float3 msPosition, float3 worldPosition, float2 screenPo return color; } # else -float3 GetLightingShadow(float3 color, float3 worldPosition, float2 screenPosition, float depth, uint eyeIndex, inout float shadowVariance) +float3 GetLightingShadow(float3 color, float3 worldPosition, float2 screenPosition, float depth, inout float shadowVariance) { float3 dirColor; float3 ambientColor; @@ -679,7 +616,7 @@ float3 GetLightingShadow(float3 color, float3 worldPosition, float2 screenPositi for (uint i = 0; i < sampleCount; i++) { float t = (float(i) + noise) * rcpSampleCount; float3 samplePositionWS = lerp(startPosition, endPosition, t); - shadow += ShadowSampling::GetWorldShadow(samplePositionWS, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + shadow += ShadowSampling::GetWorldShadow(samplePositionWS, FrameBuffer::CameraPosAdjust.xyz); } shadow *= rcpSampleCount; } @@ -690,7 +627,7 @@ float3 GetLightingShadow(float3 color, float3 worldPosition, float2 screenPositi # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - dirColor *= ExponentialHeightFog::GetSunlightFogAttenuation(worldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + dirColor *= ExponentialHeightFog::GetSunlightFogAttenuation(worldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif @@ -702,12 +639,6 @@ PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout = (PS_OUTPUT)0; -# if !defined(VR) - uint eyeIndex = 0; -# else - uint eyeIndex = input.EyeIndex; -# endif // !VR - float4 fogMul = 1; # if !defined(MULTBLEND) fogMul.xyz = input.FogAlpha; @@ -757,13 +688,13 @@ PS_OUTPUT main(PS_INPUT input) float shadowVariance = 1.0; # if defined(LIGHTING) - propertyColor = GetLightingColor(input.MSPosition.xyz, input.WorldPosition.xyz, input.Position.xy, eyeIndex, shadowVariance); + propertyColor = GetLightingColor(input.MSPosition.xyz, input.WorldPosition.xyz, input.Position.xy, shadowVariance); # if defined(LIGHT_LIMIT_FIX) uint lightCount = 0; - float3 viewPosition = mul(FrameBuffer::CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float3 viewPosition = mul(FrameBuffer::CameraView, float4(input.WorldPosition.xyz, 1)).xyz; + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); bool inWorld = Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld; uint clusterIndex = 0; @@ -777,7 +708,7 @@ PS_OUTPUT main(PS_INPUT input) if (LightLimitFix::IsLightIgnored(light) || light.lightFlags & LightLimitFix::LightFlags::Shadow) { continue; } - float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) @@ -885,7 +816,7 @@ PS_OUTPUT main(PS_INPUT input) # if !defined(LIGHTING) && defined(VC) && defined(TEXCOORD) && defined(NORMALS) && defined(TEXTURE) && defined(FALLOFF) && defined(SOFT) if (Permutation::PixelShaderDescriptor & Permutation::EffectFlags::GrayscaleToAlpha && lightingInfluence == 1.0) - lightColor = GetLightingShadow(lightColor, input.WorldPosition.xyz, input.Position.xy, depth, eyeIndex, shadowVariance); + lightColor = GetLightingShadow(lightColor, input.WorldPosition.xyz, input.Position.xy, depth, shadowVariance); # endif lightColor = Color::EffectMult(lightColor); @@ -903,7 +834,7 @@ PS_OUTPUT main(PS_INPUT input) float3 vanillaFogColor = fogColor; float expFogFactor = 0; if (SharedData::exponentialHeightFogSettings.enabled) { - float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, fogColor, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); + float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, fogColor, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); expFogFactor = exponentialHeightFog.w; # if defined(ADDBLEND) || defined(MULTBLEND) || defined(MULTBLEND_DECAL) fogColor = exponentialHeightFog.xyz; @@ -974,7 +905,7 @@ PS_OUTPUT main(PS_INPUT input) float3 screenSpaceNormal = normalize(input.ScreenSpaceNormal); # endif psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), 0.0, psout.Diffuse.w); - float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); + float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); psout.MotionVectors = float4(screenMotionVector, 0.0, psout.Diffuse.w); # endif @@ -991,7 +922,7 @@ PS_OUTPUT main(PS_INPUT input) # endif # elif defined(MOTIONVECTORS_NORMALS) - float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); + float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); psout.MotionVectors = screenMotionVector; # if (defined(MEMBRANE) && defined(SKINNED) && defined(NORMALS)) diff --git a/package/Shaders/ISApplyVolumetricLighting.hlsl b/package/Shaders/ISApplyVolumetricLighting.hlsl index 6d42ead969..aa5d9d0dd1 100644 --- a/package/Shaders/ISApplyVolumetricLighting.hlsl +++ b/package/Shaders/ISApplyVolumetricLighting.hlsl @@ -1,6 +1,5 @@ #include "Common/DummyVSTexCoord.hlsl" #include "Common/FrameBuffer.hlsli" -#include "Common/VR.hlsli" typedef VS_OUTPUT PS_INPUT; @@ -39,12 +38,6 @@ PS_OUTPUT main(PS_INPUT input) float2 screenPosition = FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(input.TexCoord); float depth = DepthTex.Sample(DepthSampler, screenPosition).x; -# ifdef VR - if (depth < 0.0001) { // not a valid location - psout.VL = 0.0; - return psout; - } -# endif float repartition = clamp(RepartitionTex.SampleLevel(RepartitionSampler, depth, 0).x, 0, 0.9999); float vl = g_IntensityX_TemporalY.x * VLTex.SampleLevel(VLSampler, float3(input.TexCoord, repartition), 0).x; @@ -54,33 +47,11 @@ PS_OUTPUT main(PS_INPUT input) if (0.001 < g_IntensityX_TemporalY.y) { float2 motionVector = MotionVectorsTex.Sample(MotionVectorsSampler, screenPosition).xy; -# ifdef VR - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(input.TexCoord); - float2 previousTexCoord = Stereo::ConvertFromStereoUV(input.TexCoord, eyeIndex); - previousTexCoord += motionVector; - bool isValid = previousTexCoord.x >= 0 && previousTexCoord.x < 1 && previousTexCoord.y >= 0 && previousTexCoord.y < 1; - previousTexCoord = Stereo::ConvertToStereoUV(previousTexCoord, eyeIndex); -# else float2 previousTexCoord = input.TexCoord + motionVector; bool isValid = previousTexCoord.x >= 0 && previousTexCoord.x < 1 && previousTexCoord.y >= 0 && previousTexCoord.y < 1; -# endif float2 previousScreenPosition = FrameBuffer::GetPreviousDynamicResolutionAdjustedScreenPosition(previousTexCoord); float previousVl = PreviousFrameTex.Sample(PreviousFrameSampler, previousScreenPosition).x; - float previousDepth = PreviousDepthTex.Sample(PreviousDepthSampler, -# ifndef VR - previousScreenPosition -# else - // In VR with dynamic resolution enabled, there's a bug with the depth stencil. - // The depth stencil from ISDepthBufferCopy is actually full size and not scaled. - // Thus there's never a need to scale it down. - previousTexCoord -# endif - ) - .x; - -# ifdef VR - isValid = isValid && abs(previousDepth) > 0.0001; -# endif + float previousDepth = PreviousDepthTex.Sample(PreviousDepthSampler, previousScreenPosition).x; float temporalContribution = g_IntensityX_TemporalY.y * (1 - smoothstep(0, 1, min(1, 100 * abs(depth - previousDepth)))); psout.VL = lerp(adjustedVl, previousVl, temporalContribution * isValid); diff --git a/package/Shaders/ISFullScreenVR.hlsl b/package/Shaders/ISFullScreenVR.hlsl deleted file mode 100644 index 455602e3c9..0000000000 --- a/package/Shaders/ISFullScreenVR.hlsl +++ /dev/null @@ -1,69 +0,0 @@ -#include "Common/DummyVSTexCoord.hlsl" -#include "Common/VR.hlsli" - -typedef VS_OUTPUT PS_INPUT; - -struct PS_OUTPUT -{ - float4 Color: SV_Target0; // Final color output for the pixel shader. -}; - -#if defined(PSHADER) -SamplerState ImageSampler : register(s0); // Sampler state for texture sampling. -Texture2D ImageTex : register(t0); // Texture to sample colors from. - -cbuffer PerGeometry : register(b2) -{ - float4 FullScreenColor; // Color applied to the final output, used for tinting or blending effects. - float4 Params0; // General parameters; may include scaling or offset values. - float4 Params1; // Length parameters for scaling or thresholding; Params1.z represents `g_flTime`. - float4 UpsampleParams; // Dynamic resolution parameters: - // - UpsampleParams.x: fDynamicResolutionWidthRatio - // - UpsampleParams.y: fDynamicResolutionHeightRatio - // - UpsampleParams.z: fDynamicResolutionPreviousWidthRatio - // - UpsampleParams.w: fDynamicResolutionPreviousHeightRatio -}; - -// Function to generate noise using Valve's ScreenSpaceDither method. -// References: -// - https://blog.frost.kiwi/GLSL-noise-and-radial-gradient/ -// - https://media.steampowered.com/apps/valve/2015/Alex_Vlachos_Advanced_VR_Rendering_GDC2015.pdf -float3 ScreenSpaceDither(float2 vScreenPos) -{ - // Iestyn's RGB dither (7 asm instructions) from Portal 2 X360, - // slightly modified for VR applications. - float3 vDither = dot(float2(171.0, 231.0), vScreenPos.xy + Params1.zz).xxx; - vDither.rgb = frac(vDither.rgb / float3(103.0, 71.0, 97.0)) - float3(0.5, 0.5, 0.5); - return (vDither.rgb / 255.0) * 0.375; // Normalize dither values to a suitable range. -} - -PS_OUTPUT main(PS_INPUT input) -{ - PS_OUTPUT psout; - - float2 uv = input.TexCoord; // Get the UV coordinates from input. - - // Convert UV to normalized screen space [-1, 1]. - float2 normalizedScreenCoord = Stereo::ConvertUVToNormalizedScreenSpace(uv); - - // Calculate the length of the normalized screen coordinates. - float normalizedLength = saturate(Params1.x * (length(normalizedScreenCoord) - Params1.y) * Params0.x); - - // Upsample and clamp texture coordinates based on dynamic resolution. - float2 uvScaled = min(UpsampleParams.zw, UpsampleParams.xy * uv.xy); // Clamp UVs to prevent overflow. - float3 sampledColor = ImageTex.Sample(ImageSampler, uvScaled).xyz; // Sample color from the texture. - - // Manipulate the sampled color based on the normalized length. - float3 finalColor = sampledColor * (1.0 + normalizedLength); // Scale sampled color. - - // Generate noise to apply to the final color. - float3 noise = ScreenSpaceDither(input.Position.xy); - finalColor += Params0.yyy * noise * Params1.www; // Adjust final color with noise. - - // Final color manipulation: blend final color with FullScreenColor. - psout.Color.xyz = lerp(finalColor, FullScreenColor.xyz, FullScreenColor.www); // Blend based on the alpha component. - psout.Color.w = 1.0; // Set alpha to full opacity. - - return psout; // Return the pixel shader output. -} -#endif diff --git a/package/Shaders/ISReflectionsRayTracing.hlsl b/package/Shaders/ISReflectionsRayTracing.hlsl index 0f9c45d397..9e7604a6a2 100644 --- a/package/Shaders/ISReflectionsRayTracing.hlsl +++ b/package/Shaders/ISReflectionsRayTracing.hlsl @@ -2,7 +2,6 @@ #include "Common/FrameBuffer.hlsli" #include "Common/MotionBlur.hlsli" #include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" typedef VS_OUTPUT PS_INPUT; @@ -33,20 +32,19 @@ static const int binaryIterations = ceil(log2(iterations)); static const float rayLength = 1.0; -float2 ConvertRaySample(float2 raySample, uint eyeIndex) +float2 ConvertRaySample(float2 raySample) { - return FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(Stereo::ConvertToStereoUV(raySample, eyeIndex)); + return FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(raySample); } -float2 ConvertRaySamplePrevious(float2 raySample, uint eyeIndex) +float2 ConvertRaySamplePrevious(float2 raySample) { - return FrameBuffer::GetPreviousDynamicResolutionAdjustedScreenPosition(Stereo::ConvertToStereoUV(raySample, eyeIndex)); + return FrameBuffer::GetPreviousDynamicResolutionAdjustedScreenPosition(raySample); } float4 GetReflectionColor( float3 projReflectionDirection, - float3 projPosition, - uint eyeIndex) + float3 projPosition) { float3 prevRaySample; float3 raySample = projPosition; @@ -55,27 +53,24 @@ float4 GetReflectionColor( prevRaySample = raySample; raySample = projPosition + (float(i) / float(iterations)) * projReflectionDirection; - float2 sampleUV; - uint sampleEyeIndex; - Stereo::ResolveMonoUVForEye(raySample, eyeIndex, sampleUV, sampleEyeIndex); + float2 sampleUV = raySample.xy; if (FrameBuffer::IsOutsideFrame(sampleUV)) return 0.0; - float iterationDepth = DepthTex.SampleLevel(DepthSampler, ConvertRaySample(sampleUV, sampleEyeIndex), 0).x; + float iterationDepth = DepthTex.SampleLevel(DepthSampler, ConvertRaySample(sampleUV), 0).x; if (saturate((raySample.z - iterationDepth) / SSRParams.y) > 0.0) { float3 binaryMinRaySample = prevRaySample; float3 binaryMaxRaySample = raySample; float3 binaryRaySample = raySample; float depthThicknessFactor; - uint hitEyeIndex = sampleEyeIndex; for (int k = 0; k < binaryIterations; k++) { binaryRaySample = lerp(binaryMinRaySample, binaryMaxRaySample, 0.5); - Stereo::ResolveMonoUVForEye(binaryRaySample, eyeIndex, sampleUV, hitEyeIndex); - iterationDepth = DepthTex.SampleLevel(DepthSampler, ConvertRaySample(sampleUV, hitEyeIndex), 0).x; + sampleUV = binaryRaySample.xy; + iterationDepth = DepthTex.SampleLevel(DepthSampler, ConvertRaySample(sampleUV), 0).x; // Compute expected depth vs actual depth depthThicknessFactor = 1.0 - saturate(abs(binaryRaySample.z - iterationDepth) / SSRParams.y); @@ -91,17 +86,8 @@ float4 GetReflectionColor( float2 uvResultScreenCenterOffset = binaryRaySample.xy - 0.5; -# ifdef VR float2 centerDistance = abs(uvResultScreenCenterOffset.xy * 2.0); - // Make VR fades consistent by taking the closer of the two eyes - // Based on concepts from https://cuteloong.github.io/publications/scssr24/ - float2 otherEyeUvResultScreenCenterOffset = Stereo::ConvertMonoUVToOtherEye(float3(binaryRaySample.xy, iterationDepth), eyeIndex).xy - 0.5; - centerDistance = min(centerDistance, abs(otherEyeUvResultScreenCenterOffset * 2.0)); -# else - float2 centerDistance = abs(uvResultScreenCenterOffset.xy * 2.0); -# endif - // Fade out around screen edges float centerDistanceFadeFactorX = smoothstep(0.0, 0.1, saturate(1.0 - centerDistance.x)); float centerDistanceFadeFactorY = smoothstep(0.0, 0.5, saturate(1.0 - centerDistance.y)); @@ -109,21 +95,18 @@ float4 GetReflectionColor( float fadeFactor = depthThicknessFactor * ssrMarchingRadiusFadeFactor * centerDistanceFadeFactorX * centerDistanceFadeFactorY; if (fadeFactor > 0.0) { - // Resolve final UV in the eye that owns the hit - float2 finalSampleUV; - uint finalEyeIndex; - Stereo::ResolveMonoUVForEye(float3(binaryRaySample.xy, iterationDepth), eyeIndex, finalSampleUV, finalEyeIndex); + float2 finalSampleUV = binaryRaySample.xy; - float3 color = ColorTex.SampleLevel(ColorSampler, ConvertRaySample(finalSampleUV, finalEyeIndex), 0).xyz; + float3 color = ColorTex.SampleLevel(ColorSampler, ConvertRaySample(finalSampleUV), 0).xyz; // Final sample to world-space float4 positionWS = float4(float2(finalSampleUV.x, 1.0 - finalSampleUV.y) * 2.0 - 1.0, iterationDepth, 1.0); - positionWS = mul(FrameBuffer::CameraViewProjInverse[finalEyeIndex], positionWS); + positionWS = mul(FrameBuffer::CameraViewProjInverse, positionWS); positionWS.xyz = positionWS.xyz / positionWS.w; positionWS.w = 1.0; // Compute camera motion vector - float2 cameraMotionVector = MotionBlur::GetSSMotionVector(positionWS, positionWS, finalEyeIndex); + float2 cameraMotionVector = MotionBlur::GetSSMotionVector(positionWS, positionWS); // Reproject alpha from previous frame float2 reprojectedRaySample = finalSampleUV + cameraMotionVector; @@ -131,7 +114,7 @@ float4 GetReflectionColor( // Check that the reprojected data is within the frame if (!FrameBuffer::IsOutsideFrame(reprojectedRaySample.xy)) - alpha = float4(AlphaTex.SampleLevel(AlphaSampler, ConvertRaySamplePrevious(reprojectedRaySample.xy, finalEyeIndex), 0).xyz, 1.0); + alpha = float4(AlphaTex.SampleLevel(AlphaSampler, ConvertRaySamplePrevious(reprojectedRaySample.xy), 0).xyz, 1.0); float3 reflectionColor = color + SSRParams.z * alpha.xyz * alpha.w; return float4(reflectionColor, fadeFactor); @@ -154,12 +137,9 @@ PS_OUTPUT main(PS_INPUT input) return psout; # endif - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(input.TexCoord); float2 uv = input.TexCoord; float2 screenPosition = FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(uv); - uv = Stereo::ConvertFromStereoUV(uv, eyeIndex); - [branch] if (NormalTex.Sample(NormalSampler, screenPosition).z <= 0) { return psout; @@ -170,7 +150,7 @@ PS_OUTPUT main(PS_INPUT input) float depth = DepthTex.SampleLevel(DepthSampler, screenPosition, 0).x; float4 positionVS = float4(float2(uv.x, 1.0 - uv.y) * 2.0 - 1.0, depth, 1.0); - positionVS = mul(FrameBuffer::CameraProjInverse[eyeIndex], positionVS); + positionVS = mul(FrameBuffer::CameraProjInverse, positionVS); positionVS.xyz = positionVS.xyz / positionVS.w; float3 viewPosition = positionVS.xyz; @@ -184,14 +164,14 @@ PS_OUTPUT main(PS_INPUT input) } float4 reflectionPosition = float4(viewPosition + reflectionDirection, 1.0); - float4 projReflectionPosition = mul(FrameBuffer::CameraProj[eyeIndex], reflectionPosition); + float4 projReflectionPosition = mul(FrameBuffer::CameraProj, reflectionPosition); projReflectionPosition /= projReflectionPosition.w; projReflectionPosition.xy = projReflectionPosition.xy * float2(0.5, -0.5) + float2(0.5, 0.5); float3 projPosition = float3(uv, depth); float3 projReflectionDirection = normalize(projReflectionPosition.xyz - projPosition) * rayLength; - psout.Color = GetReflectionColor(projReflectionDirection, projPosition, eyeIndex); + psout.Color = GetReflectionColor(projReflectionDirection, projPosition); return psout; } diff --git a/package/Shaders/ISSAOComposite.hlsl b/package/Shaders/ISSAOComposite.hlsl index ecaf54ce1e..90e9edf6a8 100644 --- a/package/Shaders/ISSAOComposite.hlsl +++ b/package/Shaders/ISSAOComposite.hlsl @@ -157,13 +157,11 @@ PS_OUTPUT main(PS_INPUT input) } float snowMask = 0; -# if !defined(VR) if (EyePosition.w != 0) { float2 specSnow = snowSpecAlphaTex.Sample(snowSpecAlphaSampler, screenPosition).xy; composedColor.xyz += specSnow.x * specSnow.y; snowMask = specSnow.y; } -# endif # if defined(APPLY_SAO) if (EyePosition.w != 0 && 1e-5 < snowMask) { @@ -189,15 +187,14 @@ PS_OUTPUT main(PS_INPUT input) # endif # if defined(EXP_HEIGHT_FOG) bool exponentialHeightFogEnabled = SharedData::exponentialHeightFogSettings.enabled; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(input.TexCoord.xy); - float2 monoUV = Stereo::ConvertFromStereoUV(input.TexCoord.xy, eyeIndex); + float2 monoUV = input.TexCoord.xy; float4 positionWS = float4(2 * float2(monoUV.x, -monoUV.y + 1) - 1, depth, 1); - positionWS = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], positionWS); + positionWS = mul(FrameBuffer::CameraViewProjInverse, positionWS); positionWS.xyz = positionWS.xyz / positionWS.w; float4 exponentialHeightFog = (float4)0; if (exponentialHeightFogEnabled) { - float4 fogScreenPosition = float4(Stereo::ConvertToStereoUV(monoUV, eyeIndex) * SharedData::BufferDim.xy, depth, 1.0f); - exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(positionWS.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, fogColor, fogScreenPosition); + float4 fogScreenPosition = float4(monoUV * SharedData::BufferDim.xy, depth, 1.0f); + exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(positionWS.xyz, FrameBuffer::CameraPosAdjust.xyz, fogColor, fogScreenPosition); } if (isGeometryDepth || exponentialHeightFogEnabled) { float fogFade = exponentialHeightFogEnabled ? ExponentialHeightFog::GetVanillaFogFade(FogNearColor.w) : FogNearColor.w; @@ -220,16 +217,15 @@ PS_OUTPUT main(PS_INPUT input) # endif # endif -# if !defined(VR) float sparklesInput = 0; if (EyePosition.w != 0 && snowMask != 0 && 1e-5 < SparklesParameters2.z) { float shadowMask = shadowMaskTex.SampleLevel(shadowMaskSampler, screenPosition, 0).x; float4 vsPosition = float4(2 * input.TexCoord.x - 1, 1 - 2 * input.TexCoord.y, depth, 1); - float4 csPosition = mul(FrameBuffer::CameraViewProjInverse[0], vsPosition); + float4 csPosition = mul(FrameBuffer::CameraViewProjInverse, vsPosition); csPosition.xyz /= csPosition.w; - csPosition.xyz += FrameBuffer::CameraPosAdjust[0].xyz; + csPosition.xyz += FrameBuffer::CameraPosAdjust.xyz; float3 noiseSeed = 0.07 * (SparklesParameters2.x * csPosition.xyz); float noiseValue = 0.5 * (SimplexNoise(noiseSeed) + 1); @@ -248,7 +244,6 @@ PS_OUTPUT main(PS_INPUT input) composedColor *= 1 - SparklesParameters2.w; composedColor += sparklesColor; -# endif psout.Color = composedColor; diff --git a/package/Shaders/ISSAOMinify.hlsl b/package/Shaders/ISSAOMinify.hlsl index e82377f61c..3e8a31211c 100644 --- a/package/Shaders/ISSAOMinify.hlsl +++ b/package/Shaders/ISSAOMinify.hlsl @@ -44,7 +44,7 @@ PS_OUTPUT main(PS_INPUT input) float2 drAdjustedTexCoord = FrameBuffer::DynamicResolutionParams1.xy * input.TexCoord; float2 minifiedTexCoord = GetMinifiedTexCoord(drAdjustedTexCoord); finalTexCoord = clamp(minifiedTexCoord, 0, - FrameBuffer::DynamicResolutionParams1.xy - float2(FrameBuffer::CameraPreviousPosAdjust[0].w, 0)); + FrameBuffer::DynamicResolutionParams1.xy - float2(FrameBuffer::CameraPreviousPosAdjust.w, 0)); } else { finalTexCoord = GetMinifiedTexCoord(input.TexCoord); } diff --git a/package/Shaders/ISTemporalAA.hlsl b/package/Shaders/ISTemporalAA.hlsl index 332b9ebfe5..75950ba853 100644 --- a/package/Shaders/ISTemporalAA.hlsl +++ b/package/Shaders/ISTemporalAA.hlsl @@ -513,11 +513,7 @@ PS_OUTPUT main(PS_INPUT input) # else feedbackOut.x = saturate(sampleUV.x * motionReject.z); # endif -# if defined(VR) - colorOut.w = motionReject.x ? 1 : 0; -# else colorOut.w = 1; -# endif feedbackOut.w = 1; # ifdef HDR_OUTPUT diff --git a/package/Shaders/ISVolumetricLightingGenerateCS.hlsl b/package/Shaders/ISVolumetricLightingGenerateCS.hlsl index 7053aedfee..ec34b546c2 100644 --- a/package/Shaders/ISVolumetricLightingGenerateCS.hlsl +++ b/package/Shaders/ISVolumetricLightingGenerateCS.hlsl @@ -1,6 +1,5 @@ #include "Common/Math.hlsli" #include "Common/Random.hlsli" -#include "Common/VR.hlsli" #if defined(CSHADER) SamplerState ShadowmapSampler : register(s0); @@ -24,7 +23,6 @@ RWTexture3D DensityRW : register(u0); cbuffer PerTechnique : register(b0) { -# ifndef VR row_major float4x4 CameraViewProj[1] : packoffset(c0); row_major float4x4 CameraViewProjInverse[1] : packoffset(c4); float4x3 ShadowMapProj[1][3] : packoffset(c8); @@ -40,23 +38,6 @@ cbuffer PerTechnique : register(b0) float PhaseContribution : packoffset(c23.x); float PhaseScattering : packoffset(c23.y); float DensityContribution : packoffset(c23.z); -# else - row_major float4x4 CameraViewProj[2] : packoffset(c0); - row_major float4x4 CameraViewProjInverse[2] : packoffset(c8); - float4x3 ShadowMapProj[2][3] : packoffset(c16); - float3 EndSplitDistances : packoffset(c34.x); - float ShadowMapCount : packoffset(c34.w); - float EnableShadowCasting : packoffset(c35.x); - float3 DirLightDirection : packoffset(c36); - float3 TextureDimensions : packoffset(c37); - float3 WindInput[2] : packoffset(c38); - float InverseDensityScale : packoffset(c39.w); - float3 PosAdjust[2] : packoffset(c40); - float IterationIndex : packoffset(c41.w); - float PhaseContribution : packoffset(c42.x); - float PhaseScattering : packoffset(c42.y); - float DensityContribution : packoffset(c42.z); -# endif } [numthreads(32, 32, 1)] void main(uint3 dispatchID : SV_DispatchThreadID) { @@ -72,16 +53,14 @@ cbuffer PerTechnique : register(b0) }; float3 normalizedCoordinates = float3(dispatchID.xy + 0.5, dispatchID.z - 1.0) * rcp(TextureDimensions.xyz); - float2 uv = normalizedCoordinates.xy; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - float3 depthUv = Stereo::ConvertFromStereoUV(normalizedCoordinates, eyeIndex) + StepCoefficients[IterationIndex]; + float3 depthUv = normalizedCoordinates + StepCoefficients[IterationIndex]; float depth = InverseRepartitionTex.SampleLevel(InverseRepartitionSampler, depthUv.z, 0); float4 positionCS = float4(2 * depthUv.x - 1, 1 - 2 * depthUv.y, depth, 1); - float4 positionWS = mul(CameraViewProjInverse[eyeIndex], positionCS); + float4 positionWS = mul(CameraViewProjInverse[0], positionCS); positionWS *= rcp(positionWS.w); - float4 positionCSShifted = mul(CameraViewProj[eyeIndex], positionWS); + float4 positionCSShifted = mul(CameraViewProj[0], positionWS); positionCSShifted *= rcp(positionCSShifted.w); float shadowMapDepth = positionCSShifted.z; @@ -91,7 +70,7 @@ cbuffer PerTechnique : register(b0) uint cascadeIndex = ShadowMapCount >= 3.0f && shadowMapDepth > EndSplitDistances.y ? 2 : shadowMapDepth > EndSplitDistances.x ? 1 : 0; float shadowMapThreshold = cascadeIndex == 0 ? 0.01f : 0.0f; - float4x3 lightProjectionMatrix = ShadowMapProj[eyeIndex][cascadeIndex]; + float4x3 lightProjectionMatrix = ShadowMapProj[0][cascadeIndex]; float3 positionLS = mul(transpose(lightProjectionMatrix), float4(positionWS.xyz, 1)).xyz; float shadowMapValue = ShadowmapTex.SampleLevel(ShadowmapSampler, float3(positionLS.xy, cascadeIndex), 0); @@ -103,7 +82,7 @@ cbuffer PerTechnique : register(b0) } } - float3 noiseUv = 0.0125 * (InverseDensityScale * (positionWS.xyz + WindInput[eyeIndex])); + float3 noiseUv = 0.0125 * (InverseDensityScale * (positionWS.xyz + WindInput[0])); float noise = NoiseTex.SampleLevel(NoiseSampler, noiseUv, 0); float densityFactor = noise * (1 - 0.75 * smoothstep(0, 1, saturate(2 * positionWS.z / 300))); float densityContribution = lerp(1, densityFactor, DensityContribution); @@ -115,7 +94,7 @@ cbuffer PerTechnique : register(b0) float shadowContribution = noShadow; # if defined(TERRAIN_SHADOWS) || defined(CLOUD_SHADOWS) - shadowContribution *= sqrt(ShadowSampling::GetWorldShadow(positionWS.xyz, PosAdjust[eyeIndex], eyeIndex)); + shadowContribution *= sqrt(ShadowSampling::GetWorldShadow(positionWS.xyz, PosAdjust[0], 0)); # endif float vl = shadowContribution * densityContribution * phaseContribution; diff --git a/package/Shaders/ISWaterBlend.hlsl b/package/Shaders/ISWaterBlend.hlsl index f3d9018d4a..6b8e256002 100644 --- a/package/Shaders/ISWaterBlend.hlsl +++ b/package/Shaders/ISWaterBlend.hlsl @@ -1,7 +1,6 @@ #include "Common/DummyVSTexCoord.hlsl" #include "Common/FrameBuffer.hlsli" #include "Common/Math.hlsli" -#include "Common/VR.hlsli" typedef VS_OUTPUT PS_INPUT; @@ -43,7 +42,6 @@ namespace WaterBlend PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(input.TexCoord); float2 adjustedScreenPosition = FrameBuffer::GetDynamicResolutionAdjustedScreenPosition(input.TexCoord); float waterMask = waterMaskTex.Sample(waterMaskSampler, adjustedScreenPosition).z; if (waterMask < WaterBlend::WaterMaskThreshold) { @@ -52,17 +50,14 @@ PS_OUTPUT main(PS_INPUT input) float3 sourceColor = sourceTex.Sample(sourceSampler, adjustedScreenPosition).xyz; float2 motion = motionBufferTex.Sample(motionBufferSampler, adjustedScreenPosition).xy; - float2 motionScreenPosition = Stereo::ConvertToStereoUV(Stereo::ConvertFromStereoUV(input.TexCoord, eyeIndex) + motion, eyeIndex); + float2 motionScreenPosition = input.TexCoord + motion; float2 motionAdjustedScreenPosition = FrameBuffer::GetPreviousDynamicResolutionAdjustedScreenPosition(motionScreenPosition); float4 waterHistory = waterHistoryTex.Sample(waterHistorySampler, motionAdjustedScreenPosition).xyzw; float3 finalColor = sourceColor; - if ( -# ifndef VR - motionScreenPosition.x >= 0 && motionScreenPosition.y >= 0 && motionScreenPosition.x <= 1 && -# endif + if (motionScreenPosition.x >= 0 && motionScreenPosition.y >= 0 && motionScreenPosition.x <= 1 && motionScreenPosition.y <= 1 && waterHistory.w > 0.0) { float historyFactor = 0.95; if (NearFar_Menu_DistanceFactor.z == 0) { diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index e611a018cc..5999972e74 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -11,7 +11,6 @@ #include "Common/SharedData.hlsli" #include "Common/Skinned.hlsli" #include "Common/Triplanar.hlsli" -#include "Common/VR.hlsli" #if defined(FACEGEN) || defined(FACEGEN_RGB_TINT) # define SKIN @@ -52,9 +51,6 @@ struct VS_INPUT #if defined(EYE) float EyeParameter: TEXCOORD2; #endif // EYE -#if defined(VR) - uint InstanceID: SV_INSTANCEID; -#endif // VR }; struct VS_OUTPUT @@ -90,28 +86,16 @@ struct VS_OUTPUT float4 Color: COLOR0; float4 FogParam: COLOR1; -#if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 -#endif - float3 ModelPosition: TEXCOORD12; }; #ifdef VSHADER cbuffer PerTechnique : register(b0) { -# if !defined(VR) float4 HighDetailRange[1] : packoffset(c0); // loaded cells center in xy, size in zw float4 FogParam : packoffset(c1); float4 FogNearColor : packoffset(c2); float4 FogFarColor : packoffset(c3); -# else - float4 HighDetailRange[2] : packoffset(c0); // loaded cells center in xy, size in zw - float4 FogParam : packoffset(c2); - float4 FogNearColor : packoffset(c3); - float4 FogFarColor : packoffset(c4); -# endif // VR }; cbuffer PerMaterial : register(b1) @@ -123,7 +107,6 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) row_major float3x4 World[1] : packoffset(c0); row_major float3x4 PreviousWorld[1] : packoffset(c3); float4 EyePosition[1] : packoffset(c6); @@ -133,36 +116,16 @@ cbuffer PerGeometry : register(b2) row_major float3x4 TextureProj[1] : packoffset(c10); float IndexScale : packoffset(c13); float4 WorldMapOverlayParameters : packoffset(c14); -# else // VR has 49 vs 30 entries - row_major float3x4 World[2] : packoffset(c0); - row_major float3x4 PreviousWorld[2] : packoffset(c6); - float4 EyePosition[2] : packoffset(c12); - float4 LandBlendParams : packoffset(c14); // offset in xy, gridPosition in yw - float4 TreeParams : packoffset(c15); // wind magnitude in y, amplitude in z, leaf frequency in w - float2 WindTimers : packoffset(c16); - row_major float3x4 TextureProj[2] : packoffset(c17); - float IndexScale : packoffset(c23); - float4 WorldMapOverlayParameters : packoffset(c24); -# endif // VR }; cbuffer VS_PerFrame : register(b12) { -# if !defined(VR) row_major float3x3 ScreenProj[1] : packoffset(c0); row_major float4x4 ViewProj[1] : packoffset(c8); -# if defined(SKINNED) +# if defined(SKINNED) float3 BonesPivot[1] : packoffset(c40); float3 PreviousBonesPivot[1] : packoffset(c41); -# endif // SKINNED -# else - row_major float3x3 ScreenProj[2] : packoffset(c0); - row_major float4x4 ViewProj[2] : packoffset(c16); -# if defined(SKINNED) - float3 BonesPivot[2] : packoffset(c80); - float3 PreviousBonesPivot[2] : packoffset(c82); -# endif // SKINNED -# endif // VR +# endif // SKINNED }; # if defined(TREE_ANIM) @@ -182,13 +145,8 @@ VS_OUTPUT main(VS_INPUT input) precise float4 inputPosition = float4(input.Position.xyz, 1.0); - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif - ); # if defined(LODLANDNOISE) || defined(LODLANDSCAPE) - inputPosition = LodLandscape::AdjustLodLandscapeVertexPositionMS(inputPosition, float4x4(World[eyeIndex], float4(0, 0, 0, 1)), HighDetailRange[eyeIndex]); + inputPosition = LodLandscape::AdjustLodLandscapeVertexPositionMS(inputPosition, float4x4(World[0], float4(0, 0, 0, 1)), HighDetailRange[0]); # endif // defined(LODLANDNOISE) || defined(LODLANDSCAPE) \ precise float4 previousInputPosition = inputPosition; @@ -205,19 +163,19 @@ VS_OUTPUT main(VS_INPUT input) precise int4 actualIndices = 765.01.xxxx * input.BoneIndices.xyzw; float3x4 previousWorldMatrix = - Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot[eyeIndex], input.BoneWeights); + Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot[0], input.BoneWeights); precise float4 previousWorldPosition = float4(mul(inputPosition, transpose(previousWorldMatrix)), 1); - float3x4 worldMatrix = Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot[eyeIndex], input.BoneWeights); + float3x4 worldMatrix = Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot[0], input.BoneWeights); precise float4 worldPosition = float4(mul(inputPosition, transpose(worldMatrix)), 1); - float4 viewPos = mul(ViewProj[eyeIndex], worldPosition); + float4 viewPos = mul(ViewProj[0], worldPosition); # else // !SKINNED - precise float4 previousWorldPosition = float4(mul(PreviousWorld[eyeIndex], inputPosition), 1); - precise float4 worldPosition = float4(mul(World[eyeIndex], inputPosition), 1); - precise float4x4 world4x4 = float4x4(World[eyeIndex][0], World[eyeIndex][1], World[eyeIndex][2], float4(0, 0, 0, 1)); - precise float4x4 modelView = mul(ViewProj[eyeIndex], world4x4); + precise float4 previousWorldPosition = float4(mul(PreviousWorld[0], inputPosition), 1); + precise float4 worldPosition = float4(mul(World[0], inputPosition), 1); + precise float4x4 world4x4 = float4x4(World[0][0], World[0][1], World[0][2], float4(0, 0, 0, 1)); + precise float4x4 modelView = mul(ViewProj[0], world4x4); float4 viewPos = mul(modelView, inputPosition); # endif // SKINNED @@ -231,8 +189,8 @@ VS_OUTPUT main(VS_INPUT input) # if defined(LANDSCAPE) vsout.TexCoord0.zw = (uv * 0.010416667.xx + LandBlendParams.xy) * float2(1, -1) + float2(0, 1); # elif defined(PROJECTED_UV) && !defined(SKINNED) - vsout.TexCoord0.z = mul(TextureProj[eyeIndex][0], inputPosition); - vsout.TexCoord0.w = mul(TextureProj[eyeIndex][1], inputPosition); + vsout.TexCoord0.z = mul(TextureProj[0][0], inputPosition); + vsout.TexCoord0.w = mul(TextureProj[0][1], inputPosition); # endif vsout.TexCoord0.xy = uv; @@ -262,9 +220,9 @@ VS_OUTPUT main(VS_INPUT input) vsout.TBN1.xyz = worldTbnTr[1]; vsout.TBN2.xyz = worldTbnTr[2]; # else - vsout.TBN0.xyz = mul(tbn, World[eyeIndex][0].xyz); - vsout.TBN1.xyz = mul(tbn, World[eyeIndex][1].xyz); - vsout.TBN2.xyz = mul(tbn, World[eyeIndex][2].xyz); + vsout.TBN0.xyz = mul(tbn, World[0][0].xyz); + vsout.TBN1.xyz = mul(tbn, World[0][1].xyz); + vsout.TBN2.xyz = mul(tbn, World[0][2].xyz); float3x3 tempTbnTr = transpose(float3x3(vsout.TBN0.xyz, vsout.TBN1.xyz, vsout.TBN2.xyz)); tempTbnTr[0] = normalize(tempTbnTr[0]); tempTbnTr[1] = normalize(tempTbnTr[1]); @@ -291,8 +249,8 @@ VS_OUTPUT main(VS_INPUT input) vsout.LandBlendWeights2.w = 1 - saturate(0.000375600968 * (9625.59961 - length(gridOffset))); vsout.LandBlendWeights2.xyz = input.LandBlendWeights2.xyz; # elif defined(PROJECTED_UV) && !defined(SKINNED) - float3x3 texProjWorld3x3 = float3x3(World[eyeIndex][0].xyz, World[eyeIndex][1].xyz, World[eyeIndex][2].xyz); - vsout.TexProj = mul(texProjWorld3x3, TextureProj[eyeIndex][2].xyz); + float3x3 texProjWorld3x3 = float3x3(World[0][0].xyz, World[0][1].xyz, World[0][2].xyz); + vsout.TexProj = mul(texProjWorld3x3, TextureProj[0][2].xyz); # endif # if defined(EYE) @@ -315,13 +273,6 @@ VS_OUTPUT main(VS_INPUT input) vsout.FogParam.xyz = lerp(FogNearColor.xyz, FogFarColor.xyz, fogColorParam); vsout.FogParam.w = fogColorParam; -# if defined(VR) - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.Position, eyeIndex); - vsout.Position = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR - vsout.ModelPosition = input.Position.xyz; return vsout; @@ -356,13 +307,6 @@ struct PS_OUTPUT #ifdef PSHADER -# if defined(VR_STEREO_OPT) && !defined(SNOW) -// POM depth offset UAV — written per-pixel for StereoBlendCS depth-aware reprojection. -// Bound at u7 (after the 7 deferred MRT slots 0-6) via OMSetRenderTargetsAndUnorderedAccessViews. -// -1.0 = no POM (sentinel, matches ClearPomOffsetTexture); >= 0 = POM ran (StereoBlendCS checks >= 0). -RWTexture2D PomOffsetTex : register(u7); -# endif - SamplerState SampTerrainParallaxSampler : register(s1); # if defined(LANDSCAPE) @@ -601,7 +545,6 @@ cbuffer PerMaterial : register(b1) # endif float4 CharacterLightParams : packoffset(c14); - // VR is [9] instead of [15] uint PBRFlags : packoffset(c15.x); float3 PBRParams1 : packoffset(c15.y); // roughness scale, displacement scale, specular level @@ -612,7 +555,6 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) float3 DirLightDirection : packoffset(c0); float3 DirLightColor : packoffset(c1); float4 ShadowLightMaskSelect : packoffset(c2); @@ -629,34 +571,12 @@ cbuffer PerGeometry : register(b2) float4 PointLightPosition[7] : packoffset(c15); // point light radius in w float4 PointLightColor[7] : packoffset(c22); float2 NumLightNumShadowLight : packoffset(c29); -# else - // VR is [49] instead of [30] - float3 DirLightDirection : packoffset(c0); - float4 UnknownPerGeometry[12] : packoffset(c1); - float3 DirLightColor : packoffset(c13); - float4 ShadowLightMaskSelect : packoffset(c14); - float4 MaterialData : packoffset(c15); // envmapLODFade in x, specularLODFade in y, alpha in z - float AlphaTestRef : packoffset(c16); - float3 EmitColor : packoffset(c16.y); - float4 ProjectedUVParams : packoffset(c18); - float4 SSRParams : packoffset(c19); - float4 WorldMapOverlayParametersPS : packoffset(c20); - float4 ProjectedUVParams2 : packoffset(c21); - float4 ProjectedUVParams3 : packoffset(c22); // fProjectedUVDiffuseNormalTilingScale in x, fProjectedUVNormalDetailTilingScale in y, EnableProjectedNormals in w - row_major float3x4 DirectionalAmbient : packoffset(c23); - float4 AmbientSpecularTintAndFresnelPower : packoffset(c26); // Fresnel power in z, color in xyz - float4 PointLightPosition[14] : packoffset(c27); // point light radius in w - float4 PointLightColor[7] : packoffset(c41); - float2 NumLightNumShadowLight : packoffset(c48); -# endif // VR }; -# if !defined(VR) cbuffer AlphaTestRefBuffer : register(b11) { float AlphaTestRefRS : packoffset(c0); } -# endif float GetSoftLightMultiplier(float angle) { @@ -962,12 +882,11 @@ float GetSnowParameterY(float texProjTmp, float alpha) PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) { PS_OUTPUT psout; - uint eyeIndex = Stereo::GetEyeIndexPS(input.Position, VPOSOffset); - float3 viewPosition = mul(FrameBuffer::CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; + float3 viewPosition = mul(FrameBuffer::CameraView, float4(input.WorldPosition.xyz, 1)).xyz; float3 viewDirection = -normalize(input.WorldPosition.xyz); - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); float screenNoise = Random::InterleavedGradientNoise(input.Position.xy, SharedData::FrameCount); # if defined(DEFERRED) @@ -1038,9 +957,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # endif // LANDSCAPE float sh0 = 0; float pixelOffset = 0; -# if defined(VR_STEREO_OPT) && !defined(SNOW) - bool hasPOM = false; -# endif # if defined(EMAT) # if defined(LANDSCAPE) @@ -1097,12 +1013,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(PARALLAX) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) if (SharedData::extendedMaterialSettings.EnableParallax) { mipLevel = ExtendedMaterials::GetMipLevel(uv, TexParallaxSampler, screenNoise); - uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset -# if defined(VR_STEREO_OPT) && !defined(SNOW) - , - hasPOM -# endif - ); + uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset); if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } @@ -1135,12 +1046,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) if (envMaskSample.w > kMaskEpsilon && envMaskSample.w < (1.0 - kMaskEpsilon)) { complexMaterialParallax = true; mipLevel = ExtendedMaterials::GetMipLevel(uv, TexEnvMaskSampler, screenNoise); - uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexEnvMaskSampler, SampTerrainParallaxSampler, 3, displacementParams, pixelOffset -# if defined(VR_STEREO_OPT) && !defined(SNOW) - , - hasPOM -# endif - ); + uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexEnvMaskSampler, SampTerrainParallaxSampler, 3, displacementParams, pixelOffset); if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, mipLevel).w; complexMaterialColor = TexEnvMaskSampler.Sample(SampEnvMaskSampler, uv); @@ -1187,12 +1093,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) displacementParams.HeightScale *= PBRParams1.y; } mipLevel = ExtendedMaterials::GetMipLevel(uv, TexParallaxSampler, screenNoise); - uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, refractedViewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset -# if defined(VR_STEREO_OPT) && !defined(SNOW) - , - hasPOM -# endif - ); + uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, refractedViewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset); if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } @@ -1288,15 +1189,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) weights[0] = weights[1] = weights[2] = weights[3] = weights[4] = weights[5] = 0.0; # if defined(TERRAIN_VARIATION) uv = ExtendedMaterials::GetParallaxCoords(input, viewPosition.z, uv, mipLevels, viewDirection, tbnTr, screenNoise, displacementParams, sharedOffset, dx, dy, pixelOffset, -# if defined(VR_STEREO_OPT) && !defined(SNOW) - hasPOM, -# endif weights); # else uv = ExtendedMaterials::GetParallaxCoords(input, viewPosition.z, uv, mipLevels, viewDirection, tbnTr, screenNoise, displacementParams, pixelOffset, -# if defined(VR_STEREO_OPT) && !defined(SNOW) - hasPOM, -# endif weights); # endif if (SharedData::extendedMaterialSettings.EnableHeightBlending) { @@ -2084,9 +1979,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # else float3 worldNormal = normalize(mul(tbn, normal.xyz)); # if defined(TREE_ANIM) - float3 viewNormal = normalize(FrameBuffer::WorldToView(worldNormal, false, eyeIndex)); + float3 viewNormal = normalize(FrameBuffer::WorldToView(worldNormal, false)); viewNormal = float3(viewNormal.xy, -abs(viewNormal.z)); - worldNormal = normalize(FrameBuffer::ViewToWorld(viewNormal, false, eyeIndex)); + worldNormal = normalize(FrameBuffer::ViewToWorld(viewNormal, false)); # endif # if defined(SPARKLE) @@ -2102,7 +1997,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # else float2 wetUV = uv * SharedData::skinData.skinDetailParams.y; # endif - float2 dynamicWet = Skin::GetWetness(input.WorldPosition.z + FrameBuffer::CameraPosAdjust[eyeIndex].z, worldNormal.xyz); + float2 dynamicWet = Skin::GetWetness(input.WorldPosition.z + FrameBuffer::CameraPosAdjust.z, worldNormal.xyz); float skinWetness = Skin::PerlinNoise(wetUV, SharedData::skinData.wetParams.x, SharedData::skinData.wetParams.y, SharedData::skinData.wetParams.z, clamp(dynamicWet.x + dynamicWet.y + SharedData::skinData.skinParams2.y, 0.f, 2.f) * (hasSkinWetness ? 1.0 : 0.5)); if ((SharedData::skinData.skinDetailParams.w > 0.0f || skinWetness > 0.0f) && skinEnabled) # else @@ -2161,7 +2056,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float projWeight = 0; # if defined(PROJECTED_UV) - float3 projWorldPos = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + float3 projWorldPos = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust.xyz; float3 triFaceNormal = normalize(-cross(ddx(input.WorldPosition.xyz), ddy(input.WorldPosition.xyz))); float3 triWeights = Triplanar::GetWeights(tbnTr[2], triFaceNormal); float projNoise = Triplanar::Sample(TexCharacterLightProjNoiseSampler, SampCharacterLightProjNoiseSampler, projWorldPos, triWeights, ProjectedUVParams.z).x; @@ -2235,7 +2130,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float3 vertexNormal = worldNormal; # endif - float3 screenSpaceNormal = normalize(FrameBuffer::WorldToView(worldNormal, false, eyeIndex)); + float3 screenSpaceNormal = normalize(FrameBuffer::WorldToView(worldNormal, false)); # if defined(HAIR) && defined(CS_HAIR) float3 Bitangent = normalize(float3(input.TBN0.y, input.TBN1.y, input.TBN2.y)); @@ -2250,7 +2145,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) if (SharedData::hairSpecularSettings.Enabled) { if (SharedData::hairSpecularSettings.EnableTangentShift && SharedData::hairSpecularSettings.HairMode != 1) { float3 shiftedNormal = Hair::ShiftWorldNormal(hairT, worldNormal, 0, uv); - screenSpaceNormal = normalize(FrameBuffer::WorldToView(shiftedNormal, false, eyeIndex)); + screenSpaceNormal = normalize(FrameBuffer::WorldToView(shiftedNormal, false)); } } # endif @@ -2512,11 +2407,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float porosity = 1.0; # if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif # if defined(DEFERRED) sh2 skylightingSH = Skylighting::Sample(positionMSSkylight, worldNormal); # else @@ -2525,7 +2416,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # endif - float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz, eyeIndex); + float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz, 0); float waterHeight = waterData.w; float waterRoughnessSpecular = 1; @@ -2560,9 +2451,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(SKINNED) float3 ripplePosition = input.ModelPosition.xyz; # elif defined(DEFERRED) - float3 ripplePosition = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + float3 ripplePosition = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust.xyz; # else - float3 ripplePosition = !FrameBuffer::FrameParams.y ? input.ModelPosition.xyz : input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz; + float3 ripplePosition = !FrameBuffer::FrameParams.y ? input.ModelPosition.xyz : input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust.xyz; # endif raindropInfo = WetnessEffects::GetRainDrops(ripplePosition, SharedData::wetnessEffectsSettings.Time, wetnessNormal, flatnessAmount); } @@ -2577,7 +2468,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(CS_SKIN) && !defined(SKIN) if (skinEnabled) { - float2 dynamicWetness = Skin::GetWetness(input.WorldPosition.z + FrameBuffer::CameraPosAdjust[eyeIndex].z, worldNormal.xyz); + float2 dynamicWetness = Skin::GetWetness(input.WorldPosition.z + FrameBuffer::CameraPosAdjust.z, worldNormal.xyz); # if defined(TRUE_PBR) dynamicWetness.x = lerp(dynamicWetness.x, 0.0f, material.Metallic); # endif @@ -2597,7 +2488,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if !defined(SKINNED) && !(defined(SKIN) && defined(CS_SKIN)) if (wetness > 0.0 || puddleWetness > 0.0) { - float3 puddleCoords = ((input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz) * 0.5 + 0.5) * 0.01 / SharedData::wetnessEffectsSettings.PuddleRadius; + float3 puddleCoords = ((input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust.xyz) * 0.5 + 0.5) * 0.01 / SharedData::wetnessEffectsSettings.PuddleRadius; puddle = Random::perlinNoise(puddleCoords) * 0.5 + 0.5; puddle = puddle * ((minWetnessAngle / SharedData::wetnessEffectsSettings.PuddleMaxAngle) * SharedData::wetnessEffectsSettings.MaxPuddleWetness * 0.25) + 0.5; puddle *= lerp(wetness, puddleWetness, saturate(puddle - 0.25)); @@ -2644,17 +2535,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - dirLightColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + dirLightColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif # if defined(WATER_EFFECTS) - dirLightColor *= WaterEffects::ComputeCaustics(waterData, input.WorldPosition.xyz, eyeIndex); + dirLightColor *= WaterEffects::ComputeCaustics(waterData, input.WorldPosition.xyz); # endif // Apply world shadow (terrain shadows, cloud shadows) directly to light color if (inWorld || inReflection) - dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, 0); float dirLightAngle = dot(worldNormal.xyz, DirLightDirection.xyz); @@ -2672,7 +2563,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(VOLUMETRIC_SHADOWS) if (inWorld && !inReflection && ShadowSampling::HasDirectionalShadows()) - dirSoftShadow = ShadowSampling::GetLightingShadow(input.WorldPosition.xyz, eyeIndex, dirVSMDetailedShadow); + dirSoftShadow = ShadowSampling::GetLightingShadow(input.WorldPosition.xyz, 0, dirVSMDetailedShadow); # endif float dirDetailedShadow = 1.0; @@ -2689,7 +2580,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(SCREEN_SPACE_SHADOWS) && defined(DEFERRED) if (!SharedData::InInterior && dirLightAngle >= 0.0) - dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, eyeIndex); + dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, 0); # endif # if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) @@ -2754,7 +2645,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) dirLightContext = CreateDirectLightingContext(worldNormal.xyz, vertexNormal.xyz, viewDirection, DirLightDirection, dirLightColor, dirDetailedShadow, dirSoftShadow); # if defined(HAIR) && defined(CS_HAIR) if (SharedData::hairSpecularSettings.Enabled) { - float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, DirLightDirection, screenNoise, eyeIndex); + float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, DirLightDirection, screenNoise, 0); dirLightContext.hairShadow = hairShadow; } # endif @@ -2782,7 +2673,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if !defined(LIGHT_LIMIT_FIX) [loop] for (uint lightIndex = 0; lightIndex < numLights; lightIndex++) { - float3 lightDirection = PointLightPosition[eyeIndex * numLights + lightIndex].xyz - input.WorldPosition.xyz; + float3 lightDirection = PointLightPosition[lightIndex].xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); float intensityFactor = saturate(lightDist / PointLightPosition[lightIndex].w); if (intensityFactor == 1) @@ -2817,7 +2708,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) pointLightContext = CreateDirectLightingContext(worldNormal.xyz, vertexNormal.xyz, viewDirection, normalizedLightDirection, lightColor, lightShadow, lightShadow); # if defined(HAIR) && defined(CS_HAIR) if (SharedData::hairSpecularSettings.Enabled) { - float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise, eyeIndex); + float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise, 0); pointLightContext.hairShadow = hairShadow; } # endif @@ -2860,7 +2751,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) continue; } - float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) @@ -2941,7 +2832,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) pointLightContext = CreateDirectLightingContext(worldNormal.xyz, vertexNormal.xyz, viewDirection, normalizedLightDirection, lightColor, pointLightShadow, pointLightShadow); # if defined(HAIR) && defined(CS_HAIR) if (SharedData::hairSpecularSettings.Enabled) { - float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise, eyeIndex); + float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise, 0); pointLightContext.hairShadow = hairShadow; } # endif @@ -3028,7 +2919,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) ambientNormal = normalize(viewDirection - hairT * dot(viewDirection, hairT)); else ambientNormal = vertexNormal.xyz; - screenSpaceNormal = normalize(FrameBuffer::WorldToView(ambientNormal, false, eyeIndex)); + screenSpaceNormal = normalize(FrameBuffer::WorldToView(ambientNormal, false)); } # endif @@ -3101,7 +2992,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) lodLandDiffuseColor += directionalAmbientColor; # endif - float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); + float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); # if defined(WETNESS_EFFECTS) # if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) @@ -3157,7 +3048,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) color.xyz += directLightsDiffuseInput; } - // Fixes white items in UI for VR [branch] if ((PBRFlags & PBR::Flags::HasEmissive) != 0) { color.xyz += emitColor.xyz; @@ -3282,9 +3172,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) if (SharedData::exponentialHeightFogSettings.enabled) { float4 exponentialHeightFog; if (inReflection) { - exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFogNoVolumetric(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, fogColor, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); + exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFogNoVolumetric(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, fogColor, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); } else { - exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, fogColor, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); + exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, fogColor, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); } fogColor = exponentialHeightFog.xyz; fogFactor = exponentialHeightFog.w; @@ -3463,7 +3353,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) indirectLobeWeights.specular += wetnessReflectance; if (waterRoughnessSpecular < 1) { // Reflection is from the water film surface; wetnessReflectance scales intensity by wetness amount. - screenSpaceNormal = normalize(FrameBuffer::WorldToView(wetnessNormal, false, eyeIndex)); + screenSpaceNormal = normalize(FrameBuffer::WorldToView(wetnessNormal, false)); material.Roughness = waterRoughnessSpecular; } # endif @@ -3471,11 +3361,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) psout.Reflectance = float4(indirectLobeWeights.specular, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), saturate(1.0 - material.Roughness), psout.Diffuse.w); -# if defined(VR_STEREO_OPT) && !defined(SNOW) - // VR stereo reprojection: write POM depth offset to dedicated texture (u7) for StereoBlendCS. - // hasPOM disambiguates "POM ran at geometry plane (pixelOffset=0.5)" from "POM did not run". - // -1.0 is the explicit no-POM sentinel (R16_FLOAT supports negatives); StereoBlendCS checks >= 0. - PomOffsetTex[uint2(input.Position.xy)] = hasPOM ? pixelOffset : Stereo::POM_NO_DATA; +# if defined(SNOW) +# if defined(TRUE_PBR) + psout.Parameters.x = Color::RGBToLuminanceAlternative(specularColor); + psout.Parameters.y = 0; +# else + psout.Parameters.x = Color::RGBToLuminanceAlternative(lightsSpecularColor); +# endif + psout.Parameters.w = psout.Diffuse.w; # endif float masksZ = Color::RGBToYCoCg(directionalAmbientColor).x; diff --git a/package/Shaders/Particle.hlsl b/package/Shaders/Particle.hlsl index c35f68861c..d23f5d59ee 100644 --- a/package/Shaders/Particle.hlsl +++ b/package/Shaders/Particle.hlsl @@ -1,7 +1,6 @@ #include "Common/Color.hlsli" #include "Common/FrameBuffer.hlsli" #include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" struct VS_INPUT { @@ -16,9 +15,6 @@ struct VS_INPUT int4 #endif TexCoord1: TEXCOORD1; -#if defined(VR) - uint InstanceID: SV_INSTANCEID; -#endif // VR }; struct VS_OUTPUT @@ -29,11 +25,6 @@ struct VS_OUTPUT #if defined(ENVCUBE) float4 PrecipitationOcclusionTexCoord: TEXCOORD1; #endif -#if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 - uint EyeIndex: EYEIDX0; -#endif // VR }; #ifdef VSHADER @@ -44,13 +35,8 @@ cbuffer PerTechnique : register(b0) cbuffer PerGeometry : register(b2) { -# if !defined(VR) row_major float4x4 WorldViewProj[1]; // 0 row_major float4x4 WorldView[1]; // 4 -# else - row_major float4x4 WorldViewProj[2]; // 0 - row_major float4x4 WorldView[2]; // 8 -# endif # if defined(ENVCUBE) row_major float4x4 PrecipitationOcclusionWorldViewProj; // 8, 16 # endif @@ -79,12 +65,6 @@ VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif - ); - # if defined(ENVCUBE) # if defined(RAIN) float2 positionOffset = input.TexCoord1.xy; @@ -101,11 +81,11 @@ VS_OUTPUT main(VS_INPUT input) msPosition.xyz = normalizedPosition * fVars2.xxx + (-(fVars2.x * 0.5).xxx + fVars1.xyz); msPosition.w = 1; - float4 viewPosition = mul(WorldViewProj[eyeIndex], msPosition); + float4 viewPosition = mul(WorldViewProj[0], msPosition); # if defined(RAIN) float4 adjustedMsPosition = msPosition - float4(Velocity.xyz, 0); float positionBlendParam = 0.5 * (1 + input.TexCoord1.y); - float4 adjustedViewPosition = mul(WorldViewProj[eyeIndex], adjustedMsPosition); + float4 adjustedViewPosition = mul(WorldViewProj[0], adjustedMsPosition); float4 finalViewPosition = lerp(adjustedViewPosition, viewPosition, positionBlendParam); # else float4 finalViewPosition = viewPosition; @@ -160,7 +140,7 @@ VS_OUTPUT main(VS_INPUT input) input.Position.xyz)); msPosition.w = 1; - float4 viewPosition = mul(WorldViewProj[eyeIndex], msPosition); + float4 viewPosition = mul(WorldViewProj[0], msPosition); vsout.Position.xy = positionOffset * ScaleAdjust + viewPosition.xy; vsout.Position.zw = viewPosition.zw; @@ -194,13 +174,6 @@ VS_OUTPUT main(VS_INPUT input) vsout.Color.xyz = color.xyz; # endif -# ifdef VR - vsout.EyeIndex = eyeIndex; - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.Position, eyeIndex); - vsout.Position = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR return vsout; } #endif @@ -254,17 +227,8 @@ PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout; -# if !defined(VR) - uint eyeIndex = 0; -# else - uint eyeIndex = input.EyeIndex; -# endif // !VR - # if defined(ENVCUBE) float2 precipitationOcclusionUV = (input.PrecipitationOcclusionTexCoord.xy * 0.5 + 0.5) * TextureSize.x; -# ifdef VR - precipitationOcclusionUV *= FrameBuffer::DynamicResolutionParams1.x; // only difference in VR -# endif float precipitationOcclusion = -input.PrecipitationOcclusionTexCoord.z + TexPrecipitationOcclusionTexture.Load(float3(precipitationOcclusionUV, 0)).x; float2 underwaterMaskUv = TextureSize.yz * input.Position.xy; float underwaterMask = TexUnderwaterMask.Sample(SampUnderwaterMask, underwaterMaskUv).x; @@ -289,14 +253,14 @@ PS_OUTPUT main(PS_INPUT input) float3 propertyColor = 0.0; - float2 uv = Stereo::ConvertFromStereoUV(input.Position.xy * SharedData::BufferDim.zw, eyeIndex); + float2 uv = input.Position.xy * SharedData::BufferDim.zw; float4 positionWS = float4(2 * float2(uv.x, -uv.y + 1) - 1, input.Position.z, 1); - positionWS = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], positionWS); + positionWS = mul(FrameBuffer::CameraViewProjInverse, positionWS); positionWS.xyz = positionWS.xyz / positionWS.w; float unusedDetailedShadow; - float3 dirLightColor = SharedData::DirLightColor.xyz * ShadowSampling::GetLightingShadow(positionWS.xyz, eyeIndex, unusedDetailedShadow); + float3 dirLightColor = SharedData::DirLightColor.xyz * ShadowSampling::GetLightingShadow(positionWS.xyz, unusedDetailedShadow); float3 ambientColor = max(0, SharedData::GetAmbient(float3(0, 0, 1))); propertyColor += dirLightColor; @@ -305,8 +269,8 @@ PS_OUTPUT main(PS_INPUT input) # if defined(LIGHT_LIMIT_FIX) uint lightCount = 0; { - float3 viewPosition = FrameBuffer::WorldToView(positionWS.xyz, true, eyeIndex); - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float3 viewPosition = FrameBuffer::WorldToView(positionWS.xyz); + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); uint clusterIndex = 0; if (LightLimitFix::GetClusterIndex(screenUV, viewPosition.z, clusterIndex)) { @@ -319,7 +283,7 @@ PS_OUTPUT main(PS_INPUT input) if (LightLimitFix::IsLightIgnored(light) || light.lightFlags & LightLimitFix::LightFlags::Shadow) { continue; } - float3 lightDirection = light.positionWS[eyeIndex].xyz - positionWS.xyz; + float3 lightDirection = light.positionWS[0].xyz - positionWS.xyz; float lightDist = length(lightDirection); # if defined(ISL) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 8aaeecb4db..5de8f4a50c 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -27,9 +27,6 @@ struct VS_INPUT float4 InstanceData2: TEXCOORD5; float4 InstanceData3: TEXCOORD6; float4 InstanceData4: TEXCOORD7; -#ifdef VR - uint InstanceID: SV_INSTANCEID; -#endif // VR }; #ifdef GRASS_LIGHTING @@ -39,27 +36,13 @@ struct VS_OUTPUT float4 Color: COLOR0; float VertexMult: COLOR1; float3 TexCoord: TEXCOORD0; - float3 ViewSpacePosition: -# if !defined(VR) - TEXCOORD1; -# else - TEXCOORD2; -# endif + float3 ViewSpacePosition: TEXCOORD1; # if defined(RENDER_DEPTH) - float2 Depth: -# if !defined(VR) - TEXCOORD2; -# else - TEXCOORD3; -# endif + float2 Depth: TEXCOORD2; # endif // RENDER_DEPTH float4 WorldPosition: POSITION1; float4 PreviousWorldPosition: POSITION2; float4 VertexNormal: POSITION4; -# ifdef VR - float ClipDistance: SV_ClipDistance0; - float CullDistance: SV_CullDistance0; -# endif // VR }; #else struct VS_OUTPUT @@ -75,14 +58,9 @@ struct VS_OUTPUT # endif // RENDER_DEPTH float4 WorldPosition: POSITION1; float4 PreviousWorldPosition: POSITION2; -# ifdef VR - float ClipDistance: SV_ClipDistance0; - float CullDistance: SV_CullDistance0; -# endif // VR }; #endif -// Constant Buffers (Flat and VR) cbuffer PerGeometry : register( #ifdef VSHADER b2 @@ -91,7 +69,6 @@ cbuffer PerGeometry : register( #endif ) { -#if !defined(VR) row_major float4x4 WorldViewProj[1] : packoffset(c0); row_major float4x4 WorldView[1] : packoffset(c4); row_major float4x4 World[1] : packoffset(c8); @@ -107,23 +84,6 @@ cbuffer PerGeometry : register( float AlphaParam2 : packoffset(c20.w); float3 ScaleMask : packoffset(c21); float ShadowClampValue : packoffset(c21.w); -#else - row_major float4x4 WorldViewProj[2] : packoffset(c0); - row_major float4x4 WorldView[2] : packoffset(c8); - row_major float4x4 World[2] : packoffset(c16); - row_major float4x4 PreviousWorld[2] : packoffset(c24); - float4 FogNearColor : packoffset(c32); - float3 WindVector : packoffset(c33); - float WindTimer : packoffset(c33.w); - float3 DirLightDirection : packoffset(c34); - float PreviousWindTimer : packoffset(c34.w); - float3 DirLightColor : packoffset(c35); - float AlphaParam1 : packoffset(c35.w); - float3 AmbientColor : packoffset(c36); - float AlphaParam2 : packoffset(c36.w); - float3 ScaleMask : packoffset(c37); - float ShadowClampValue : packoffset(c37.w); -#endif // !VR } #ifdef VSHADER @@ -190,11 +150,6 @@ VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif // VR - ); float3x3 world3x3 = float3x3(input.InstanceData2.xyz, input.InstanceData3.xyz, float3(input.InstanceData4.x, input.InstanceData2.w, input.InstanceData3.w)); float4 msPosition = GetMSPosition(input, world3x3); @@ -210,10 +165,8 @@ VS_OUTPUT main(VS_INPUT input) msPosition.xyz += windDisplacement; - float4 projSpacePosition = mul(WorldViewProj[eyeIndex], msPosition); -# if !defined(VR) + float4 projSpacePosition = mul(WorldViewProj[0], msPosition); vsout.HPosition = projSpacePosition; -# endif // !VR # if defined(RENDER_DEPTH) vsout.Depth = projSpacePosition.zw; @@ -221,11 +174,7 @@ VS_OUTPUT main(VS_INPUT input) float perInstanceFade = dot(cb8[(asuint(cb7[0].x) >> 2)].xyzw, Math::IdentityMatrix[(asint(cb7[0].x) & 3)].xyzw); -# if defined(VR) - float distanceFade = 1 - saturate((length(mul(World[0], msPosition).xyz) - AlphaParam1) / AlphaParam2); -# else float distanceFade = 1 - saturate((length(projSpacePosition.xyz) - AlphaParam1) / AlphaParam2); -# endif // Note: input.Color.w is used for wind speed vsout.Color.xyz = input.Color.xyz; @@ -235,8 +184,8 @@ VS_OUTPUT main(VS_INPUT input) vsout.TexCoord.xy = input.TexCoord.xy; vsout.TexCoord.z = FogNearColor.w; - vsout.ViewSpacePosition = mul(WorldView[eyeIndex], msPosition).xyz; - vsout.WorldPosition = mul(World[eyeIndex], msPosition); + vsout.ViewSpacePosition = mul(WorldView[0], msPosition).xyz; + vsout.WorldPosition = mul(World[0], msPosition); float4 previousMsPosition = GetMSPosition(input, world3x3); @@ -246,13 +195,7 @@ VS_OUTPUT main(VS_INPUT input) previousMsPosition.xyz += previousWindDisplacement; - vsout.PreviousWorldPosition = mul(PreviousWorld[eyeIndex], previousMsPosition); -# if defined(VR) - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(projSpacePosition, eyeIndex); - vsout.HPosition = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // !VR + vsout.PreviousWorldPosition = mul(PreviousWorld[0], previousMsPosition); // Vertex normal needs to be transformed to world-space for lighting calculations. vsout.VertexNormal.xyz = mul(world3x3, input.Normal.xyz * 2.0 - 1.0); @@ -265,12 +208,6 @@ VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif // VR - ); - float4 msPosition = GetMSPosition(input); float3 windDisplacement = CalculateWindDisplacement(input, WindTimer); @@ -284,10 +221,8 @@ VS_OUTPUT main(VS_INPUT input) msPosition.xyz += windDisplacement; - float4 projSpacePosition = mul(WorldViewProj[eyeIndex], msPosition); -# if !defined(VR) + float4 projSpacePosition = mul(WorldViewProj[0], msPosition); vsout.HPosition = projSpacePosition; -# endif // !VR vsout.HPosition = projSpacePosition; # if defined(RENDER_DEPTH) vsout.Depth = projSpacePosition.zw; @@ -299,11 +234,7 @@ VS_OUTPUT main(VS_INPUT input) float perInstanceFade = dot(cb8[(asuint(cb7[0].x) >> 2)].xyzw, Math::IdentityMatrix[(asint(cb7[0].x) & 3)].xyzw); -# if defined(VR) - float distanceFade = 1 - saturate((length(mul(World[0], msPosition).xyz) - AlphaParam1) / AlphaParam2); -# else float distanceFade = 1 - saturate((length(projSpacePosition.xyz) - AlphaParam1) / AlphaParam2); -# endif vsout.Color.xyz = input.Color.xyz; vsout.Color.w = distanceFade * perInstanceFade; @@ -315,16 +246,10 @@ VS_OUTPUT main(VS_INPUT input) vsout.AmbientColor.xyz = input.InstanceData1.www * (AmbientColor.xyz * input.Color.xyz); vsout.AmbientColor.w = ShadowClampValue; - vsout.ViewSpacePosition = mul(WorldView[eyeIndex], msPosition).xyz; - vsout.WorldPosition = mul(World[eyeIndex], msPosition); + vsout.ViewSpacePosition = mul(WorldView[0], msPosition).xyz; + vsout.WorldPosition = mul(World[0], msPosition); float4 previousMsPosition = GetMSPosition(input); -# if defined(VR) - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(projSpacePosition, eyeIndex); - vsout.HPosition = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // !VR # ifdef GRASS_COLLISION previousMsPosition.xyz += previousDisplacement; @@ -332,7 +257,7 @@ VS_OUTPUT main(VS_INPUT input) previousMsPosition.xyz += previousWindDisplacement; - vsout.PreviousWorldPosition = mul(PreviousWorld[eyeIndex], previousMsPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld[0], previousMsPosition); return vsout; } @@ -408,12 +333,10 @@ Texture2D TexSubsurfaceSampler : register(t4); # endif // GRASS_LIGHTING -# if !defined(VR) cbuffer AlphaTestRefCB : register(b11) { float AlphaTestRefRS : packoffset(c0); } -# endif // !VR # if defined(SCREEN_SPACE_SHADOWS) # include "ScreenSpaceShadows/ScreenSpaceShadows.hlsli" @@ -521,14 +444,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float4 specColor = TexNormalSampler.SampleBias(SampNormalSampler, input.TexCoord.xy, SharedData::MipBias); # endif - uint eyeIndex = Stereo::GetEyeIndexPS(input.HPosition, VPOSOffset); - psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); + psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, 0); float3 viewDirection = -normalize(input.WorldPosition.xyz); float3 normal = normalize(input.VertexNormal.xyz); - float3 viewPosition = mul(FrameBuffer::CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float3 viewPosition = mul(FrameBuffer::CameraView, float4(input.WorldPosition.xyz, 1)).xyz; + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); float screenNoise = Random::InterleavedGradientNoise(input.HPosition.xy, SharedData::FrameCount); // Swaps direction of the backfaces otherwise they seem to get lit from the wrong direction. @@ -587,7 +509,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - dirLightColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + dirLightColor *= ExponentialHeightFog::GetSunlightFogAttenuation(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif @@ -597,7 +519,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) // Apply world shadow (terrain shadows, cloud shadows) directly to light color if (!SharedData::InInterior) - dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, 0); float dirDetailedShadow = 1.0; @@ -606,7 +528,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(SCREEN_SPACE_SHADOWS) if (!SharedData::InInterior && dirLightAngle >= 0.0) - dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise, eyeIndex); + dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise, 0); # endif // SCREEN_SPACE_SHADOWS float3 diffuseColor = 0; @@ -636,11 +558,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) vertexColor /= max(vertexAO, EPSILON_DIVISION); # if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif float skylightingDiffuse = Skylighting::GetVertexSkylightingDiffuse(positionMSSkylight, normal, vertexAO); # endif // SKYLIGHTING @@ -666,7 +584,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) uint clusteredLightIndex = LightLimitFix::lightList[lightOffset + i]; LightLimitFix::Light light = LightLimitFix::lights[clusteredLightIndex]; - float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) @@ -781,7 +699,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) psout.Diffuse.xyz = diffuseColor; # endif - float3 normalVS = normalize(FrameBuffer::WorldToView(normal, false, eyeIndex)); + float3 normalVS = normalize(FrameBuffer::WorldToView(normal, false)); # if defined(TRUE_PBR) psout.Albedo = float4(Color::IrradianceToGamma(indirectDiffuseLobeWeight), 1); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(normalVS), 1 - pbrSurfaceProperties.Roughness, 1); @@ -819,10 +737,8 @@ PS_OUTPUT main(PS_INPUT input) if (SharedData::lodBlendingSettings.DisableTerrainVertexColors) input.Color.xyz = 1; - uint eyeIndex = Stereo::GetEyeIndexPS(input.HPosition, VPOSOffset); - - float3 viewPosition = mul(FrameBuffer::CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float3 viewPosition = mul(FrameBuffer::CameraView, float4(input.WorldPosition.xyz, 1)).xyz; + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); float screenNoise = Random::InterleavedGradientNoise(input.HPosition.xy, SharedData::FrameCount); float4 shadowColor = TexShadowMaskSampler.Load(int3(input.HPosition.xy, 0)); @@ -832,7 +748,7 @@ PS_OUTPUT main(PS_INPUT input) // Apply world shadow (terrain shadows, cloud shadows) directly to light color if (!SharedData::InInterior) - dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, eyeIndex); + dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, 0); float dirDetailedShadow = 1.0; @@ -841,7 +757,7 @@ PS_OUTPUT main(PS_INPUT input) # if defined(SCREEN_SPACE_SHADOWS) if (!SharedData::InInterior) - dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise, eyeIndex); + dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise, 0); # endif // SCREEN_SPACE_SHADOWS float3 diffuseColor = dirLightColor * dirDetailedShadow; @@ -860,7 +776,7 @@ PS_OUTPUT main(PS_INPUT input) uint clusteredLightIndex = LightLimitFix::lightList[lightOffset + i]; LightLimitFix::Light light = LightLimitFix::lights[clusteredLightIndex]; - float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) @@ -903,11 +819,7 @@ PS_OUTPUT main(PS_INPUT input) vertexColor /= max(vertexAO, EPSILON_DIVISION); # if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif float skylightingDiffuse = Skylighting::GetVertexSkylightingDiffuse(positionMSSkylight, normal, vertexAO); # endif // SKYLIGHTING @@ -943,8 +855,8 @@ PS_OUTPUT main(PS_INPUT input) psout.Diffuse.w = 1; - psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); - psout.Normal.xy = GBuffer::EncodeNormal(FrameBuffer::WorldToView(normal, false, eyeIndex)); + psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, 0); + psout.Normal.xy = GBuffer::EncodeNormal(FrameBuffer::WorldToView(normal, false)); psout.Normal.zw = 0; psout.Albedo = float4(albedo, 1); diff --git a/package/Shaders/Sky.hlsl b/package/Shaders/Sky.hlsl index 1d4be8643c..952b18603e 100644 --- a/package/Shaders/Sky.hlsl +++ b/package/Shaders/Sky.hlsl @@ -3,7 +3,6 @@ #include "Common/Permutation.hlsli" #include "Common/Random.hlsli" #include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" struct VS_INPUT { @@ -14,9 +13,6 @@ struct VS_INPUT #endif float4 Color: COLOR0; -#if defined(VR) - uint InstanceID: SV_INSTANCEID; -#endif // VR }; struct VS_OUTPUT @@ -46,17 +42,11 @@ struct VS_OUTPUT float4 WorldPosition: POSITION1; float4 PreviousWorldPosition: POSITION2; float3 FogPosition: TEXCOORD4; -#if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 - uint EyeIndex: EYEIDX0; -#endif // VR }; #ifdef VSHADER cbuffer PerGeometry : register(b2) { -# if !defined(VR) row_major float4x4 WorldViewProj[1] : packoffset(c0); row_major float4x4 World[1] : packoffset(c4); row_major float4x4 PreviousWorld[1] : packoffset(c8); @@ -64,25 +54,11 @@ cbuffer PerGeometry : register(b2) float VParams : packoffset(c12.w); float4 BlendColor[3] : packoffset(c13); float2 TexCoordOff : packoffset(c16); -# else - row_major float4x4 WorldViewProj[2] : packoffset(c0); - row_major float4x4 World[2] : packoffset(c8); - row_major float4x4 PreviousWorld[2] : packoffset(c16); - float3 EyePosition[2] : packoffset(c24); - float VParams : packoffset(c25.w); - float4 BlendColor[3] : packoffset(c26); - float2 TexCoordOff : packoffset(c29); -# endif // !VR }; VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif - ); float4 inputPosition = float4(input.Position.xyz, 1.0); @@ -97,8 +73,8 @@ VS_OUTPUT main(VS_INPUT input) # elif defined(HORIZFADE) - float worldHeight = mul(World[eyeIndex], inputPosition).z; - float eyeHeightDelta = -EyePosition[eyeIndex].z + worldHeight; + float worldHeight = mul(World[0], inputPosition).z; + float eyeHeightDelta = -EyePosition[0].z + worldHeight; vsout.TexCoord0.xy = input.TexCoord; vsout.TexCoord2.x = saturate((1.0 / 17.0) * eyeHeightDelta); @@ -137,18 +113,11 @@ VS_OUTPUT main(VS_INPUT input) # endif // OCCLUSION MOONMASK HORIZFADE - vsout.Position = mul(WorldViewProj[eyeIndex], inputPosition).xyww; - vsout.WorldPosition = mul(World[eyeIndex], inputPosition); - vsout.FogPosition = vsout.WorldPosition.xyz - EyePosition[eyeIndex].xyz; - vsout.PreviousWorldPosition = mul(PreviousWorld[eyeIndex], inputPosition); - -# ifdef VR - vsout.EyeIndex = eyeIndex; - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.Position, eyeIndex); - vsout.Position = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR + vsout.Position = mul(WorldViewProj[0], inputPosition).xyww; + vsout.WorldPosition = mul(World[0], inputPosition); + vsout.FogPosition = vsout.WorldPosition.xyz - EyePosition[0].xyz; + vsout.PreviousWorldPosition = mul(PreviousWorld[0], inputPosition); + return vsout; } #endif @@ -179,12 +148,10 @@ cbuffer PerGeometry : register(b2) float2 PParams : packoffset(c0); }; -# if !defined(VR) cbuffer AlphaTestRefCB : register(b11) { float AlphaTestRefRS : packoffset(c0); } -# endif # include "Common/MotionBlur.hlsli" # include "Common/SharedData.hlsli" @@ -211,11 +178,6 @@ PS_OUTPUT main(PS_INPUT input) // Color::Sky is float3->float3 (per-channel sky gamma). PParams.yyy broadcasts the packed // scalar in PParams.y to RGB; float3 matches output .xyz where skyScale is added. float3 skyScale = Color::Sky(PParams.yyy); -# if !defined(VR) - uint eyeIndex = 0; -# else - uint eyeIndex = input.EyeIndex; -# endif // !VR # ifndef OCCLUSION # ifndef TEXLERP @@ -293,12 +255,12 @@ PS_OUTPUT main(PS_INPUT input) const bool inReflection = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection) != 0; if (inReflection && SharedData::exponentialHeightFogSettings.enabled) { float3 skyFogPosition = normalize(input.FogPosition.xyz) * SharedData::CameraData.x; - float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFogNoVolumetric(skyFogPosition, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, psout.Color.xyz, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); + float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFogNoVolumetric(skyFogPosition, FrameBuffer::CameraPosAdjust.xyz, psout.Color.xyz, float4(input.Position.xy * FrameBuffer::DynamicResolutionParams2.xy, input.Position.z, 1)); psout.Color.xyz = lerp(psout.Color.xyz, exponentialHeightFog.xyz, exponentialHeightFog.w); } # endif - float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); + float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); psout.MotionVectors = float4(screenMotionVector, 0, psout.Color.w); psout.Normal = float4(0.5, 0.5, 0, psout.Color.w); diff --git a/package/Shaders/Tests/TestVR.hlsl b/package/Shaders/Tests/TestVR.hlsl deleted file mode 100644 index 1d528386c9..0000000000 --- a/package/Shaders/Tests/TestVR.hlsl +++ /dev/null @@ -1,362 +0,0 @@ -// HLSL Unit Tests for Common/VR.hlsli -// Tests the pure-math UV conversion functions that form the foundation of VR stereo rendering. -// These run with VR defined so the stereo code paths are exercised. -// COMPUTESHADER prevents FrameBuffer.hlsli inclusion (we only need the UV math). -#define VR -#define COMPUTESHADER -#include "/Shaders/Common/VR.hlsli" -#include "/Test/STF/ShaderTestFramework.hlsli" - -static const float kEps = 0.0001f; - -/// @tags vr, stereo, uv -/// ConvertToStereoUV: left eye maps [0,1] -> [0,0.5] -[numthreads(1, 1, 1)] void TestConvertToStereoUVLeftEye() { - float2 uv = float2(0.0, 0.5); - float2 result = Stereo::ConvertToStereoUV(uv, 0); - ASSERT(IsTrue, abs(result.x - 0.0) < kEps); - ASSERT(IsTrue, abs(result.y - 0.5) < kEps); - - uv = float2(1.0, 0.5); - result = Stereo::ConvertToStereoUV(uv, 0); - ASSERT(IsTrue, abs(result.x - 0.5) < kEps); - ASSERT(IsTrue, abs(result.y - 0.5) < kEps); - - uv = float2(0.5, 0.25); - result = Stereo::ConvertToStereoUV(uv, 0); - ASSERT(IsTrue, abs(result.x - 0.25) < kEps); - ASSERT(IsTrue, abs(result.y - 0.25) < kEps); -} - - /// @tags vr, stereo, uv - /// ConvertToStereoUV: right eye maps [0,1] -> [0.5,1] - [numthreads(1, 1, 1)] void TestConvertToStereoUVRightEye() -{ - float2 uv = float2(0.0, 0.5); - float2 result = Stereo::ConvertToStereoUV(uv, 1); - ASSERT(IsTrue, abs(result.x - 0.5) < kEps); - ASSERT(IsTrue, abs(result.y - 0.5) < kEps); - - uv = float2(1.0, 0.5); - result = Stereo::ConvertToStereoUV(uv, 1); - ASSERT(IsTrue, abs(result.x - 1.0) < kEps); - - uv = float2(0.5, 0.25); - result = Stereo::ConvertToStereoUV(uv, 1); - ASSERT(IsTrue, abs(result.x - 0.75) < kEps); -} - -/// @tags vr, stereo, uv -/// ConvertToStereoUV with Y inversion -[numthreads(1, 1, 1)] void TestConvertToStereoUVInvertY() { - float2 uv = float2(0.5, 0.25); - float2 result = Stereo::ConvertToStereoUV(uv, 0, 1); - ASSERT(IsTrue, abs(result.x - 0.25) < kEps); - ASSERT(IsTrue, abs(result.y - 0.75) < kEps); -} - - /// @tags vr, stereo, uv - /// ConvertFromStereoUV: left eye maps [0,0.5] -> [0,1] - [numthreads(1, 1, 1)] void TestConvertFromStereoUVLeftEye() -{ - float2 stereoUV = float2(0.0, 0.5); - float2 result = Stereo::ConvertFromStereoUV(stereoUV, 0); - ASSERT(IsTrue, abs(result.x - 0.0) < kEps); - ASSERT(IsTrue, abs(result.y - 0.5) < kEps); - - stereoUV = float2(0.5, 0.5); - result = Stereo::ConvertFromStereoUV(stereoUV, 0); - ASSERT(IsTrue, abs(result.x - 1.0) < kEps); - - stereoUV = float2(0.25, 0.25); - result = Stereo::ConvertFromStereoUV(stereoUV, 0); - ASSERT(IsTrue, abs(result.x - 0.5) < kEps); -} - -/// @tags vr, stereo, uv -/// ConvertFromStereoUV: right eye maps [0.5,1] -> [0,1] -[numthreads(1, 1, 1)] void TestConvertFromStereoUVRightEye() { - float2 stereoUV = float2(0.5, 0.5); - float2 result = Stereo::ConvertFromStereoUV(stereoUV, 1); - ASSERT(IsTrue, abs(result.x - 0.0) < kEps); - - stereoUV = float2(1.0, 0.5); - result = Stereo::ConvertFromStereoUV(stereoUV, 1); - ASSERT(IsTrue, abs(result.x - 1.0) < kEps); - - stereoUV = float2(0.75, 0.25); - result = Stereo::ConvertFromStereoUV(stereoUV, 1); - ASSERT(IsTrue, abs(result.x - 0.5) < kEps); -} - - /// @tags vr, stereo, uv - /// ConvertToStereoUV and ConvertFromStereoUV are inverses of each other - [numthreads(1, 1, 1)] void TestStereoUVRoundTrip() -{ - float2 original = float2(0.3, 0.7); - - // Left eye round-trip - float2 stereo = Stereo::ConvertToStereoUV(original, 0); - float2 recovered = Stereo::ConvertFromStereoUV(stereo, 0); - ASSERT(IsTrue, abs(recovered.x - original.x) < kEps); - ASSERT(IsTrue, abs(recovered.y - original.y) < kEps); - - // Right eye round-trip - stereo = Stereo::ConvertToStereoUV(original, 1); - recovered = Stereo::ConvertFromStereoUV(stereo, 1); - ASSERT(IsTrue, abs(recovered.x - original.x) < kEps); - ASSERT(IsTrue, abs(recovered.y - original.y) < kEps); -} - -/// @tags vr, stereo, uv -/// GetEyeIndexFromTexCoord: left half -> 0, right half -> 1 -[numthreads(1, 1, 1)] void TestGetEyeIndexFromTexCoord() { - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.0, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.25, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.49, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.5, 0.5)), 1u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.75, 0.5)), 1u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(1.0, 0.5)), 1u); -} - - /// @tags vr, stereo, uv - /// GetEyeIndexFromTexCoord is consistent with ConvertToStereoUV output - [numthreads(1, 1, 1)] void TestEyeIndexConsistentWithStereoUV() -{ - float2 monoUV = float2(0.6, 0.4); - - // Convert to stereo for left eye, then detect eye index - float2 stereoLeft = Stereo::ConvertToStereoUV(monoUV, 0); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(stereoLeft), 0u); - - // Convert to stereo for right eye, then detect eye index - float2 stereoRight = Stereo::ConvertToStereoUV(monoUV, 1); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(stereoRight), 1u); -} - -/// @tags vr, stereo, depth, edge-detection -/// MaxDepthDiff: identical neighbors -> 0 -[numthreads(1, 1, 1)] void TestMaxDepthDiffAllSame() { - float result = Stereo::MaxDepthDiff(0.5, float4(0.5, 0.5, 0.5, 0.5)); - ASSERT(IsTrue, abs(result) < kEps); -} - - /// @tags vr, stereo, depth, edge-detection - /// MaxDepthDiff: returns |center - neighbor| when one neighbor differs - [numthreads(1, 1, 1)] void TestMaxDepthDiffOneDiffers() -{ - // Only .z differs - float result = Stereo::MaxDepthDiff(0.5, float4(0.5, 0.5, 0.8, 0.5)); - ASSERT(IsTrue, abs(result - 0.3) < kEps); -} - -/// @tags vr, stereo, depth, edge-detection -/// MaxDepthDiff: returns the largest difference across all four neighbors -[numthreads(1, 1, 1)] void TestMaxDepthDiffPicksLargest() { - float result = Stereo::MaxDepthDiff(0.5, float4(0.55, 0.45, 0.9, 0.48)); - ASSERT(IsTrue, abs(result - 0.4) < kEps); // abs(0.5 - 0.9) = 0.4 -} - - /// @tags vr, stereo, depth, edge-detection - /// MaxDepthDiff: arm/world case returns exact diff (arm=0.75, world=1.0 -> 0.25) - [numthreads(1, 1, 1)] void TestMaxDepthDiffArmWorldCase() -{ - float armDepth = 0.75; - float worldDepth = 1.0; - float result = Stereo::MaxDepthDiff(armDepth, float4(worldDepth, armDepth, armDepth, armDepth)); - ASSERT(IsTrue, abs(result - abs(worldDepth - armDepth)) < kEps); -} - -/// @tags vr, stereo, depth, edge-detection -/// MaxDepthDiff: symmetric - diff(a,b) == diff(b,a) -[numthreads(1, 1, 1)] void TestMaxDepthDiffSymmetry() { - float a = 0.3, b = 0.7; - float fwd = Stereo::MaxDepthDiff(a, float4(b, a, a, a)); - float rev = Stereo::MaxDepthDiff(b, float4(a, b, b, b)); - ASSERT(IsTrue, abs(fwd - rev) < kEps); -} - - /// @tags vr, stereo, depth, edge-detection - /// MaxDepthDiff: center == 0 (mask pixel) against world neighbor - [numthreads(1, 1, 1)] void TestMaxDepthDiffMaskCenter() -{ - float result = Stereo::MaxDepthDiff(0.0, float4(0.8, 0.0, 0.0, 0.0)); - ASSERT(IsTrue, abs(result - 0.8) < kEps); -} - -/// @tags vr, stereo, edge-detection -/// ClampToEyeBounds: interior pixel is returned unchanged for both eyes -[numthreads(1, 1, 1)] void TestClampToEyeBoundsInterior() { - float2 frameDim = float2(2048, 1024); - int2 left = Stereo::ClampToEyeBounds(int2(512, 512), 0, frameDim); - ASSERT(AreEqual, left.x, 512); - ASSERT(AreEqual, left.y, 512); - - int2 right = Stereo::ClampToEyeBounds(int2(1536, 512), 1, frameDim); - ASSERT(AreEqual, right.x, 1536); - ASSERT(AreEqual, right.y, 512); -} - - /// @tags vr, stereo, edge-detection - /// ClampToEyeBounds: left eye x cannot cross the half-width seam - [numthreads(1, 1, 1)] void TestClampToEyeBoundsLeftEyeSeam() -{ - float2 frameDim = float2(2048, 1024); - // x past the seam clamps to halfWidth - 1 = 1023 - int2 result = Stereo::ClampToEyeBounds(int2(1025, 512), 0, frameDim); - ASSERT(AreEqual, result.x, 1023); -} - -/// @tags vr, stereo, edge-detection -/// ClampToEyeBounds: right eye x cannot cross the half-width seam -[numthreads(1, 1, 1)] void TestClampToEyeBoundsRightEyeSeam() { - float2 frameDim = float2(2048, 1024); - // x before the seam clamps to halfWidth = 1024 - int2 result = Stereo::ClampToEyeBounds(int2(1022, 512), 1, frameDim); - ASSERT(AreEqual, result.x, 1024); -} - - /// @tags vr, stereo, edge-detection - /// ClampToEyeBounds: x clamped at outer borders (left eye left edge, right eye right edge) - [numthreads(1, 1, 1)] void TestClampToEyeBoundsOuterBorders() -{ - float2 frameDim = float2(2048, 1024); - int2 leftBorder = Stereo::ClampToEyeBounds(int2(-1, 512), 0, frameDim); - ASSERT(AreEqual, leftBorder.x, 0); - - int2 rightBorder = Stereo::ClampToEyeBounds(int2(2049, 512), 1, frameDim); - ASSERT(AreEqual, rightBorder.x, 2047); -} - -/// @tags vr, stereo, edge-detection -/// ClampToEyeBounds: y is clamped to [0, frameDim.y - 1] independently of eye -[numthreads(1, 1, 1)] void TestClampToEyeBoundsY() { - float2 frameDim = float2(2048, 1024); - int2 top = Stereo::ClampToEyeBounds(int2(512, -1), 0, frameDim); - ASSERT(AreEqual, top.y, 0); - - int2 bottom = Stereo::ClampToEyeBounds(int2(512, 1025), 0, frameDim); - ASSERT(AreEqual, bottom.y, 1023); -} - - /// @tags vr, stereo, edge-detection - /// ClampToEyeUV: interior UV is returned unchanged for both eyes - [numthreads(1, 1, 1)] void TestClampToEyeUVInterior() -{ - float2 left = Stereo::ClampToEyeUV(float2(0.25, 0.5), 0); - ASSERT(IsTrue, abs(left.x - 0.25) < kEps); - ASSERT(IsTrue, abs(left.y - 0.5) < kEps); - - float2 right = Stereo::ClampToEyeUV(float2(0.75, 0.5), 1); - ASSERT(IsTrue, abs(right.x - 0.75) < kEps); - ASSERT(IsTrue, abs(right.y - 0.5) < kEps); -} - -/// @tags vr, stereo, edge-detection -/// ClampToEyeUV: left eye x cannot cross the x=0.5 seam -[numthreads(1, 1, 1)] void TestClampToEyeUVLeftEyeSeam() { - // x past the seam clamps to 0.5 - float2 result = Stereo::ClampToEyeUV(float2(0.6, 0.5), 0); - ASSERT(IsTrue, abs(result.x - 0.5) < kEps); -} - - /// @tags vr, stereo, edge-detection - /// ClampToEyeUV: right eye x cannot cross the x=0.5 seam - [numthreads(1, 1, 1)] void TestClampToEyeUVRightEyeSeam() -{ - // x before the seam clamps to 0.5 - float2 result = Stereo::ClampToEyeUV(float2(0.4, 0.5), 1); - ASSERT(IsTrue, abs(result.x - 0.5) < kEps); -} - -/// @tags vr, stereo, edge-detection -/// ClampToEyeUV: x clamped at outer borders (left eye at 0.0, right eye at 1.0) -[numthreads(1, 1, 1)] void TestClampToEyeUVOuterBorders() { - float2 leftBorder = Stereo::ClampToEyeUV(float2(-0.1, 0.5), 0); - ASSERT(IsTrue, abs(leftBorder.x - 0.0) < kEps); - - float2 rightBorder = Stereo::ClampToEyeUV(float2(1.1, 0.5), 1); - ASSERT(IsTrue, abs(rightBorder.x - 1.0) < kEps); -} - - /// @tags vr, stereo, edge-detection - /// ClampToEyeUV: y coordinate is not modified - [numthreads(1, 1, 1)] void TestClampToEyeUVYUnchanged() -{ - float2 result = Stereo::ClampToEyeUV(float2(0.25, 1.5), 0); - ASSERT(IsTrue, abs(result.y - 1.5) < kEps); - - result = Stereo::ClampToEyeUV(float2(0.75, -0.5), 1); - ASSERT(IsTrue, abs(result.y - (-0.5)) < kEps); -} - -/// @tags vr, stereo, uv -/// ConvertToStereoUV clamps input x to [0,1] via saturate -[numthreads(1, 1, 1)] void TestConvertToStereoUVClamping() { - // x > 1 should be clamped to 1 before conversion - float2 uv = float2(1.5, 0.5); - float2 resultLeft = Stereo::ConvertToStereoUV(uv, 0); - ASSERT(IsTrue, abs(resultLeft.x - 0.5) < kEps); // saturate(1.5)=1.0, (1.0+0)/2=0.5 - - float2 resultRight = Stereo::ConvertToStereoUV(uv, 1); - ASSERT(IsTrue, abs(resultRight.x - 1.0) < kEps); // saturate(1.5)=1.0, (1.0+1)/2=1.0 - - // x < 0 should be clamped to 0 - uv = float2(-0.5, 0.5); - resultLeft = Stereo::ConvertToStereoUV(uv, 0); - ASSERT(IsTrue, abs(resultLeft.x - 0.0) < kEps); // saturate(-0.5)=0.0, (0+0)/2=0 -} - - /// @tags vr, stereo, uv - /// ConvertUVToNormalizedScreenSpace maps to [-1,1] range - [numthreads(1, 1, 1)] void TestConvertUVToNormalizedScreenSpace() -{ - // Center of left eye (stereo UV 0.25) -> x should be near 0 (center of that eye) - float2 result = Stereo::ConvertUVToNormalizedScreenSpace(float2(0.25, 0.5)); - ASSERT(IsTrue, abs(result.x - 0.0) < kEps); - ASSERT(IsTrue, abs(result.y - 0.0) < kEps); - - // Center of right eye (stereo UV 0.75) -> x should also be near 0 - result = Stereo::ConvertUVToNormalizedScreenSpace(float2(0.75, 0.5)); - ASSERT(IsTrue, abs(result.x - 0.0) < kEps); - - // Outer edges (stereo UV 0.0 and 1.0) -> x = +1 - result = Stereo::ConvertUVToNormalizedScreenSpace(float2(0.0, 0.5)); - ASSERT(IsTrue, abs(result.x - 1.0) < kEps); - - // Inner edge / midpoint (stereo UV 0.5) -> x = -1 - result = Stereo::ConvertUVToNormalizedScreenSpace(float2(0.5, 0.5)); - ASSERT(IsTrue, abs(result.x - (-1.0)) < kEps); - - // Top -> y = -1, bottom -> y = 1 - result = Stereo::ConvertUVToNormalizedScreenSpace(float2(0.25, 0.0)); - ASSERT(IsTrue, abs(result.y - (-1.0)) < kEps); - - result = Stereo::ConvertUVToNormalizedScreenSpace(float2(0.25, 1.0)); - ASSERT(IsTrue, abs(result.y - 1.0) < kEps); -} - -/// @tags vr, stereo, uv -/// ApplyVelocityToUV: correctly translates UV keeping stereoscopic boundaries intact and reports bounds -[numthreads(1, 1, 1)] void TestApplyVelocityToUV() { - float2 velocity = float2(0.1, 0.0); - bool oob; - - // Left eye bounds [0, 0.5], mapping left eye UV of 0.25 + 0.1 mono velocity -> 0.3 stereo - float2 resultLeft = Stereo::ApplyVelocityToUV(float2(0.25, 0.5), velocity, oob); - ASSERT(IsTrue, abs(resultLeft.x - 0.3) < kEps); - ASSERT(IsTrue, abs(resultLeft.y - 0.5) < kEps); - ASSERT(IsFalse, oob); - - // Right eye bounds [0.5, 1.0], mapping right eye UV of 0.75 + 0.1 mono velocity -> 0.8 stereo - float2 resultRight = Stereo::ApplyVelocityToUV(float2(0.75, 0.5), velocity, oob); - ASSERT(IsTrue, abs(resultRight.x - 0.8) < kEps); - ASSERT(IsTrue, abs(resultRight.y - 0.5) < kEps); - ASSERT(IsFalse, oob); - - // OOB condition: mono velocity pushes past 1.0 - float2 resultOob = Stereo::ApplyVelocityToUV(float2(0.25, 0.5), float2(1.5, 0.0), oob); - ASSERT(IsTrue, oob); - // In VR, out of bounds is clamped (mono x < 0 maps to 0 -> stereo 0, mono x > 1 saturates to 1 -> stereo 0.5 for left) - ASSERT(IsTrue, abs(resultOob.x - 0.5) < kEps); -} diff --git a/package/Shaders/Tests/TestVRFlat.hlsl b/package/Shaders/Tests/TestVRFlat.hlsl deleted file mode 100644 index 7f1e1fd978..0000000000 --- a/package/Shaders/Tests/TestVRFlat.hlsl +++ /dev/null @@ -1,90 +0,0 @@ -// HLSL Unit Tests for Common/VR.hlsli - Flat (non-VR) mode -// Verifies that all Stereo:: functions are correct no-ops / identity when VR is not defined. -// This is the code path most developers exercise. -#define COMPUTESHADER -#include "/Shaders/Common/VR.hlsli" -#include "/Test/STF/ShaderTestFramework.hlsli" - -static const float kEps = 0.0001f; - -/// @tags vr, flat, uv -/// ConvertToStereoUV is identity in flat mode -[numthreads(1, 1, 1)] void TestFlatConvertToStereoUVIsIdentity() { - float2 uv = float2(0.3, 0.7); - float2 result = Stereo::ConvertToStereoUV(uv, 0); - ASSERT(IsTrue, abs(result.x - uv.x) < kEps); - ASSERT(IsTrue, abs(result.y - uv.y) < kEps); - - // Eye index should not matter in flat - result = Stereo::ConvertToStereoUV(uv, 1); - ASSERT(IsTrue, abs(result.x - uv.x) < kEps); - ASSERT(IsTrue, abs(result.y - uv.y) < kEps); - - // invertY param should also be ignored - result = Stereo::ConvertToStereoUV(uv, 0, 1); - ASSERT(IsTrue, abs(result.x - uv.x) < kEps); - ASSERT(IsTrue, abs(result.y - uv.y) < kEps); -} - - /// @tags vr, flat, uv - /// ConvertFromStereoUV is identity in flat mode - [numthreads(1, 1, 1)] void TestFlatConvertFromStereoUVIsIdentity() -{ - float2 uv = float2(0.6, 0.4); - float2 result = Stereo::ConvertFromStereoUV(uv, 0); - ASSERT(IsTrue, abs(result.x - uv.x) < kEps); - ASSERT(IsTrue, abs(result.y - uv.y) < kEps); - - result = Stereo::ConvertFromStereoUV(uv, 1); - ASSERT(IsTrue, abs(result.x - uv.x) < kEps); - ASSERT(IsTrue, abs(result.y - uv.y) < kEps); -} - -/// @tags vr, flat, uv -/// float3/float4 overloads are also identity in flat mode -[numthreads(1, 1, 1)] void TestFlatStereoUVOverloadsAreIdentity() { - float3 uv3 = float3(0.3, 0.7, 0.5); - float3 result3 = Stereo::ConvertToStereoUV(uv3, 0); - ASSERT(IsTrue, abs(result3.x - uv3.x) < kEps); - ASSERT(IsTrue, abs(result3.y - uv3.y) < kEps); - ASSERT(IsTrue, abs(result3.z - uv3.z) < kEps); - - result3 = Stereo::ConvertFromStereoUV(uv3, 1); - ASSERT(IsTrue, abs(result3.x - uv3.x) < kEps); - ASSERT(IsTrue, abs(result3.y - uv3.y) < kEps); - ASSERT(IsTrue, abs(result3.z - uv3.z) < kEps); - - float4 uv4 = float4(0.3, 0.7, 0.5, 1.0); - float4 result4 = Stereo::ConvertToStereoUV(uv4, 0); - ASSERT(IsTrue, abs(result4.x - uv4.x) < kEps); - ASSERT(IsTrue, abs(result4.y - uv4.y) < kEps); - ASSERT(IsTrue, abs(result4.z - uv4.z) < kEps); - ASSERT(IsTrue, abs(result4.w - uv4.w) < kEps); - - float4 result4_from = Stereo::ConvertFromStereoUV(uv4, 1); - ASSERT(IsTrue, abs(result4_from.x - uv4.x) < kEps); - ASSERT(IsTrue, abs(result4_from.y - uv4.y) < kEps); - ASSERT(IsTrue, abs(result4_from.z - uv4.z) < kEps); - ASSERT(IsTrue, abs(result4_from.w - uv4.w) < kEps); -} - - /// @tags vr, flat, uv - /// Round-trip through To/From is identity in flat mode - [numthreads(1, 1, 1)] void TestFlatStereoUVRoundTrip() -{ - float2 uv = float2(0.8, 0.2); - float2 stereo = Stereo::ConvertToStereoUV(uv, 0); - float2 recovered = Stereo::ConvertFromStereoUV(stereo, 0); - ASSERT(IsTrue, abs(recovered.x - uv.x) < kEps); - ASSERT(IsTrue, abs(recovered.y - uv.y) < kEps); -} - -/// @tags vr, flat, uv -/// GetEyeIndexFromTexCoord always returns 0 in flat mode -[numthreads(1, 1, 1)] void TestFlatGetEyeIndexAlwaysZero() { - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.0, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.25, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.5, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(0.75, 0.5)), 0u); - ASSERT(AreEqual, Stereo::GetEyeIndexFromTexCoord(float2(1.0, 0.5)), 0u); -} diff --git a/package/Shaders/Utility.hlsl b/package/Shaders/Utility.hlsl index 95522d81c9..937d009515 100644 --- a/package/Shaders/Utility.hlsl +++ b/package/Shaders/Utility.hlsl @@ -4,8 +4,6 @@ #include "Common/Random.hlsli" #include "Common/SharedData.hlsli" #include "Common/Skinned.hlsli" -#include "Common/VR.hlsli" - #if defined(RENDER_SHADOWMASK) || defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) || defined(RENDER_SHADOWMASKDPB) # define RENDER_SHADOWMASK_ANY #endif @@ -29,9 +27,6 @@ struct VS_INPUT float4 BoneWeights: BLENDWEIGHT0; float4 BoneIndices: BLENDINDICES0; #endif -#if defined(VR) - uint InstanceID: SV_INSTANCEID; -#endif // VR }; struct VS_OUTPUT @@ -73,23 +68,13 @@ struct VS_OUTPUT float Depth: TEXCOORD2; # endif #endif -#if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 - uint EyeIndex: EYEIDX0; -#endif // VR }; #ifdef VSHADER cbuffer PerTechnique : register(b0) { -# if !defined(VR) float4 HighDetailRange[1] : packoffset(c0); // loaded cells center in xy, size in zw float2 ParabolaParam : packoffset(c1); // inverse radius in x, y is 1 for forward hemisphere or -1 for backward hemisphere -# else - float4 HighDetailRange[2] : packoffset(c0); // loaded cells center in xy, size in zw - float2 ParabolaParam : packoffset(c2); // inverse radius in x, y is 1 for forward hemisphere or -1 for backward hemisphere -# endif // VR }; cbuffer PerMaterial : register(b1) @@ -99,19 +84,11 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) float4 ShadowFadeParam : packoffset(c0); row_major float4x4 World[1] : packoffset(c1); float4 EyePos[1] : packoffset(c5); float4 WaterParams : packoffset(c6); float4 TreeParams : packoffset(c7); -# else - float4 ShadowFadeParam : packoffset(c0); - row_major float4x4 World[2] : packoffset(c1); - float4 EyePos[2] : packoffset(c9); - float4 WaterParams : packoffset(c11); - float4 TreeParams : packoffset(c12); -# endif // VR }; float2 SmoothSaturate(float2 value) @@ -123,18 +100,12 @@ VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif - ); - # if (defined(RENDER_DEPTH) && defined(RENDER_SHADOWMASK_ANY)) || SHADOWFILTER == 2 vsout.PositionCS.xy = input.PositionMS.xy; # if defined(RENDER_SHADOWMASKDPB) || defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) vsout.PositionCS.z = ShadowFadeParam.z; # else - vsout.PositionCS.z = HighDetailRange[eyeIndex].x; + vsout.PositionCS.z = HighDetailRange[0].x; # endif vsout.PositionCS.w = 1; # elif defined(STENCIL_ABOVE_WATER) @@ -157,18 +128,18 @@ VS_OUTPUT main(VS_INPUT input) # endif # if defined(LOD_LANDSCAPE) - positionMS = LodLandscape::AdjustLodLandscapeVertexPositionMS(positionMS, World[eyeIndex], HighDetailRange[eyeIndex]); + positionMS = LodLandscape::AdjustLodLandscapeVertexPositionMS(positionMS, World[0], HighDetailRange[0]); # endif # if defined(SKINNED) precise int4 boneIndices = 765.01.xxxx * input.BoneIndices.xyzw; - float3x4 worldMatrix = Skinned::GetBoneTransformMatrix(Bones, boneIndices, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, input.BoneWeights); + float3x4 worldMatrix = Skinned::GetBoneTransformMatrix(Bones, boneIndices, FrameBuffer::CameraPosAdjust.xyz, input.BoneWeights); precise float4 positionWS = float4(mul(positionMS, transpose(worldMatrix)), 1); - positionCS = mul(FrameBuffer::CameraViewProj[eyeIndex], positionWS); + positionCS = mul(FrameBuffer::CameraViewProj, positionWS); # else - precise float4x4 modelViewProj = mul(FrameBuffer::CameraViewProj[eyeIndex], World[eyeIndex]); + precise float4x4 modelViewProj = mul(FrameBuffer::CameraViewProj, World[0]); positionCS = mul(modelViewProj, positionMS); # endif @@ -193,9 +164,9 @@ VS_OUTPUT main(VS_INPUT input) # if defined(SKINNED) float3x3 boneRSMatrix = Skinned::GetBoneRSMatrix(Bones, boneIndices, input.BoneWeights); normalMS = normalize(mul(normalMS, transpose(boneRSMatrix))); - normalVS = mul(FrameBuffer::CameraView[eyeIndex], float4(normalMS, 0)).xyz; + normalVS = mul(FrameBuffer::CameraView, float4(normalMS, 0)).xyz; # else - normalVS = mul(mul(FrameBuffer::CameraView[eyeIndex], World[eyeIndex]), float4(normalMS, 0)).xyz; + normalVS = mul(mul(FrameBuffer::CameraView, World[0]), float4(normalMS, 0)).xyz; # endif # if defined(RENDER_NORMAL_CLAMP) normalVS = max(min(normalVS, 0.1), -0.1); @@ -220,12 +191,12 @@ VS_OUTPUT main(VS_INPUT input) float falloff = 1; # if defined(RENDER_NORMAL_FALLOFF) # if defined(SKINNED) - falloff = dot(normalMS, normalize(EyePos[eyeIndex].xyz - positionWS.xyz)); + falloff = dot(normalMS, normalize(EyePos[0].xyz - positionWS.xyz)); # else - falloff = dot(normalMS, normalize(EyePos[eyeIndex].xyz - positionMS.xyz)); + falloff = dot(normalMS, normalize(EyePos[0].xyz - positionMS.xyz)); # endif # endif - texCoord.w = EyePos[eyeIndex].w * falloff; + texCoord.w = EyePos[0].w * falloff; # endif vsout.TexCoord0 = texCoord; @@ -273,13 +244,6 @@ VS_OUTPUT main(VS_INPUT input) vsout.PositionCS.z += 5.0; # endif -# ifdef VR - vsout.EyeIndex = eyeIndex; - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.PositionCS, eyeIndex); - vsout.PositionCS = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR return vsout; } #endif @@ -332,37 +296,18 @@ cbuffer PerGeometry : register(b2) float4 PropertyColor : packoffset(c1); float4 AlphaTestRef : packoffset(c2); float4 ShadowLightParam : packoffset(c3); // Falloff in x, ShadowDistance squared in z -# if !defined(VR) float4x3 FocusShadowMapProj[4] : packoffset(c4); -# if defined(RENDER_SHADOWMASK) +# if defined(RENDER_SHADOWMASK) float4x3 ShadowMapProj[1][3] : packoffset(c16); // 16, 19, 22 -# elif defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) || defined(RENDER_SHADOWMASKDPB) +# elif defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) || defined(RENDER_SHADOWMASKDPB) float4x4 ShadowMapProj[1][3] : packoffset(c16); -# endif -# else - float4 VRUnknown : packoffset(c4); // used to multiply by identity matrix, see e.g., 4202499.ps.bin.hlsl - /* - r1.x = dot(cb2[4].xz, icb[r0.w+0].xz); - r1.x = r0.x * cb12[86].x + -r1.x; - r0.w = (int)r0.w + 1; - r0.w = (int)r0.w + -1; - r0.w = dot(cb2[4].yw, icb[r0.w+0].xz); - */ - float4x3 FocusShadowMapProj[4] : packoffset(c5); -# if defined(RENDER_SHADOWMASK) - float4x3 ShadowMapProj[2][3] : packoffset(c29); // VR has a couple of offsets of 3, e.g., {29, 32, 35} and {38, 41, 44}, compare to Flat which does [16, 19, 22] -# elif defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) || defined(RENDER_SHADOWMASKDPB) - float4x4 ShadowMapProj[2][3] : packoffset(c29); -# endif -# endif // VR +# endif } -# if !defined(VR) cbuffer AlphaTestRefCB : register(b11) { float AlphaTestRefRS : packoffset(c0); } -# endif // !VR float SampleShadowPCF(Texture2DArray tex, SamplerComparisonState samp, float2 baseUV, float layerIndex, float compareValue, float2x2 rotationMatrix, float radius) { @@ -392,11 +337,6 @@ PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout; -# if !defined(VR) - uint eyeIndex = 0; -# else - uint eyeIndex = input.EyeIndex; -# endif // !VR # if defined(ADDITIONAL_ALPHA_MASK) uint2 alphaMask = input.PositionCS.xy; alphaMask.x = ((alphaMask.x << 2) & 12); @@ -488,9 +428,9 @@ PS_OUTPUT main(PS_INPUT input) TexStencilSampler.GetDimensions(0, stencilDimensions.x, stencilDimensions.y, stencilDimensions.z); stencilValue = TexStencilSampler.Load(float3(stencilDimensions.xy * depthUv, 0)).x; # endif - depthUv = Stereo::ConvertFromStereoUV(depthUv * FrameBuffer::DynamicResolutionParams2.xy, eyeIndex); + depthUv = depthUv * FrameBuffer::DynamicResolutionParams2.xy; float4 positionCS = float4(2 * float2(depthUv.x, -depthUv.y + 1) - 1, depth, 1); - float4 positionMS = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], positionCS); + float4 positionMS = mul(FrameBuffer::CameraViewProjInverse, positionCS); positionMS.xyz = positionMS.xyz / positionMS.w; float fadeFactor = 1 - pow(saturate(dot(positionMS.xyz, positionMS.xyz) / ShadowLightParam.z), 8); @@ -513,15 +453,15 @@ PS_OUTPUT main(PS_INPUT input) shadowColor = float4(0, 0, 0, 0); if (EndSplitDistances.z >= shadowMapDepth) { - float4x3 lightProjectionMatrix = ShadowMapProj[eyeIndex][0]; + float4x3 lightProjectionMatrix = ShadowMapProj[0][0]; float shadowMapThreshold = AlphaTestRef.y; float cascadeIndex = 0; if (2.5 < EndSplitDistances.w && EndSplitDistances.y < shadowMapDepth) { - lightProjectionMatrix = ShadowMapProj[eyeIndex][2]; + lightProjectionMatrix = ShadowMapProj[0][2]; shadowMapThreshold = AlphaTestRef.z; cascadeIndex = 2; } else if (EndSplitDistances.x < shadowMapDepth) { - lightProjectionMatrix = ShadowMapProj[eyeIndex][1]; + lightProjectionMatrix = ShadowMapProj[0][1]; shadowMapThreshold = AlphaTestRef.z; cascadeIndex = 1; } @@ -544,7 +484,7 @@ PS_OUTPUT main(PS_INPUT input) if (cascadeIndex < 1 && StartSplitDistances.y < shadowMapDepth) { float cascade1ShadowVisibility = 0; - float3 cascade1PositionLS = mul(transpose(ShadowMapProj[eyeIndex][1]), float4(positionMS.xyz, 1)).xyz; + float3 cascade1PositionLS = mul(transpose(ShadowMapProj[0][1]), float4(positionMS.xyz, 1)).xyz; # if SHADOWFILTER == 0 float cascade1ShadowMapValue = TexShadowMapSampler.Sample(SampShadowMapSampler, float3(cascade1PositionLS.xy, 1)).x; @@ -580,7 +520,7 @@ PS_OUTPUT main(PS_INPUT input) shadowColor.xyzw = lerp(1.0 * !SharedData::InInterior, shadowVisibility, fadeFactor); } # elif defined(RENDER_SHADOWMASKSPOT) - float4 positionLS = mul(transpose(ShadowMapProj[eyeIndex][0]), float4(positionMS.xyz, 1)); + float4 positionLS = mul(transpose(ShadowMapProj[0][0]), float4(positionMS.xyz, 1)); positionLS.xyz /= positionLS.w; float2 shadowMapUv = positionLS.xy * 0.5 + 0.5; float shadowBaseVisibility = 0; @@ -618,7 +558,7 @@ PS_OUTPUT main(PS_INPUT input) shadowColor.xyzw = fadeFactor * shadowVisibility; # elif defined(RENDER_SHADOWMASKPB) - float4 unadjustedPositionLS = mul(transpose(ShadowMapProj[eyeIndex][0]), float4(positionMS.xyz, 1)); + float4 unadjustedPositionLS = mul(transpose(ShadowMapProj[0][0]), float4(positionMS.xyz, 1)); float shadowVisibility = 0; @@ -643,7 +583,7 @@ PS_OUTPUT main(PS_INPUT input) shadowColor.xyzw = fadeFactor * shadowVisibility; # elif defined(RENDER_SHADOWMASKDPB) - float3 positionLS = mul(transpose(ShadowMapProj[eyeIndex][0]), float4(positionMS.xyz, 1)).xyz; + float3 positionLS = mul(transpose(ShadowMapProj[0][0]), float4(positionMS.xyz, 1)).xyz; bool lowerHalf = positionLS.z * 0.5 + 0.5 < 0; float3 normalizedPositionLS = normalize(positionLS); diff --git a/package/Shaders/VR/InSceneOverlay.ps.hlsl b/package/Shaders/VR/InSceneOverlay.ps.hlsl deleted file mode 100644 index 7638542c53..0000000000 --- a/package/Shaders/VR/InSceneOverlay.ps.hlsl +++ /dev/null @@ -1,18 +0,0 @@ -// VR In-Scene Overlay Pixel Shader -// Samples overlay texture with alpha blending support - -Texture2D shaderTexture : register(t0); -SamplerState sampleType : register(s0); - -struct PS_INPUT -{ - float4 pos: SV_POSITION; - float2 uv: TEXCOORD0; -}; - -float4 main(PS_INPUT input) : - SV_TARGET -{ - float4 color = shaderTexture.Sample(sampleType, input.uv); - return color; -} diff --git a/package/Shaders/VR/InSceneOverlay.vs.hlsl b/package/Shaders/VR/InSceneOverlay.vs.hlsl deleted file mode 100644 index b8d2d09308..0000000000 --- a/package/Shaders/VR/InSceneOverlay.vs.hlsl +++ /dev/null @@ -1,27 +0,0 @@ -// VR In-Scene Overlay Vertex Shader -// Simple pass-through shader for rendering overlay quad in VR - -cbuffer MatrixBuffer : register(b0) -{ - matrix wvp; -}; - -struct VS_INPUT -{ - float3 pos: POSITION; - float2 uv: TEXCOORD0; -}; - -struct PS_INPUT -{ - float4 pos: SV_POSITION; - float2 uv: TEXCOORD0; -}; - -PS_INPUT main(VS_INPUT input) -{ - PS_INPUT output; - output.pos = mul(float4(input.pos, 1.0f), wvp); - output.uv = input.uv; - return output; -} diff --git a/package/Shaders/VR/StereoBlendCS.hlsl b/package/Shaders/VR/StereoBlendCS.hlsl deleted file mode 100644 index a6e66d1ea0..0000000000 --- a/package/Shaders/VR/StereoBlendCS.hlsl +++ /dev/null @@ -1,362 +0,0 @@ -// Stereo Bilateral Blend - Post-composite stereo consistency pass for VR -// -// Full-image depth-aware bilateral blend with back-check validation that -// reprojects each pixel to the other eye and blends based on depth agreement. -// Source and destination edge detection guard silhouette boundaries before -// reprojection; the back-check provides a second layer of validation. -// -// Based on the stereo-aware bilateral filter from: -// Shi, Billeter, Eisemann 2022, "Stereo-consistent screen-space ambient occlusion" -// https://eprints.whiterose.ac.uk/id/eprint/187713/ - -#include "Common/Color.hlsli" -#include "Common/FrameBuffer.hlsli" -#include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" - -Texture2D ColorTexture : register(t0); -Texture2D DepthTexture : register(t1); - -RWTexture2D OutputRW : register(u0); - -#ifdef STEREO_OVERWRITE -RWTexture2D MotionRW : register(u1); -Texture2D ModeTexture : register(t2); -Texture2D PomOffsetTexture : register(t3); // R16_FLOAT: Stereo::POM_NO_DATA (-1.0) = no POM; >= 0.0 = POM ran -SamplerState LinearSampler : register(s0); - -# include "VRStereoOptimizations/modes.hlsli" - -// Hardware bilinear color sample from reprojected pixel coordinates. -// Converts integer pixel coords to proper full-texture UV for SampleLevel, -// clamped to the active DRS viewport to prevent sampling stale data. -// Motion vectors stay as integer Load() — filtering them breaks DLSS. -float4 SampleReprojectedColor(float2 stereoUV, float2 frameDim) -{ - uint texW, texH; - ColorTexture.GetDimensions(texW, texH); - float2 texSize = float2(texW, texH); - float2 minUV = 0.5 / texSize; - float2 maxUV = (frameDim - 0.5) / texSize; - stereoUV = clamp(stereoUV, minUV, maxUV); - return ColorTexture.SampleLevel(LinearSampler, stereoUV, 0); -} -#endif - -cbuffer StereoBlendCB : register(b1) -{ - float2 FrameDim; - float2 RcpFrameDim; - float DepthSigma; - float MaxBlendFactor; - float ColorDiffThreshold; - float DebugEdgeTint; - uint DebugMode; // 0 = normal, 1 = depth map diagnostic, 2 = full blend depth visualizer, 3 = POM depth heatmap - float FullBlendDistance; - float POMDepthScale; - float _pad; -}; - -static const float kEdgeDepthThreshold = 0.05; // NDC depth difference above which a pixel is considered a depth discontinuity and excluded from stereo blend -static const int kEdgeMargin = 2; // Neighbor offset (pixels) for destination edge + mask boundary check -static const float kDepthAgreementThreshold = 0.015; // Relative depth difference threshold for overwrite mode disocclusion rejection - -// Samples four depth neighbors in a cross pattern (±offset pixels) around center, -// clamped to eyeIndex's half of the packed stereo buffer to avoid seam contamination. -float4 SampleCrossDepths(int2 center, int offset, uint eyeIndex) -{ - return float4( - DepthTexture[Stereo::ClampToEyeBounds(center + int2(offset, 0), eyeIndex, FrameDim)], - DepthTexture[Stereo::ClampToEyeBounds(center + int2(-offset, 0), eyeIndex, FrameDim)], - DepthTexture[Stereo::ClampToEyeBounds(center + int2(0, offset), eyeIndex, FrameDim)], - DepthTexture[Stereo::ClampToEyeBounds(center + int2(0, -offset), eyeIndex, FrameDim)]); -} - -[numthreads(8, 8, 1)] void main(uint2 dtid : SV_DispatchThreadID) { - if (any(dtid >= uint2(FrameDim))) - return; - -#ifdef STEREO_OVERWRITE - // ========================================================================= - // Mode-driven stereo merge: reads per-pixel classification from StencilCS - // and applies appropriate action per mode and eye. - // Mode texture is full SBS resolution — ModeTexture[dtid] maps directly. - // ========================================================================= - - float2 uv = (dtid + 0.5) * RcpFrameDim; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - - float centerDepth = DepthTexture[dtid]; - - // HMD mask pixels (depth >= 1.0 in reversed-Z) — always skip - if (centerDepth >= 1.0) - return; - - uint pixelMode = ModeTexture[dtid]; - - // Debug mode 1: depth map diagnostic — show mode texture as solid colors (all pixels) - if (DebugMode == 1) { - float4 c = ColorTexture[dtid]; - if (pixelMode == MODE_EDGE) - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 1, 0), 0.5), c.a); - else if (pixelMode == MODE_EDGE_NEIGHBOUR) - OutputRW[dtid] = float4(lerp(c.rgb, float3(1, 0, 1), 0.5), c.a); - else if (pixelMode == MODE_DISOCCLUDED) - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 0.5, 1), 0.3), c.a); - else if (pixelMode == MODE_FULL_BLEND) - OutputRW[dtid] = float4(lerp(c.rgb, float3(1, 0.5, 0), 0.5), c.a); - return; - } - - // Debug mode 2: full blend depth visualizer — cyan tint based on proximity to FullBlendDistance - if (DebugMode == 2) { - if (centerDepth < 1e-5 || centerDepth >= 1.0) - return; - float linDepth = SharedData::GetScreenDepth(centerDepth); - if (linDepth < FullBlendDistance) { - float4 c = ColorTexture[dtid]; - float proximity = saturate(1.0 - linDepth / max(FullBlendDistance, 1.0)); - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 1, 1), proximity * 0.4), c.a); - } - return; - } - - // Debug mode 3: POM depth data visualizer — show PomOffsetTexture as color - if (DebugMode == 3) { - float pomVal = PomOffsetTexture[dtid]; - float4 c = ColorTexture[dtid]; - if (pomVal >= 0.0) { - // POM pixel: red-to-green gradient based on parallaxAmount - // Red = peak (high pomVal, closer to camera), Green = valley (low pomVal, farther), Yellow = geometry plane - float3 pomColor = float3(pomVal, 1.0 - pomVal, 0); - OutputRW[dtid] = float4(lerp(c.rgb, pomColor, 0.7), c.a); - } - // Non-POM pixels store -1.0 sentinel, left untouched - return; - } - - // MODE_DISOCCLUDED: fully shaded, leave untouched - if (pixelMode == MODE_DISOCCLUDED) - return; - - // MODE_FULL_BLEND: bilateral blend for 2x supersampling - if (pixelMode == MODE_FULL_BLEND) { - float4 center = ColorTexture[dtid]; - - // Check for POM depth offset at this pixel - // pixelOffset = parallaxAmount (0-1) from ExtendedMaterials, 0.5 = geometry plane. - // Values > 0.5 are peaks (closer to camera), < 0.5 are valleys (farther from camera). - // Correction: high pomVal should push depth closer (smaller linear depth), - // so we use (0.5 - pomOffset) to get a negative correction for peaks. - // Non-POM pixels store -1.0 (sentinel); hasPOM is encoded by sign: >= 0 means POM ran. - float reprojDepthFB = centerDepth; - float pomOffsetFB = PomOffsetTexture[dtid]; - if (pomOffsetFB >= 0.0 && POMDepthScale > 0) { - float linDepthFB = SharedData::GetScreenDepth(centerDepth); - float depthCorrectionFB = (0.5 - pomOffsetFB) * POMDepthScale; - float newLinDepthFB = max(linDepthFB + depthCorrectionFB, 1e-4); - reprojDepthFB = (SharedData::CameraData.x - SharedData::CameraData.w / newLinDepthFB) / SharedData::CameraData.z; - } - - // Reproject to the other eye - Stereo::StereoBilateralResult r = Stereo::ReprojectToOtherEye(uv, reprojDepthFB, eyeIndex, FrameDim); - if (!r.valid) { - // Debug tint for failed reprojection - if (DebugEdgeTint > 0) - OutputRW[dtid] = float4(lerp(center.rgb, float3(1, 0.5, 0), DebugEdgeTint), center.a); - return; - } - - // Only blend with pixels that have valid composited data in both eyes - uint otherMode = ModeTexture[r.otherPx]; - if (otherMode != MODE_FULL_BLEND && otherMode != MODE_DISOCCLUDED) - return; - - float4 otherColor = SampleReprojectedColor(r.otherStereoUV, FrameDim); - float otherDepth = DepthTexture[r.otherPx]; - - // Depth-weighted bilateral blend - float maxDepth = max(max(centerDepth, otherDepth), 1e-5); - float depthAgreement = 1.0 - saturate(abs(centerDepth - otherDepth) / maxDepth / 0.02); - float blendWeight = 0.5 * depthAgreement; - - float4 result = lerp(center, otherColor, blendWeight); - - if (DebugEdgeTint > 0) - result.rgb = lerp(result.rgb, float3(0, 1, 1), DebugEdgeTint); - - OutputRW[dtid] = result; - return; - } - - if (eyeIndex == 0) { - // Eye 0 (left eye): fully shaded for all modes — only apply debug tint to edge pixels - if (DebugEdgeTint > 0 && pixelMode == MODE_EDGE) { - float4 c = ColorTexture[dtid]; - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 1, 0), DebugEdgeTint), c.a); - } - return; - } - - // Eye 1 (right eye): reproject all non-disoccluded, non-full-blend pixels - // (MAIN, EDGE) from Eye 0 (left eye). In VR stereo rendering, Eye 0 is - // fully shaded; Eye 1 pixels marked as reprojectable by StencilCS are - // filled with reprojected color from Eye 0 to save GPU work. - // StencilCS already performed the authoritative disocclusion check with the correct - // depth buffer state — no redundant depth agreement check here. - float reprojDepth = centerDepth; - - // First-pass reprojection to find Eye 0 source pixel - Stereo::StereoBilateralResult r = Stereo::ReprojectToOtherEye(uv, reprojDepth, eyeIndex, FrameDim); - if (!r.valid) - return; - - // Save first-pass result as fallback before POM adjustment - Stereo::StereoBilateralResult firstPassR = r; - - // Read POM offset from dedicated POM texture (R16_FLOAT, written by Lighting PS at u7). - // pixelOffset = parallaxAmount (0-1) from ExtendedMaterials, 0.5 = geometry plane. - // Values > 0.5 are peaks (closer to camera), < 0.5 are valleys (farther from camera). - // Correction: high pomOffset should push depth closer (smaller linear depth), - // so we use (0.5 - pomOffset) to get a negative correction for peaks. - // Non-POM pixels store -1.0 (sentinel); hasPOM is encoded by sign: >= 0 means POM ran. - float pomOffset = PomOffsetTexture[r.otherPx]; - if (pomOffset >= 0.0) { - // Re-reproject with POM-adjusted depth centered at geometry plane - float linearDepth = SharedData::GetScreenDepth(centerDepth); - float depthCorrection = (0.5 - pomOffset) * POMDepthScale; - float newLinearDepth = max(linearDepth + depthCorrection, 1e-4); - reprojDepth = (SharedData::CameraData.x - SharedData::CameraData.w / newLinearDepth) / SharedData::CameraData.z; - r = Stereo::ReprojectToOtherEye(uv, reprojDepth, eyeIndex, FrameDim); - if (!r.valid) - r = firstPassR; // Fall back to non-POM reprojection - } - - // Skip if the Eye 0 source pixel is sky/unrendered (depth at clear value). - // At DeferredPasses time, sky hasn't rendered yet — source would have clear color. - // Let the sky/water pass fill these pixels later instead. - float sourceDepth = DepthTexture[r.otherPx]; - if (sourceDepth >= 1.0 || sourceDepth < 1e-5) { - // POM adjustment landed on sky — try the original first-pass source - if (r.otherPx.x != firstPassR.otherPx.x || r.otherPx.y != firstPassR.otherPx.y) { - float fallbackDepth = DepthTexture[firstPassR.otherPx]; - if (fallbackDepth < 1.0 && fallbackDepth >= 1e-5) { - r = firstPassR; - } else { - return; - } - } else { - return; - } - } - - OutputRW[dtid] = SampleReprojectedColor(r.otherStereoUV, FrameDim); - MotionRW[dtid] = MotionRW[r.otherPx]; - -#else // Normal bilateral blend path - -# ifdef EYE0_ONLY - // Only process Eye 0 (left half) - Eye 1 left untouched - float2 uvCheck = (dtid + 0.5) * RcpFrameDim; - if (Stereo::GetEyeIndexFromTexCoord(uvCheck) == 1) - return; -# endif - - float2 uv = (dtid + 0.5) * RcpFrameDim; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - - float4 centerColor = ColorTexture[dtid]; - float centerDepth = DepthTexture[dtid]; - - // Debug states: - // 0 = mask/sky: skipped (depth == 0 or 1) - // 1 = source edge: depth discontinuity at this pixel - // 2 = destination edge: depth discontinuity at reprojected pixel - // 3 = out of bounds: reprojection left the other eye's frame - // 4 = blended, back-check passed: surfaces match in both eyes - // 5 = blended, back-check failed: blend penalized (occlusion edge) - uint debugState = 0; - - Stereo::StereoBilateralResult r = (Stereo::StereoBilateralResult)0; - float4 blendedColor = centerColor; - - // depth == 0.0: VR HMD mask (pixels outside the lens area, never written by the engine) - // depth == 1.0: sky/far plane (no real geometry, bilateral reprojection not meaningful) - bool isSkipPixel = centerDepth < 1e-5 || centerDepth >= 1.0; - if (!isSkipPixel) { - // Source edge detection: skip at depth discontinuities (arm/world silhouettes, - // object edges). Saves VP reprojection work and prevents halo artifacts. - float4 srcEdgeDepths = SampleCrossDepths(dtid, 1, eyeIndex); - if (Stereo::MaxDepthDiff(centerDepth, srcEdgeDepths) > kEdgeDepthThreshold) { - debugState = 1; - } else { - r = Stereo::ReprojectToOtherEye(uv, centerDepth, eyeIndex, FrameDim); - if (r.valid) { - float otherDepth = DepthTexture[r.otherPx]; - - float4 dstEdgeDepths = SampleCrossDepths(r.otherPx, kEdgeMargin, 1 - eyeIndex); - if (any(dstEdgeDepths < 1e-5) || Stereo::MaxDepthDiff(otherDepth, dstEdgeDepths) > kEdgeDepthThreshold) { - debugState = 2; - } else { - float4 otherColor = ColorTexture[r.otherPx]; - Stereo::FinalizeStereoBlend(r, uv, centerDepth, otherDepth, eyeIndex, FrameDim, DepthSigma, MaxBlendFactor); - - float colorDiff = abs(dot(centerColor.rgb, float3(0.2126, 0.7152, 0.0722)) - - dot(otherColor.rgb, float3(0.2126, 0.7152, 0.0722))); - float colorGate = smoothstep(ColorDiffThreshold * 0.5, ColorDiffThreshold * 2.0, colorDiff); - r.blendWeight *= colorGate; - - blendedColor = lerp(centerColor, otherColor, r.blendWeight); - debugState = r.backCheckPassed ? 4 : 5; - } - } else { - debugState = 3; - } - } - } - -# ifdef DEBUG_BACKCHECK - // Debug visualization (6 states): - // Blue = mask/sky: skipped - // Yellow = source edge: depth discontinuity at this pixel - // Orange = destination edge: depth discontinuity at reprojected pixel - // Grey = out of bounds: other eye can't see this point - // Green = back-check passed: surfaces match in both eyes - // Red = back-check failed: blend penalized (occlusion edge) - float3 debugColors[6] = { - float3(0.1, 0.1, 0.5), // 0: mask/sky - blue - float3(0.8, 0.8, 0.0), // 1: source edge - yellow - float3(0.8, 0.4, 0.0), // 2: destination edge - orange - float3(0.3, 0.3, 0.3), // 3: out of bounds - grey - float3(0.0, 0.5, 0.0), // 4: back-check passed - green - float3(0.5, 0.0, 0.0) // 5: back-check failed - red - }; - OutputRW[dtid] = float4(lerp(centerColor.rgb, debugColors[debugState], 0.7), centerColor.a); -# elif defined(DEBUG_BLEND_WEIGHT) - // Blend weight heatmap: only pixels with actual blend activity are colorized. - // Untouched pixels pass through unmodified. - float w = saturate(r.blendWeight / max(MaxBlendFactor, 1e-5)); - if (w > 1e-3) { - float3 heatmap = Color::TurboColormap(w); - OutputRW[dtid] = float4(lerp(centerColor.rgb, saturate(heatmap), 0.8), centerColor.a); - } else { - OutputRW[dtid] = centerColor; - } -# elif defined(DEBUG_EDGE_DETECTION) - // Edge detection visualizer: highlights pixels excluded by depth discontinuity checks. - // Non-edge pixels show the normal blended output for scene context. - // Bright yellow = source edge: discontinuity at this pixel - // Bright orange = destination edge: discontinuity at reprojected pixel - if (debugState == 1) { - OutputRW[dtid] = float4(lerp(centerColor.rgb, float3(1.0, 1.0, 0.0), 0.8), centerColor.a); - } else if (debugState == 2) { - OutputRW[dtid] = float4(lerp(centerColor.rgb, float3(1.0, 0.5, 0.0), 0.8), centerColor.a); - } else { - OutputRW[dtid] = blendedColor; - } -# else - OutputRW[dtid] = blendedColor; -# endif - -#endif // STEREO_OVERWRITE -} diff --git a/package/Shaders/VR/VRPostProcessCS.hlsl b/package/Shaders/VR/VRPostProcessCS.hlsl deleted file mode 100644 index 770e244553..0000000000 --- a/package/Shaders/VR/VRPostProcessCS.hlsl +++ /dev/null @@ -1,109 +0,0 @@ -// VR Post-Process - Bilateral blend for near-camera 2x supersampling -// -// Runs after all compositing and stereo blending is complete. -// Reads per-pixel classification from StencilCS and applies: -// - MODE_FULL_BLEND: bilateral depth-weighted blend for 2x supersampling -// -// Only MODE_FULL_BLEND pixels are processed. All others pass through untouched. - -#include "Common/FrameBuffer.hlsli" -#include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" - -Texture2D ColorTexture : register(t0); // Copy of final composited image -Texture2D ModeTexture : register(t1); -Texture2D DepthTexture : register(t2); - -RWTexture2D OutputRW : register(u0); - -cbuffer VRPostProcessCB : register(b1) -{ - float2 FrameDim; - float2 RcpFrameDim; - float DebugEdgeTint; // 0 = off, >0 = debug visualization strength - uint DebugMode; // 0 = normal, 1 = depth map diagnostic, 2 = full blend depth visualizer - float FullBlendDistance; // Linearized depth threshold for full blend zone visualization - float _pad; // Pad to 16-byte alignment -}; - -#include "VRStereoOptimizations/modes.hlsli" - -[numthreads(8, 8, 1)] void main(uint2 dtid : SV_DispatchThreadID) { - if (any(dtid >= uint2(FrameDim))) - return; - - uint pixelMode = ModeTexture[dtid]; - - // Depth map diagnostic: show mode texture contents as solid colors - if (DebugMode == 1) { - float4 c = ColorTexture[dtid]; - if (pixelMode == MODE_EDGE) - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 1, 0), 0.5), c.a); - else if (pixelMode == MODE_EDGE_NEIGHBOUR) - OutputRW[dtid] = float4(lerp(c.rgb, float3(1, 0, 1), 0.5), c.a); - else if (pixelMode == MODE_DISOCCLUDED) - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 0.5, 1), 0.3), c.a); - else if (pixelMode == MODE_FULL_BLEND) - OutputRW[dtid] = float4(lerp(c.rgb, float3(1, 0.5, 0), 0.5), c.a); // Orange = full blend zone - return; - } - - // Full blend depth visualizer: shows the depth boundary as a cyan tint - if (DebugMode == 2) { - float2 uvDb = (dtid + 0.5) * RcpFrameDim; - float depthDb = DepthTexture[dtid]; - if (depthDb < 1e-5 || depthDb >= 1.0) - return; - float linDepth = SharedData::GetScreenDepth(depthDb); - if (linDepth < FullBlendDistance) { - float4 c = ColorTexture[dtid]; - float proximity = saturate(1.0 - linDepth / max(FullBlendDistance, 1.0)); - OutputRW[dtid] = float4(lerp(c.rgb, float3(0, 1, 1), proximity * 0.4), c.a); - } - return; - } - - // Only process full blend pixels - if (pixelMode != MODE_FULL_BLEND) - return; - - float2 uv = (dtid + 0.5) * RcpFrameDim; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - - float4 result = ColorTexture[dtid]; - - // === MODE_FULL_BLEND: bilateral blend for 2x supersampling === - { - float4 center = result; - float centerDepth = DepthTexture[dtid]; - - // Reproject to the other eye - Stereo::StereoBilateralResult r = Stereo::ReprojectToOtherEye(uv, centerDepth, eyeIndex, FrameDim); - if (!r.valid) { - // Debug tint for failed reprojection - if (DebugEdgeTint > 0) - OutputRW[dtid] = float4(lerp(center.rgb, float3(1, 0.5, 0), DebugEdgeTint), center.a); - return; - } - - // Only blend with pixels that have valid composited data in both eyes. - uint otherMode = ModeTexture[r.otherPx]; - if (otherMode != MODE_FULL_BLEND && otherMode != MODE_DISOCCLUDED) - return; - - float4 otherColor = ColorTexture[r.otherPx]; - float otherDepth = DepthTexture[r.otherPx]; - - // Depth-weighted bilateral blend - float maxDepth = max(max(centerDepth, otherDepth), 1e-5); - float depthAgreement = 1.0 - saturate(abs(centerDepth - otherDepth) / maxDepth / 0.02); - float blendWeight = 0.5 * depthAgreement; - - result = lerp(center, otherColor, blendWeight); - - if (DebugEdgeTint > 0) - result.rgb = lerp(result.rgb, float3(0, 1, 1), DebugEdgeTint); - } - - OutputRW[dtid] = result; -} diff --git a/package/Shaders/VRStereoOptimizations/StencilCS.hlsl b/package/Shaders/VRStereoOptimizations/StencilCS.hlsl deleted file mode 100644 index 8a66a7e676..0000000000 --- a/package/Shaders/VRStereoOptimizations/StencilCS.hlsl +++ /dev/null @@ -1,172 +0,0 @@ -// VR Stereo Optimizations - Stencil Classification Compute Shader -// -// Classifies BOTH eyes over the full SBS buffer. Each pixel is tagged as: -// MODE_DISOCCLUDED - Must be fully shaded (sky, HMD mask, parallax-occluded) -// MODE_EDGE - Depth edge boundary (dist 1) or inner/foreground band; fully shaded + bilateral blend -// MODE_MAIN - Standard pixel eligible for reprojection / bilateral blend -// MODE_FULL_BLEND - Near-camera geometry: both eyes fully shaded for 2x supersampling -// -// Dispatched over full SBS resolution (FrameDim.x x FrameDim.y). - -#include "Common/SharedData.hlsli" -#include "Common/VR.hlsli" -#include "VRStereoOptimizations/cbuffers.hlsli" - -Texture2D DepthTexture : register(t0); - -RWTexture2D ModeTextureRW : register(u0); - -// Sentinel for the edge-detection search: means "no discontinuity found yet". -static const uint kEdgeDistNone = 0xFFFFFFFFu; - -[numthreads(8, 8, 1)] void main(uint2 dtid : SV_DispatchThreadID) { - if (any(dtid >= uint2(FrameDim))) - return; - - // Determine which eye this pixel belongs to - float2 uv = (float2(dtid) + 0.5) / FrameDim; - uint eyeIndex = Stereo::GetEyeIndexFromTexCoord(uv); - - // Read depth directly in SBS coords - float centerDepth = DepthTexture[dtid]; - -#ifdef DEBUG_DEPTH_MAP - // DIAGNOSTIC: Visualize what depth values StencilCS sees. - // Green (MODE_EDGE) = depth >= 1.0 (HMD mask threshold) - // Magenta (MODE_EDGE_NEIGHBOUR) = depth < EPSILON_DEPTH_SKY (sky threshold) - // No tint (MODE_MAIN) = normal geometry with valid depth - if (centerDepth >= 1.0) { - ModeTextureRW[dtid] = MODE_EDGE; - return; - } - if (centerDepth < EPSILON_DEPTH_SKY) { - ModeTextureRW[dtid] = MODE_EDGE_NEIGHBOUR; - return; - } - ModeTextureRW[dtid] = MODE_MAIN; - return; -#endif - - // Sky/unrendered pixels (depth >= 1.0 at z-prepass time = depth buffer clear value) - // and HMD mask pixels both have depth >= 1.0 here. Treat them the same as sky: - // let edge detection run so geometry-vs-sky boundaries get classified. - // HMD mask pixels are in lens corners with no nearby geometry, so they'll - // fall through to MODE_DISOCCLUDED at the end. - bool isSky = (centerDepth < EPSILON_DEPTH_SKY) || (centerDepth >= 1.0); - float linCenter = isSky ? DEPTH_SKY_SENTINEL : SharedData::GetScreenDepth(centerDepth); - - // Near-camera supersampling: geometry closer than FullBlendDistance gets full - // shading in both eyes for bilateral blend (2x supersampling in VRPostProcess). - if (!isSky && linCenter < FullBlendDistance) { - ModeTextureRW[dtid] = MODE_FULL_BLEND; - return; - } - - // --- Disocclusion detection via reprojection (runs for all non-sky pixels) --- - // Early return: disoccluded pixels are always MODE_DISOCCLUDED regardless of edge proximity. - // This ensures MinEdgeDistance never affects disocclusion classification. - if (!isSky) { - Stereo::StereoBilateralResult reproj = Stereo::ReprojectToOtherEye( - uv, - centerDepth, - eyeIndex, - FrameDim); - - bool isDisoccluded = false; - if (!reproj.valid) { - isDisoccluded = true; - } else { - float otherDepth = DepthTexture[reproj.otherPx]; - // Raw reversed-Z depth comparison for disocclusion detection. - // Using raw depth avoids concentric semicircle artifacts that occur - // with linearized depth due to precision band boundaries in the - // hyperbolic depth-to-linear conversion. - float maxRaw = max(max(centerDepth, otherDepth), EPSILON_DIVISION); - float rawRelDiff = abs(centerDepth - otherDepth) / maxRaw; - isDisoccluded = (rawRelDiff > DisocclusionThreshold); - - // Directional disocclusion: catches silhouette edge pixels where both eyes sample - // similar linearized depth but Eye 0's color is wrong for Eye 1. These slip through - // the symmetric rawRelDiff check above. The condition fires when Eye 0 is at similar - // or slightly closer depth than Eye 1 (scale < 1.0), marking them disoccluded so Eye 1 - // renders natively. ForwardOcclusionScale=0.5 triggers when Eye 0 is less than 2x Eye 1's - // linearized depth; lower values are more aggressive, 0 = disabled. - if (!isDisoccluded && eyeIndex == 1 && ForwardOcclusionScale > 0.0) { - bool otherIsSky = (otherDepth < EPSILON_DEPTH_SKY) || (otherDepth >= 1.0); - if (!otherIsSky) { - float linOther = SharedData::GetScreenDepth(otherDepth); - isDisoccluded = (linOther * ForwardOcclusionScale < linCenter); - } - } - } - - if (isDisoccluded) { - ModeTextureRW[dtid] = MODE_DISOCCLUDED; - return; - } - } - - // Depth gate: skip edge detection for nearby geometry (saves perf, distant AA matters more) - // Sky pixels always run edge detection — they need to expand the edge band outward. - // Disocclusion detection (above) is independent of this gate and always runs. - bool skipEdgeDetection = !isSky && (linCenter < MinEdgeDistance); - - // --- Edge detection with two-tier classification --- - // MODE_EDGE: immediate neighbor (distance 1) has depth discontinuity, OR - // inner/foreground band (distance <= kInnerWidth). - // kInnerWidth=4 provides enough margin at high VR resolutions (~8k wide) to catch - // disocclusion boundary pixels that are just outside the immediate-neighbor band. - static const uint kInnerWidth = 4; - int2 offsets[4] = { int2(-1, 0), int2(1, 0), int2(0, -1), int2(0, 1) }; - - uint nearestEdgeDist = kEdgeDistNone; // nearest distance at which a discontinuity was found - bool nearestWeAreOuter = false; // whether we are on the background side at that nearest hit - - // Use the larger of inner/outer widths for the search - uint maxWidth = kInnerWidth; - - if (!skipEdgeDetection) { - [loop] for (uint d = 1; d <= maxWidth; d++) - { - [unroll] for (int i = 0; i < 4; i++) - { - int2 rawNeighbor = int2(dtid) + offsets[i] * (int)d; - uint2 neighborCoord = Stereo::ClampToEyeBounds(rawNeighbor, eyeIndex, FrameDim); - - float neighborDepth = DepthTexture[neighborCoord]; - bool neighborIsSky = (neighborDepth < EPSILON_DEPTH_SKY) || (neighborDepth >= 1.0); - float linNeighbor = neighborIsSky ? DEPTH_SKY_SENTINEL : SharedData::GetScreenDepth(neighborDepth); - float maxLin = max(max(linCenter, linNeighbor), EPSILON_DEPTH_SKY); - float relDepthDiff = abs(linCenter - linNeighbor) / maxLin; - - if (relDepthDiff > EdgeDepthThreshold && d < nearestEdgeDist) { - nearestEdgeDist = d; - nearestWeAreOuter = (linNeighbor < linCenter); // neighbor closer to camera = we are background - } - } - } - - } // !skipEdgeDetection - - if (nearestEdgeDist != kEdgeDistNone) { - // Classify based on distance and side - if (nearestEdgeDist == 1) { - // Immediate neighbor discontinuity: always MODE_EDGE regardless of side - ModeTextureRW[dtid] = MODE_EDGE; - return; - } else if (!nearestWeAreOuter && nearestEdgeDist <= kInnerWidth) { - // Inner/foreground band beyond distance 1 - ModeTextureRW[dtid] = MODE_EDGE; - return; - } - } - - // Sky pixels that aren't near edges -> disoccluded (reprojection is meaningless for sky) - if (isSky) { - ModeTextureRW[dtid] = MODE_DISOCCLUDED; - return; - } - - // Standard pixel - ModeTextureRW[dtid] = MODE_MAIN; -} diff --git a/package/Shaders/VRStereoOptimizations/StencilWritePS.hlsl b/package/Shaders/VRStereoOptimizations/StencilWritePS.hlsl deleted file mode 100644 index 6e49007035..0000000000 --- a/package/Shaders/VRStereoOptimizations/StencilWritePS.hlsl +++ /dev/null @@ -1,40 +0,0 @@ -// VR Stereo Optimizations - Stencil Write Pixel Shader -// -// Reads from the per-pixel mode classification texture. -// Only MODE_MAIN pixels write stencil ref=1 — these are reprojected by ReprojectionCS -// and must be skipped by the geometry pass (NOT_EQUAL stencil test, ref=1). -// -// All other modes (DISOCCLUDED, EDGE, EDGE_NEIGHBOUR, FULL_BLEND) discard so -// geometry renders those pixels normally. ReprojectionCS only fills MODE_MAIN, so -// stencil must not be written for any other mode. -// -// Mode texture is full SBS resolution (same as render target). -// The DSS is configured with StencilFunc=ALWAYS, StencilPassOp=REPLACE, ref=1. -// Pixels that survive (not discarded) get stencil=1 written. - -#include "VRStereoOptimizations/cbuffers.hlsli" - -Texture2D ModeTexture : register(t0); - -struct PS_INPUT -{ - float4 Position: SV_Position; - float2 TexCoord: TEXCOORD0; -}; - -void main(PS_INPUT input) -{ - // Mode texture is full SBS resolution — SV_Position maps directly - // (viewport is Eye 1 half, so SV_Position.x starts at eyeWidth) - int2 modeCoord = int2(input.Position.xy); - - uint mode = ModeTexture[modeCoord]; - - // Only MODE_MAIN pixels are filled by ReprojectionCS and should be stencil-culled. - // EDGE/EDGE_NEIGHBOUR/FULL_BLEND must render normally; DISOCCLUDED is also fully shaded. - if (mode != MODE_MAIN) - discard; - - // Pixel survives: DSS writes stencil ref=1 - // No color output (no RTV bound) -} diff --git a/package/Shaders/VRStereoOptimizations/StencilWriteVS.hlsl b/package/Shaders/VRStereoOptimizations/StencilWriteVS.hlsl deleted file mode 100644 index 353aa53379..0000000000 --- a/package/Shaders/VRStereoOptimizations/StencilWriteVS.hlsl +++ /dev/null @@ -1,24 +0,0 @@ -// VR Stereo Optimizations - Stencil Write Vertex Shader -// -// Procedural fullscreen triangle covering Eye 1 (right half of SBS buffer). -// No vertex buffer needed — vertex positions are generated from SV_VertexID. -// The viewport is set to Eye 1 by the C++ code, so we just emit a standard -// fullscreen triangle in clip space. - -struct VS_OUTPUT -{ - float4 Position: SV_Position; - float2 TexCoord: TEXCOORD0; -}; - -VS_OUTPUT main(uint vertexID : SV_VertexID) -{ - VS_OUTPUT output; - - // Fullscreen triangle: 3 vertices covering [-1,1] clip space - float2 uv = float2((vertexID << 1) & 2, vertexID & 2); - output.Position = float4(uv * float2(2, -2) + float2(-1, 1), 0, 1); - output.TexCoord = uv; - - return output; -} diff --git a/package/Shaders/VRStereoOptimizations/cbuffers.hlsli b/package/Shaders/VRStereoOptimizations/cbuffers.hlsli deleted file mode 100644 index a7fb7a3961..0000000000 --- a/package/Shaders/VRStereoOptimizations/cbuffers.hlsli +++ /dev/null @@ -1,31 +0,0 @@ -// VR Stereo Optimizations - Shared constant buffer layout -// Must match VRStereoOptParams in VRStereoOptimizations.h exactly - -#ifndef __VR_STEREO_OPT_CBUFFERS_HLSLI__ -#define __VR_STEREO_OPT_CBUFFERS_HLSLI__ - -cbuffer VRStereoOptParams : register(b1) -{ - float2 FrameDim; // Full stereo buffer dimensions (both eyes) - float2 RcpFrameDim; // 1.0 / FrameDim - - uint StereoModeValue; // 0=Off, 1=Enable - float DisocclusionThreshold; // Depth difference threshold for disocclusion detection - float EdgeDepthThreshold; // Relative depth difference threshold for edge detection - uint EdgeWidth; // Half-width of edge detection band in pixels - - float2 QualityJitter; // Sub-pixel jitter offset (Quality mode) - float FoveatedRadius; // Radius of foveal region in UV space - float ForwardOcclusionScale; // Eye 0 depth multiplier for directional disocclusion (0 = disabled) - - float2 FoveatedCenter; // Center of foveal region in UV space - float MinEdgeDistance; - float FullBlendDistance; // Linearized depth below which pixels get MODE_FULL_BLEND (game units) -}; - -#define STEREO_MODE_OFF 0 -#define STEREO_MODE_ENABLE 1 - -#include "VRStereoOptimizations/modes.hlsli" - -#endif diff --git a/package/Shaders/VRStereoOptimizations/modes.hlsli b/package/Shaders/VRStereoOptimizations/modes.hlsli deleted file mode 100644 index b693dedcc3..0000000000 --- a/package/Shaders/VRStereoOptimizations/modes.hlsli +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __VR_STEREO_OPT_MODES_HLSLI__ -#define __VR_STEREO_OPT_MODES_HLSLI__ - -#define MODE_DISOCCLUDED 0 -#define MODE_EDGE 1 -#define MODE_MAIN 2 -#define MODE_EDGE_NEIGHBOUR 3 -#define MODE_FULL_BLEND 4 - -#endif diff --git a/package/Shaders/Water.hlsl b/package/Shaders/Water.hlsl index 54998a24e3..a5b5e51889 100644 --- a/package/Shaders/Water.hlsl +++ b/package/Shaders/Water.hlsl @@ -71,9 +71,6 @@ struct VS_INPUT float4 Color: COLOR0; # endif # endif -# if defined(VR) - uint InstanceID: SV_INSTANCEID; -# endif // VR }; struct VS_OUTPUT @@ -120,21 +117,13 @@ struct VS_OUTPUT # endif float4 NormalsScale: TEXCOORD8; -# if defined(VR) - float ClipDistance: SV_ClipDistance0; // o11 - float CullDistance: SV_CullDistance0; // p11 -# endif // VR }; # ifdef VSHADER cbuffer PerTechnique : register(b0) { -# if !defined(VR) float4 QPosAdjust[1] : packoffset(c0); -# else - float4 QPosAdjust[2] : packoffset(c0); -# endif // VR }; cbuffer PerMaterial : register(b1) @@ -149,35 +138,22 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) row_major float4x4 World[1] : packoffset(c0); row_major float4x4 PreviousWorld[1] : packoffset(c4); row_major float4x4 WorldViewProj[1] : packoffset(c8); float3 ObjectUV : packoffset(c12); float4 CellTexCoordOffset : packoffset(c13); -# else // VR has 25 vs 13 entries - row_major float4x4 World[2] : packoffset(c0); - row_major float4x4 PreviousWorld[2] : packoffset(c8); - row_major float4x4 WorldViewProj[2] : packoffset(c16); - float3 ObjectUV : packoffset(c24); - float4 CellTexCoordOffset : packoffset(c25); -# endif // VR }; VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT vsout = (VS_OUTPUT)0; - uint eyeIndex = Stereo::GetEyeIndexVS( -# if defined(VR) - input.InstanceID -# endif - ); vsout.NormalsScale = NormalsScale; float4 inputPosition = float4(input.Position.xyz, 1.0); - float4 worldPos = mul(World[eyeIndex], inputPosition); - float4 worldViewPos = mul(WorldViewProj[eyeIndex], inputPosition); + float4 worldPos = mul(World[0], inputPosition); + float4 worldViewPos = mul(WorldViewProj[0], inputPosition); float heightMult = min((1.0 / 10000.0) * max(worldViewPos.z - 70000, 0), 1); @@ -187,7 +163,7 @@ VS_OUTPUT main(VS_INPUT input) # if defined(STENCIL) vsout.WorldPosition = worldPos; - vsout.PreviousWorldPosition = mul(PreviousWorld[eyeIndex], inputPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld[0], inputPosition); # else # if !defined(UNIFIED_WATER) @@ -201,7 +177,7 @@ VS_OUTPUT main(VS_INPUT input) # if defined(LOD) float4 posAdjust = - ObjectUV.x ? 0.0 : (QPosAdjust[eyeIndex].xyxy + worldPos.xyxy) / NormalsScale.xxyy; + ObjectUV.x ? 0.0 : (QPosAdjust[0].xyxy + worldPos.xyxy) / NormalsScale.xxyy; vsout.TexCoord1.xyzw = NormalsScroll0 + posAdjust; # else @@ -209,7 +185,7 @@ VS_OUTPUT main(VS_INPUT input) vsout.MPosition.xyzw = inputPosition.xyzw; # endif - float2 posAdjust = worldPos.xy + QPosAdjust[eyeIndex].xy; + float2 posAdjust = worldPos.xy + QPosAdjust[0].xy; float2 scrollAdjust1 = posAdjust / NormalsScale.xx; float2 scrollAdjust2 = posAdjust / NormalsScale.yy; @@ -296,12 +272,6 @@ VS_OUTPUT main(VS_INPUT input) # endif # endif -# ifdef VR - Stereo::VR_OUTPUT VRout = Stereo::GetVRVSOutput(vsout.HPosition, eyeIndex); - vsout.HPosition = VRout.VRPosition; - vsout.ClipDistance.x = VRout.ClipDistance; - vsout.CullDistance.x = VRout.CullDistance; -# endif // VR return vsout; } @@ -351,19 +321,11 @@ Texture2D RawSSRReflectionTex : register(t11); cbuffer PerTechnique : register(b0) { -# if !defined(VR) float4 VPOSOffset : packoffset(c0); // inverse main render target width and height in xy, 0 in zw float4 PosAdjust[1] : packoffset(c1); // inverse framebuffer range in w float4 CameraDataWater : packoffset(c2); float4 SunDir : packoffset(c3); float4 SunColor : packoffset(c4); -# else - float4 VPOSOffset : packoffset(c0); // inverse main render target width and height in xy, 0 in zw - float4 PosAdjust[2] : packoffset(c1); // inverse framebuffer range in w - float4 CameraDataWater : packoffset(c3); - float4 SunDir : packoffset(c4); - float4 SunColor : packoffset(c5); -# endif } cbuffer PerMaterial : register(b1) @@ -386,43 +348,13 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { -# if !defined(VR) float4x4 TextureProj[1] : packoffset(c0); float4 ReflectPlane[1] : packoffset(c4); float4 ProjData : packoffset(c5); float4 LightPos[8] : packoffset(c6); float4 LightColor[8] : packoffset(c14); -# else - float4x4 TextureProj[2] : packoffset(c0); - float4 ReflectPlane[2] : packoffset(c8); - float4 ProjData : packoffset(c10); - float4 LightPos[8] : packoffset(c11); - float4 LightColor[8] : packoffset(c19); -# endif //VR } -# if defined(VR) -/** -Calculates the depthMultiplier as used in Water.hlsl - -VR appears to require use of CameraProjInverse and does not use ProjData -@param uv UV coords to convert -@param depth The calculated depth -@param eyeIndex The eyeIndex; 0 is left, 1 is right -@returns depthMultiplier -*/ -float CalculateDepthMultFromUV(float2 uv, float depth, uint eyeIndex = 0) -{ - float4 temp; - temp.xy = (uv * 2 - 1); - temp.z = depth; - temp.w = 1; - temp = mul(FrameBuffer::CameraProjInverse[eyeIndex], temp.xyzw); - temp.xyz /= temp.w; - return length(temp.xyz); -} -# endif // VR - # define SampColorSampler Normals01Sampler # define LinearSampler Normals01Sampler @@ -437,14 +369,14 @@ float CalculateDepthMultFromUV(float2 uv, float depth, uint eyeIndex = 0) # include "Common/ShadowSampling.hlsli" # if defined(SIMPLE) || defined(UNDERWATER) || defined(LOD) || defined(SPECULAR) -float GetWaterFogFade(uint eyeIndex) +float GetWaterFogFade() { # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - return ExponentialHeightFog::GetVanillaFogFade(PosAdjust[eyeIndex].w); + return ExponentialHeightFog::GetVanillaFogFade(PosAdjust[0].w); } # endif - return PosAdjust[eyeIndex].w; + return PosAdjust[0].w; } # if defined(FLOWMAP) @@ -575,11 +507,7 @@ float GetFlowmapMipLevel(float2 flowmapUV) float2 textureDims; FlowMapNormalsTex.GetDimensions(textureDims.x, textureDims.y); -# if defined(VR) - textureDims /= 16.0; -# else textureDims /= 8.0; -# endif float2 texCoordsPerSize = flowmapUV * textureDims; float2 dxSize = ddx(texCoordsPerSize); @@ -681,7 +609,7 @@ struct WaterNormalData float4 rippleInfo; // xyz = scaled ripple normal (normalized normal * intensity), w = splash effect intensity }; -WaterNormalData GetWaterNormal(PS_INPUT input, float distanceFactor, float normalsDepthFactor, float3 viewDirection, float depth, uint eyeIndex, float wetnessOcclusion) +WaterNormalData GetWaterNormal(PS_INPUT input, float distanceFactor, float normalsDepthFactor, float3 viewDirection, float depth, float wetnessOcclusion) { WaterNormalData result; result.rippleInfo = float4(0, 0, 0, 0); @@ -828,7 +756,7 @@ WaterNormalData GetWaterNormal(PS_INPUT input, float distanceFactor, float norma rippleWPosition.xy += flowOffset; # endif - raindropInfo = WetnessEffects::GetRainDrops(rippleWPosition + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, finalNormal, rippleStrengthModifier); + raindropInfo = WetnessEffects::GetRainDrops(rippleWPosition + FrameBuffer::CameraPosAdjust.xyz, SharedData::wetnessEffectsSettings.Time, finalNormal, rippleStrengthModifier); // Calculate ripple and splash color intensities float rippleIntensity = length(raindropInfo.xy) * rippleStrengthModifier; @@ -872,14 +800,8 @@ float3 GetWaterSpecularColor(PS_INPUT input, float3 normal, float3 viewDirection float reflectionAmount = saturate(length(input.WPosition.xyz) / 1024.0); -# if defined(VR) - // Reflection cubemap is incorrect for interiors in VR, ignore it - if (Permutation::PixelShaderDescriptor & Permutation::WaterFlags::Interior || SharedData::HideSky) - reflectionAmount = 0.0; -# else if (SharedData::HideSky) reflectionAmount = 0.0; -# endif reflectionColor = lerp(dynamicCubemap, reflectionColor, reflectionAmount); # endif @@ -905,11 +827,7 @@ float3 GetWaterSpecularColor(PS_INPUT input, float3 normal, float3 viewDirection float GetScreenDepthWater(float2 screenPosition, uint a_useVR = 0) { float depth = DepthTex.Load(float3(screenPosition, 0)).x; -# if defined(VR) // VR appears to use hard coded values - return depth * 1.01 + -0.01; -# else return (CameraDataWater.w / (-depth * CameraDataWater.z + CameraDataWater.x)); -# endif } float3 GetLdotN(float3 normal) @@ -943,18 +861,12 @@ struct DiffuseOutput float3 refractedViewDirection; }; -DiffuseOutput GetWaterDiffuseColor(PS_INPUT input, float3 normal, float3 viewDirection, inout float4 distanceMul, float refractionsDepthFactor, float fresnel, uint eyeIndex, float3 viewPosition, float depth) +DiffuseOutput GetWaterDiffuseColor(PS_INPUT input, float3 normal, float3 viewDirection, inout float4 distanceMul, float refractionsDepthFactor, float fresnel, float3 viewPosition, float depth) { # if defined(REFRACTIONS) - float4 refractionNormal = mul(transpose(TextureProj[eyeIndex]), float4((VarAmounts.w * refractionsDepthFactor * normal.xy) + input.MPosition.xy, input.MPosition.z, 1)); + float4 refractionNormal = mul(transpose(TextureProj[0]), float4((VarAmounts.w * refractionsDepthFactor * normal.xy) + input.MPosition.xy, input.MPosition.z, 1)); float2 refractionUvRaw = float2(refractionNormal.x, refractionNormal.w - refractionNormal.y) / refractionNormal.ww; - refractionUvRaw = Stereo::ConvertToStereoUV(refractionUvRaw, eyeIndex); // need to convert here for VR due to refractionNormal values - -# if defined(VR) - float2 refractionUvRawNoStereo = Stereo::ConvertFromStereoUV(refractionUvRaw, eyeIndex, 1); -# endif - float2 screenPosition = FrameBuffer::DynamicResolutionParams1.xy * (FrameBuffer::DynamicResolutionParams2.xy * input.HPosition.xy); float2 refractionScreenPosition = FrameBuffer::DynamicResolutionParams1.xy * (refractionUvRaw / VPOSOffset.xy); @@ -963,27 +875,19 @@ DiffuseOutput GetWaterDiffuseColor(PS_INPUT input, float3 normal, float3 viewDir # if defined(DEPTH) && !defined(VERTEX_ALPHA_DEPTH) float refractionDepth = GetScreenDepthWater(refractionScreenPosition); depth = refractionDepth; -# if !defined(VR) float refractionDepthMul = length(float3((((VPOSOffset.zw + refractionUvRaw) * 2 - 1)) * refractionDepth / ProjData.xy, refractionDepth)); -# else - float refractionDepthMul = CalculateDepthMultFromUV(refractionUvRawNoStereo, refractionDepth, eyeIndex); -# endif //VR float3 refractionDepthAdjustedViewDirection = -viewDirection * refractionDepthMul; - float refractionViewSurfaceAngle = dot(refractionDepthAdjustedViewDirection, ReflectPlane[eyeIndex].xyz); + float refractionViewSurfaceAngle = dot(refractionDepthAdjustedViewDirection, ReflectPlane[0].xyz); - float refractionPlaneMul = (1 - ReflectPlane[eyeIndex].w / refractionViewSurfaceAngle); + float refractionPlaneMul = (1 - ReflectPlane[0].w / refractionViewSurfaceAngle); if (refractionPlaneMul < 0.0) { - refractionUvRaw = FrameBuffer::DynamicResolutionParams2.xy * input.HPosition.xy * VPOSOffset.xy + VPOSOffset.zw; // This value is already stereo converted for VR + refractionUvRaw = FrameBuffer::DynamicResolutionParams2.xy * input.HPosition.xy * VPOSOffset.xy + VPOSOffset.zw; } else { distanceMul = saturate(refractionPlaneMul * float4(length(refractionDepthAdjustedViewDirection).xx, abs(refractionViewSurfaceAngle).xx) / FogParam.z); -# if defined(VR) - refractionWorldPosition = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], float4((refractionUvRawNoStereo * 2 - 1), DepthTex.Load(float3(refractionScreenPosition, 0)).x, 1)); -# else - refractionWorldPosition = mul(FrameBuffer::CameraViewProjInverse[eyeIndex], float4((refractionUvRaw * 2 - 1) * float2(1, -1), DepthTex.Load(float3(refractionScreenPosition, 0)).x, 1)); -# endif + refractionWorldPosition = mul(FrameBuffer::CameraViewProjInverse, float4((refractionUvRaw * 2 - 1) * float2(1, -1), DepthTex.Load(float3(refractionScreenPosition, 0)).x, 1)); refractionWorldPosition.xyz /= refractionWorldPosition.w; } # endif @@ -1016,7 +920,7 @@ DiffuseOutput GetWaterDiffuseColor(PS_INPUT input, float3 normal, float3 viewDir # endif } -float3 GetSunColor(float3 normal, float3 viewDirection, float3 worldPosition, uint eyeIndex) +float3 GetSunColor(float3 normal, float3 viewDirection, float3 worldPosition) { # if defined(UNDERWATER) return 0.0.xxx; @@ -1031,7 +935,7 @@ float3 GetSunColor(float3 normal, float3 viewDirection, float3 worldPosition, ui float3 sunColor = Color::DirectionalLight((SunColor.xyz * SunDir.w) / max(llDirLightMult, 1e-5), SharedData::linearLightingSettings.isDirLightLinear) * (1.0 - exp(-DeepColor.w)) * llDirLightMult; # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - sunColor *= ExponentialHeightFog::GetSunlightFogAttenuation(worldPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz); + sunColor *= ExponentialHeightFog::GetSunlightFogAttenuation(worldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); } # endif return reflectionMul * sunColor; @@ -1055,7 +959,6 @@ PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout; - uint eyeIndex = Stereo::GetEyeIndexPS(input.HPosition, VPOSOffset); float2 screenPosition = FrameBuffer::DynamicResolutionParams1.xy * (FrameBuffer::DynamicResolutionParams2.xy * input.HPosition.xy); # if defined(SIMPLE) || defined(UNDERWATER) || defined(LOD) || defined(SPECULAR) @@ -1083,15 +986,11 @@ PS_OUTPUT main(PS_INPUT input) depth = GetScreenDepthWater(screenPosition); float2 depthOffset = FrameBuffer::DynamicResolutionParams2.xy * input.HPosition.xy * VPOSOffset.xy + VPOSOffset.zw; -# if !defined(VR) float depthMul = length(float3((depthOffset * 2 - 1) * depth / ProjData.xy, depth)); -# else - float depthMul = CalculateDepthMultFromUV(Stereo::ConvertFromStereoUV(depthOffset, eyeIndex, 1), depth, eyeIndex); -# endif //VR float3 depthAdjustedViewDirection = -viewDirection * depthMul; - float viewSurfaceAngle = dot(depthAdjustedViewDirection, ReflectPlane[eyeIndex].xyz); + float viewSurfaceAngle = dot(depthAdjustedViewDirection, ReflectPlane[0].xyz); - float planeMul = (1 - ReflectPlane[eyeIndex].w / viewSurfaceAngle); + float planeMul = (1 - ReflectPlane[0].w / viewSurfaceAngle); distanceMul = saturate( planeMul * float4(length(depthAdjustedViewDirection).xx, abs(viewSurfaceAngle).xx) / FogParam.z); @@ -1107,18 +1006,14 @@ PS_OUTPUT main(PS_INPUT input) # else float4 depthControl = DepthControl * (distanceMul - 1) + 1; # endif - float3 viewPosition = mul(FrameBuffer::CameraView[eyeIndex], float4(input.WPosition.xyz, 1)).xyz; - float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); + float3 viewPosition = mul(FrameBuffer::CameraView, float4(input.WPosition.xyz, 1)).xyz; + float2 screenUV = FrameBuffer::ViewToUV(viewPosition); const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); # if defined(SKYLIGHTING) float wetnessOcclusion = 1.0; -# if defined(VR) - float3 positionMSSkylight = input.WPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else float3 positionMSSkylight = input.WPosition.xyz; -# endif sh2 skylightingSH = Skylighting::SampleNoBias(positionMSSkylight); float skylighting = SphericalHarmonics::Unproject(skylightingSH, float3(0, 0, 1)); @@ -1129,9 +1024,9 @@ PS_OUTPUT main(PS_INPUT input) # endif # if defined(SKYLIGHTING) - WaterNormalData waterData = GetWaterNormal(input, distanceBlendFactor, depthControl.z, viewDirection, depth, eyeIndex, wetnessOcclusion); + WaterNormalData waterData = GetWaterNormal(input, distanceBlendFactor, depthControl.z, viewDirection, depth, wetnessOcclusion); # else - WaterNormalData waterData = GetWaterNormal(input, distanceBlendFactor, depthControl.z, viewDirection, depth, eyeIndex, inWorld); + WaterNormalData waterData = GetWaterNormal(input, distanceBlendFactor, depthControl.z, viewDirection, depth, inWorld); # endif float3 normal = waterData.normal; @@ -1148,7 +1043,7 @@ PS_OUTPUT main(PS_INPUT input) [unroll] for (int lightIndex = 0; lightIndex < NUM_SPECULAR_LIGHTS; ++lightIndex) { - float3 lightVector = LightPos[lightIndex].xyz - (PosAdjust[eyeIndex].xyz + input.WPosition.xyz); + float3 lightVector = LightPos[lightIndex].xyz - (PosAdjust[0].xyz + input.WPosition.xyz); float3 lightDirection = normalize(normalize(lightVector) - viewDirection); float lightFade = saturate(length(lightVector) / LightPos[lightIndex].w); float lightColorMul = (1 - lightFade * lightFade); @@ -1175,10 +1070,10 @@ PS_OUTPUT main(PS_INPUT input) float3 specularColor = GetWaterSpecularColor(input, normal, viewDirection, distanceFactor, 1.0); # endif - DiffuseOutput diffuseOutput = GetWaterDiffuseColor(input, normal, viewDirection, distanceMul, depthControl.y, fresnel, eyeIndex, viewPosition, depth); + DiffuseOutput diffuseOutput = GetWaterDiffuseColor(input, normal, viewDirection, distanceMul, depthControl.y, fresnel, viewPosition, depth); float surfaceShadow; - float dirShadow = ShadowSampling::Get3DFilteredShadow(input.WPosition.xyz, diffuseOutput.refractedViewDirection, input.HPosition.xy, eyeIndex, surfaceShadow); + float dirShadow = ShadowSampling::Get3DFilteredShadow(input.WPosition.xyz, diffuseOutput.refractedViewDirection, input.HPosition.xy, 0, surfaceShadow); float3 dirColor; float3 ambientColor; @@ -1219,7 +1114,7 @@ PS_OUTPUT main(PS_INPUT input) continue; } - float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WPosition.xyz; + float3 lightDirection = light.positionWS[0].xyz - input.WPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) @@ -1255,7 +1150,7 @@ PS_OUTPUT main(PS_INPUT input) # endif # else - float3 sunColor = GetSunColor(normal, viewDirection, input.WPosition.xyz, eyeIndex) * surfaceShadow; + float3 sunColor = GetSunColor(normal, viewDirection, input.WPosition.xyz) * surfaceShadow; # if defined(VC) float specularFraction = lerp(1, fresnel * diffuseOutput.refractionMul, distanceBlendFactor); @@ -1278,23 +1173,23 @@ PS_OUTPUT main(PS_INPUT input) # endif # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, fogColor, float4(input.HPosition.xy * FrameBuffer::DynamicResolutionParams2.xy, input.HPosition.z, 1)); + float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, fogColor, float4(input.HPosition.xy * FrameBuffer::DynamicResolutionParams2.xy, input.HPosition.z, 1)); if (ExponentialHeightFog::ShouldDisableVanillaFog()) { fogColor = exponentialHeightFog.xyz; - fogColor *= GetWaterFogFade(eyeIndex); + fogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, fogColor, exponentialHeightFog.w); } else { - fogColor *= GetWaterFogFade(eyeIndex); + fogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, fogColor, fogDistanceFactor); - float3 expFogColor = exponentialHeightFog.xyz * GetWaterFogFade(eyeIndex); + float3 expFogColor = exponentialHeightFog.xyz * GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, expFogColor, exponentialHeightFog.w); } } else { - fogColor *= GetWaterFogFade(eyeIndex); + fogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, fogColor, fogDistanceFactor); } # else - fogColor *= GetWaterFogFade(eyeIndex); + fogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, fogColor, fogDistanceFactor); # endif @@ -1329,23 +1224,23 @@ PS_OUTPUT main(PS_INPUT input) # endif # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WPosition.xyz, FrameBuffer::CameraPosAdjust[eyeIndex].xyz, preFogColor, float4(input.HPosition.xy * FrameBuffer::DynamicResolutionParams2.xy, input.HPosition.z, 1)); + float4 exponentialHeightFog = ExponentialHeightFog::GetExponentialHeightFog(input.WPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, preFogColor, float4(input.HPosition.xy * FrameBuffer::DynamicResolutionParams2.xy, input.HPosition.z, 1)); if (ExponentialHeightFog::ShouldDisableVanillaFog()) { preFogColor = exponentialHeightFog.xyz; - preFogColor *= GetWaterFogFade(eyeIndex); + preFogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, preFogColor, exponentialHeightFog.w); } else { - preFogColor *= GetWaterFogFade(eyeIndex); + preFogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, preFogColor, fogDistanceFactor); - float3 expFogColor = exponentialHeightFog.xyz * GetWaterFogFade(eyeIndex); + float3 expFogColor = exponentialHeightFog.xyz * GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, expFogColor, exponentialHeightFog.w); } } else { - preFogColor *= GetWaterFogFade(eyeIndex); + preFogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, preFogColor, fogDistanceFactor); } # else - preFogColor *= GetWaterFogFade(eyeIndex); + preFogColor *= GetWaterFogFade(); finalColorPreFog = lerp(finalColorPreFog, preFogColor, fogDistanceFactor); # endif diff --git a/src/Deferred.cpp b/src/Deferred.cpp index 9c9a747960..56ad84ef9c 100644 --- a/src/Deferred.cpp +++ b/src/Deferred.cpp @@ -13,7 +13,6 @@ #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/Upscaling.h" -#include "Features/VR.h" #include "Features/CSEditor.h" #include "Hooks.h" @@ -260,35 +259,13 @@ void Deferred::StartDeferred() { auto context = globals::d3d::context; - // Clear POM offset texture to -1.0 sentinel so pixels the Lighting PS never touches read "no POM" - if (globals::features::vr.stereoOpt.loaded) - globals::features::vr.stereoOpt.ClearPomOffsetTexture(); - ID3D11Buffer* buffers[1] = { *globals::game::perFrame.get() }; - - ID3D11Buffer* vrBuffer = nullptr; - - if (REL::Module::IsVR()) { - static REL::Relocation VRValues{ REL::Offset(0x3180688) }; - vrBuffer = *VRValues.get(); - } - if (vrBuffer) { - context->CSSetConstantBuffers(12, 1, buffers); - context->CSSetConstantBuffers(13, 1, &vrBuffer); - } else { - context->CSSetConstantBuffers(12, 1, buffers); - } + context->CSSetConstantBuffers(12, 1, buffers); } PrepassPasses(); OverrideBlendStates(); - - // VR: Classify Eye 1 pixels and write hardware stencil marks before geometry rendering. - // Only enable stencil culling when overwrite reprojection is available for this frame. - if (globals::game::isVR && globals::features::vr.IsStereoOptimizationCullingReady()) { - globals::features::vr.stereoOpt.DispatchStencil(); - } } void Deferred::DeferredPasses() @@ -301,18 +278,7 @@ void Deferred::DeferredPasses() { ID3D11Buffer* buffers[1] = { *globals::game::perFrame }; - ID3D11Buffer* vrBuffer = nullptr; - - if (REL::Module::IsVR()) { - static REL::Relocation VRValues{ REL::Offset(0x3180688) }; - vrBuffer = *VRValues.get(); - } - if (vrBuffer) { - context->CSSetConstantBuffers(12, 1, buffers); - context->CSSetConstantBuffers(13, 1, &vrBuffer); - } else { - context->CSSetConstantBuffers(12, 1, buffers); - } + context->CSSetConstantBuffers(12, 1, buffers); } auto specular = renderer->GetRuntimeData().renderTargets[SPECULAR]; @@ -359,7 +325,7 @@ void Deferred::DeferredPasses() albedo.SRV, // t1 AlbedoTexture normalRoughness.SRV, // t2 NormalRoughnessTexture masks.SRV, // t3 MasksTexture - dynamicCubemaps.loaded || REL::Module::IsVR() ? Util::GetCurrentSceneDepthSRV(false) : nullptr, // t4 DepthTexture (24/32-bit; HLSL type baked at compile via TERRAIN_BLENDING) + dynamicCubemaps.loaded ? Util::GetCurrentSceneDepthSRV(false) : nullptr, // t4 DepthTexture (24/32-bit; HLSL type baked at compile via TERRAIN_BLENDING) dynamicCubemaps.loaded ? reflectance.SRV : nullptr, // t5 ReflectanceTexture dynamicCubemaps.loaded ? dynamicCubemaps.envTexture->srv.get() : nullptr, // t6 EnvTexture dynamicCubemaps.loaded ? dynamicCubemaps.envReflectionsTexture->srv.get() : nullptr, // t7 EnvReflectionsTexture @@ -378,14 +344,6 @@ void Deferred::DeferredPasses() context->CSSetShaderResources(0, ARRAYSIZE(srvs), srvs); - // Bind VRStereoOptimizations mode texture for Eye 1 skip. - // Bind null when disabled so stale mode data doesn't cause incorrect early-exits - // in DeferredCompositeCS (null SRV reads return 0 = MODE_DISOCCLUDED, all pixels composite normally). - auto& vrStereoOpt = globals::features::vr.stereoOpt; - bool stereoCullingReady = globals::features::vr.IsStereoOptimizationCullingReady(); - ID3D11ShaderResourceView* modeSRV = stereoCullingReady ? vrStereoOpt.GetModeTextureSRV() : nullptr; - context->CSSetShaderResources(16, 1, &modeSRV); - ID3D11UnorderedAccessView* uavs[3]{ main.UAV, normals.UAV, motionVectors.UAV }; context->CSSetUnorderedAccessViews(0, ARRAYSIZE(uavs), uavs, nullptr); @@ -398,27 +356,6 @@ void Deferred::DeferredPasses() context->Dispatch(dispatchCount.x, dispatchCount.y, 1); globals::profiler->EndPass(); } - - // Unbind mode texture SRV - ID3D11ShaderResourceView* nullSRV = nullptr; - context->CSSetShaderResources(16, 1, &nullSRV); - } - - // VR: Deactivate stencil culling now that geometry rendering is complete. - // Must happen before StereoBlend so the blend pass itself isn't stencil-blocked. - if (globals::game::isVR) { - auto& stereoOpt = globals::features::vr.stereoOpt; - if (stereoOpt.IsStencilActive()) { - stereoOpt.DeactivateStencil(); - } - } - - // VR: Stereo reprojection fills Eye 1 holes here (after DeferredComposite, before SSR/water/sky) - // so that ISReflectionsRayTracing sees valid pixels in both eyes. - if (globals::game::isVR) { - globals::profiler->BeginPass("VR::StereoBlend"); - globals::features::vr.DrawStereoBlend(); - globals::profiler->EndPass(); } // Clear @@ -593,10 +530,7 @@ void Deferred::CopyShadowLightData() dd.EndSplitDistances = { dirData.endSplitDistances[0], dirData.endSplitDistances[1] }; dd.StartSplitDistances = { dirData.startSplitDistances[0], dirData.startSplitDistances[1] }; - if (globals::game::isVR) - SetShadowCascadeParameters(sunShadowLight->GetVRRuntimeData(), dd); - else - SetShadowCascadeParameters(sunShadowLight->GetRuntimeData(), dd); + SetShadowCascadeParameters(sunShadowLight->GetRuntimeData(), dd); D3D11_MAPPED_SUBRESOURCE mapped{}; DX::ThrowIfFailed(context->Map(directionalShadowLights->resource.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped)); @@ -638,12 +572,6 @@ ID3D11ComputeShader* Deferred::GetComputeMainComposite() if (globals::features::ibl.loaded) defines.push_back({ "IBL", nullptr }); - if (REL::Module::IsVR()) - defines.push_back({ "FRAMEBUFFER", nullptr }); - - if (REL::Module::IsVR()) - defines.push_back({ "VR_STEREO_OPT", nullptr }); - // TERRAIN_BLENDING flips DepthTexture's HLSL type from `Texture2D` // (R24_UNORM_X8_TYPELESS game depth) to `Texture2D` (R32_FLOAT blendedDepth). if (globals::features::terrainBlending.loaded) @@ -671,12 +599,6 @@ ID3D11ComputeShader* Deferred::GetComputeMainCompositeInterior() if (globals::features::ibl.loaded) defines.push_back({ "IBL", nullptr }); - if (REL::Module::IsVR()) - defines.push_back({ "FRAMEBUFFER", nullptr }); - - if (REL::Module::IsVR()) - defines.push_back({ "VR_STEREO_OPT", nullptr }); - // TERRAIN_BLENDING flips DepthTexture's HLSL type from `Texture2D` // (R24_UNORM_X8_TYPELESS game depth) to `Texture2D` (R32_FLOAT blendedDepth). if (globals::features::terrainBlending.loaded) diff --git a/src/Deferred.h b/src/Deferred.h index c95f28ed2a..bda7412c6d 100644 --- a/src/Deferred.h +++ b/src/Deferred.h @@ -128,8 +128,7 @@ class Deferred stl::write_thunk_call(REL::RelocationID(99938, 106583).address() + REL::Relocate(0x8E, 0x84)); stl::write_thunk_call(REL::RelocationID(99938, 106583).address() + REL::Relocate(0x319, 0x308, 0x321)); - if (!REL::Module::IsVR()) - stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x944, 0x954)); + stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x944, 0x954)); stl::detour_thunk(REL::RelocationID(75570, 77371)); diff --git a/src/Feature.cpp b/src/Feature.cpp index 6fb92d66de..48511574fa 100644 --- a/src/Feature.cpp +++ b/src/Feature.cpp @@ -33,7 +33,6 @@ #include "Features/TerrainVariation.h" #include "Features/UnifiedWater.h" #include "Features/Upscaling.h" -#include "Features/VR.h" #include "Features/VolumetricLighting.h" #include "Features/VolumetricShadows.h" #include "Features/WaterEffects.h" @@ -251,34 +250,7 @@ const std::vector& Feature::GetFeatureList() &globals::features::skin }; - if (REL::Module::IsVR()) { - // Helper function to build VR feature list - static auto BuildVRList = []() -> std::vector { - auto v = features; - v.push_back(&globals::features::vr); - - // In developer mode, keep all features for testing - // In production mode, filter to VR-compatible only - if (!globals::state->IsDeveloperMode()) { - std::erase_if(v, [](Feature* a) { return !a->SupportsVR(); }); - } - return v; - }; - - // Cache the VR feature list but invalidate when developer mode changes - static std::vector featuresVR; - static bool cachedDevMode = false; - - bool currentDevMode = globals::state->IsDeveloperMode(); - if (featuresVR.empty() || currentDevMode != cachedDevMode) { - featuresVR = BuildVRList(); - cachedDevMode = currentDevMode; - } - - return featuresVR; - } else { - return features; - } + return features; } Feature* Feature::FindFeatureByShortName(const std::string& shortName) diff --git a/src/Feature.h b/src/Feature.h index a82064acaf..92c61ddc2f 100644 --- a/src/Feature.h +++ b/src/Feature.h @@ -49,12 +49,6 @@ struct Feature public: virtual bool HasShaderDefine(RE::BSShader::Type) { return false; } - /** - * Whether the feature supports VR. - * - * \return true if VR supported; else false - */ - virtual bool SupportsVR() { return false; } /** * Whether the feature is a CORE feature diff --git a/src/FeatureConstraints.h b/src/FeatureConstraints.h index 8437025f5b..23a0a3cf6b 100644 --- a/src/FeatureConstraints.h +++ b/src/FeatureConstraints.h @@ -11,7 +11,7 @@ namespace FeatureConstraints */ struct SettingId { - std::string featureShortName; // e.g., "VR" + std::string featureShortName; std::string settingPath; // e.g., "EnableDepthBufferCullingExterior" bool operator==(const SettingId& other) const diff --git a/src/FeatureIssues.cpp b/src/FeatureIssues.cpp index 3e8ad91a53..9db14ed73d 100644 --- a/src/FeatureIssues.cpp +++ b/src/FeatureIssues.cpp @@ -846,12 +846,6 @@ namespace FeatureIssues continue; } - // Skip VR feature when not in VR mode (it's a core feature) - if (featureName == "VR" && !REL::Module::IsVR()) { - logger::info("Ignoring VR.ini in non-VR mode"); - continue; - } - // This is an orphaned INI file - check if it's a known obsolete feature if (IsObsoleteFeature(featureName)) { // Read version from INI file diff --git a/src/FeatureIssues.h b/src/FeatureIssues.h index ce6103cdd5..80ad8bab3b 100644 --- a/src/FeatureIssues.h +++ b/src/FeatureIssues.h @@ -165,7 +165,7 @@ namespace FeatureIssues * * This function scans the Data/Shaders/Features/ directory for INI files that * correspond to features not currently in the active feature list (e.g., obsolete - * features, VR features in non-VR mode, unknown features). It identifies whether + * features, unknown features). It identifies whether * these orphaned INI files are known obsolete features or completely unknown features * and adds them to the feature issues tracking system. * diff --git a/src/Features/CSEditor.h b/src/Features/CSEditor.h index 554731c393..0841dec4f1 100644 --- a/src/Features/CSEditor.h +++ b/src/Features/CSEditor.h @@ -20,7 +20,6 @@ struct CSEditor : OverlayFeature virtual inline std::string GetShortName() override { return "CSEditor"; } virtual inline std::string_view GetShaderDefineName() override { return "CS_EDITOR"; } virtual inline std::string_view GetCategory() const override { return FeatureCategories::kUtility; } - virtual bool SupportsVR() override { return true; } virtual bool IsCore() const override { return true; } virtual bool IsInMenu() const override { return true; } diff --git a/src/Features/CloudShadows.h b/src/Features/CloudShadows.h index f25123a035..0e75f6cb03 100644 --- a/src/Features/CloudShadows.h +++ b/src/Features/CloudShadows.h @@ -74,5 +74,4 @@ struct CloudShadows : Feature logger::info("[Cloud Shadows] Installed hooks"); } }; - virtual bool SupportsVR() override { return true; }; }; diff --git a/src/Features/DynamicCubemaps.cpp b/src/Features/DynamicCubemaps.cpp index 5721ee8f35..696221b4d0 100644 --- a/src/Features/DynamicCubemaps.cpp +++ b/src/Features/DynamicCubemaps.cpp @@ -33,13 +33,6 @@ void DynamicCubemaps::DrawSettings() recompileFlag |= ImGui::Checkbox(T(TKEY("enable_ssr"), "Enable Screen Space Reflections"), reinterpret_cast(&settings.EnabledSSR)); if (auto _tt = Util::HoverTooltipWrapper()) { ImGui::Text("%s", T(TKEY("enable_ssr_tooltip"), "Enable Screen Space Reflections on Water")); - if (REL::Module::IsVR() && !enabledAtBoot) { - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f)); - ImGui::Text("%s", T(TKEY("vr_restart_required"), - "A restart is required to enable in VR. " - "Save Settings after enabling and restart the game.")); - ImGui::PopStyleColor(); - } } ImGui::TreePop(); } @@ -122,69 +115,32 @@ void DynamicCubemaps::DrawSettings() } ImGui::TreePop(); } - if (REL::Module::IsVR()) { - if (ImGui::TreeNodeEx(T(TKEY("advanced_vr_settings"), "Advanced VR Settings"), ImGuiTreeNodeFlags_DefaultOpen)) { - Util::RenderImGuiSettingsTree(iniVRCubeMapSettings, "VR"); - Util::RenderImGuiSettingsTree(hiddenVRCubeMapSettings, "hiddenVR"); - ImGui::TreePop(); - } - } } void DynamicCubemaps::LoadSettings(json& o_json) { settings = o_json; - if (REL::Module::IsVR()) { - Util::LoadGameSettings(iniVRCubeMapSettings); - } recompileFlag = true; } void DynamicCubemaps::SaveSettings(json& o_json) { o_json = settings; - if (REL::Module::IsVR()) { - Util::SaveGameSettings(iniVRCubeMapSettings); - } } void DynamicCubemaps::RestoreDefaultSettings() { settings = {}; - if (REL::Module::IsVR()) { - Util::ResetGameSettingsToDefaults(iniVRCubeMapSettings); - Util::ResetGameSettingsToDefaults(hiddenVRCubeMapSettings); - } recompileFlag = true; } void DynamicCubemaps::DataLoaded() { - if (REL::Module::IsVR()) { - // enable cubemap settings in VR - Util::EnableBooleanSettings(iniVRCubeMapSettings, GetName()); - Util::EnableBooleanSettings(hiddenVRCubeMapSettings, GetName()); - } MenuOpenCloseEventHandler::Register(); } void DynamicCubemaps::PostPostLoad() { - if (REL::Module::IsVR() && settings.EnabledSSR) { - std::map earlyhiddenVRCubeMapSettings{ - { "bScreenSpaceReflectionEnabled:Display", 0x1ED5BC0 }, - }; - for (const auto& settingPair : earlyhiddenVRCubeMapSettings) { - const auto& settingName = settingPair.first; - const auto address = REL::Offset{ settingPair.second }.address(); - bool* setting = reinterpret_cast(address); - if (!*setting) { - logger::info("[PostPostLoad] Changing {} from {} to {} to support Dynamic Cubemaps", settingName, *setting, true); - *setting = true; - } - } - enabledAtBoot = true; - } } RE::BSEventNotifyControl MenuOpenCloseEventHandler::ProcessEvent(const RE::MenuOpenCloseEvent* a_event, RE::BSTEventSource*) @@ -364,7 +320,7 @@ void DynamicCubemaps::UpdateCubemapCapture(bool a_reflections) static float3 cameraPreviousPosAdjust[2] = { { 0, 0, 0 }, { 0, 0, 0 } }; updateData.CameraPreviousPosAdjust = cameraPreviousPosAdjust[index]; - auto eyePosition = Util::GetEyePosition(0); + auto eyePosition = Util::GetAverageEyePosition(); cameraPreviousPosAdjust[index] = { eyePosition.x, eyePosition.y, eyePosition.z }; diff --git a/src/Features/DynamicCubemaps.h b/src/Features/DynamicCubemaps.h index e26615f6cf..7c249a64c1 100644 --- a/src/Features/DynamicCubemaps.h +++ b/src/Features/DynamicCubemaps.h @@ -119,7 +119,6 @@ struct DynamicCubemaps : Feature }; Settings settings; - bool enabledAtBoot = false; void UpdateCubemap(); void PostDeferred(); @@ -135,7 +134,7 @@ struct DynamicCubemaps : Feature { T("feature.dynamic_cubemaps.key_feature_1", "Real-time environment capture for realistic reflections"), T("feature.dynamic_cubemaps.key_feature_2", "Dynamic cube map generation based on camera position"), T("feature.dynamic_cubemaps.key_feature_3", "Enhanced water reflections with environmental details"), - T("feature.dynamic_cubemaps.key_feature_4", "Support for both standard and VR rendering modes"), + T("feature.dynamic_cubemaps.key_feature_4", "Support for standard rendering modes"), T("feature.dynamic_cubemaps.key_feature_5", "Optimized cubemap inference and irradiance calculation") } }; }; @@ -153,20 +152,6 @@ struct DynamicCubemaps : Feature virtual void DataLoaded() override; virtual void PostPostLoad() override; - std::map iniVRCubeMapSettings{ - { "bAutoWaterSilhouetteReflections:Water", { "Auto Water Silhouette Reflections", "Automatically reflects silhouettes on water surfaces.", 0, true, false, true } }, - { "bForceHighDetailReflections:Water", { "Force High Detail Reflections", "Forces the use of high-detail reflections on water surfaces.", 0, true, false, true } } - }; - - std::map hiddenVRCubeMapSettings{ - { "bReflectExplosions:Water", { "Reflect Explosions", "Enables reflection of explosions on water surfaces.", 0x1eaa000, true, false, true } }, - { "bReflectLODLand:Water", { "Reflect LOD Land", "Enables reflection of low-detail (LOD) terrain on water surfaces.", 0x1eaa060, true, false, true } }, - { "bReflectLODObjects:Water", { "Reflect LOD Objects", "Enables reflection of low-detail (LOD) objects on water surfaces.", 0x1eaa078, true, false, true } }, - { "bReflectLODTrees:Water", { "Reflect LOD Trees", "Enables reflection of low-detail (LOD) trees on water surfaces.", 0x1eaa090, true, false, true } }, - { "bReflectSky:Water", { "Reflect Sky", "Enables reflection of the sky on water surfaces.", 0x1eaa0a8, true, false, true } }, - { "bUseWaterRefractions:Water", { "Use Water Refractions", "Enables refractions for water surfaces, affecting how light bends through water.", 0x1eaa0c0, true, false, true } } - }; - virtual void ClearShaderCache() override; ID3D11ComputeShader* GetComputeShaderUpdate(); ID3D11ComputeShader* GetComputeShaderUpdateReflections(); @@ -188,6 +173,5 @@ struct DynamicCubemaps : Feature ID3D11ComputeShader* GetComputeShaderBC6HEncode(); - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; }; diff --git a/src/Features/ExponentialHeightFog.cpp b/src/Features/ExponentialHeightFog.cpp index 4eb4c1cb9d..57e1a1b3a3 100644 --- a/src/Features/ExponentialHeightFog.cpp +++ b/src/Features/ExponentialHeightFog.cpp @@ -440,13 +440,8 @@ void ExponentialHeightFog::Prepass() 0.0f }; - const uint32_t eyeCount = globals::game::isVR ? 2u : 1u; - for (uint32_t eyeIndex = 0; eyeIndex < eyeCount; eyeIndex++) { - cb.clipToWorld[eyeIndex] = globals::game::frameBufferCached.GetCameraViewProjUnjittered(eyeIndex).Invert(); - } - if (eyeCount == 1u) { - cb.clipToWorld[1] = cb.clipToWorld[0]; - } + cb.clipToWorld[0] = globals::game::frameBufferCached.GetCameraViewProjUnjittered().Invert(); + cb.clipToWorld[1] = cb.clipToWorld[0]; for (uint32_t i = 0; i < std::size(cb.frameJitterOffsets); i++) { const uint32_t temporalFrame = (globals::state->frameCount - i) & 1023u; diff --git a/src/Features/ExponentialHeightFog.h b/src/Features/ExponentialHeightFog.h index b386df78e5..669f093cc9 100644 --- a/src/Features/ExponentialHeightFog.h +++ b/src/Features/ExponentialHeightFog.h @@ -8,7 +8,6 @@ struct ExponentialHeightFog : Feature static constexpr std::string_view MOD_ID = "180146"; public: - virtual bool SupportsVR() override { return true; }; virtual inline std::string GetName() override { return "Exponential Height Fog"; } virtual std::string GetDisplayName() override { return T("feature.exponential_height_fog.name", "Exponential Height Fog"); } virtual inline std::string GetShortName() override { return "ExponentialHeightFog"; } diff --git a/src/Features/ExtendedMaterials.h b/src/Features/ExtendedMaterials.h index 0f3bd19a4d..7254daf12e 100644 --- a/src/Features/ExtendedMaterials.h +++ b/src/Features/ExtendedMaterials.h @@ -49,6 +49,5 @@ struct ExtendedMaterials : Feature virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; }; diff --git a/src/Features/ExtendedTranslucency.h b/src/Features/ExtendedTranslucency.h index fd40a8f0cb..61706c0379 100644 --- a/src/Features/ExtendedTranslucency.h +++ b/src/Features/ExtendedTranslucency.h @@ -25,7 +25,6 @@ struct ExtendedTranslucency final : Feature virtual void LoadSettings(json& o_json) override; virtual void SaveSettings(json& o_json) override; virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; static void BSLightingShader_SetupGeometry(RE::BSRenderPass* pass); diff --git a/src/Features/GrassCollision.cpp b/src/Features/GrassCollision.cpp index 8f98fea1cb..638970dadf 100644 --- a/src/Features/GrassCollision.cpp +++ b/src/Features/GrassCollision.cpp @@ -40,7 +40,7 @@ void GrassCollision::QueueCollisions() return; eastl::vector actorCandidates{}; - RE::NiPoint3 cameraPosition = Util::GetEyePosition(0); + RE::NiPoint3 cameraPosition = Util::GetAverageEyePosition(); auto addActorCandidate = [&](RE::ActorHandle a_handle) { auto actor = a_handle.get(); @@ -160,7 +160,7 @@ void GrassCollision::Update() static float2 prevCellID = { 0, 0 }; - auto eyePosNI = Util::GetEyePosition(0); + auto eyePosNI = Util::GetAverageEyePosition(); static auto prevEyePosNI = eyePosNI; auto eyePos = float2{ eyePosNI.x, eyePosNI.y }; @@ -371,18 +371,7 @@ void GrassCollision::UpdateCollisionTexture() { ID3D11Buffer* buffers[1] = { *globals::game::perFrame }; - ID3D11Buffer* vrBuffer = nullptr; - - if (REL::Module::IsVR()) { - static REL::Relocation VRValues{ REL::Offset(0x3180688) }; - vrBuffer = *VRValues.get(); - } - if (vrBuffer) { - context->CSSetConstantBuffers(12, 1, buffers); - context->CSSetConstantBuffers(13, 1, &vrBuffer); - } else { - context->CSSetConstantBuffers(12, 1, buffers); - } + context->CSSetConstantBuffers(12, 1, buffers); } { diff --git a/src/Features/GrassCollision.h b/src/Features/GrassCollision.h index da25c5e150..7d2dee667e 100644 --- a/src/Features/GrassCollision.h +++ b/src/Features/GrassCollision.h @@ -86,7 +86,6 @@ struct GrassCollision : Feature virtual void PostPostLoad() override; - virtual bool SupportsVR() override { return true; }; struct Hooks { diff --git a/src/Features/GrassLighting.h b/src/Features/GrassLighting.h index 61bacc67ec..1bece2fb1f 100644 --- a/src/Features/GrassLighting.h +++ b/src/Features/GrassLighting.h @@ -43,5 +43,4 @@ struct GrassLighting : Feature virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; }; diff --git a/src/Features/HDRDisplay.cpp b/src/Features/HDRDisplay.cpp index 086129f98e..836723f9e0 100644 --- a/src/Features/HDRDisplay.cpp +++ b/src/Features/HDRDisplay.cpp @@ -229,26 +229,6 @@ namespace func(a_this, a3, a_target, a_4, a_5); hdr->RestoreFramebuffer(); - // VR: RedirectFramebuffer made ISHDR write to hdrTexture (float16); after - // RestoreFramebuffer kFRAMEBUFFER reverts to its original texture. - // ISCopy reads kFRAMEBUFFER.SRV to distribute the frame to the HMD and - // companion window, so we must write the tonemapped content back into - // kFRAMEBUFFER before ISCopy runs. - // - // TODO (future HDR HMD support): The correct pipeline is to run the full - // HDR composite (PQ encode, paper white, peak nits) HERE, writing the - // result back to kFRAMEBUFFER so ISCopy distributes HDR-processed content - // to both the HMD and companion at their native sizes. The post-Present - // ApplyHDR path cannot do this correctly because ISCopy has already run - // and the companion back buffer (1024x1024) does not match outputTexture - // (sized from kMAIN). Requires hooking the ISCopy vfunc to fire - // HDROutputCS before distribution. - if (globals::game::isVR && hdr->settings.enableHDR && - hdr->hdrTexture && hdr->hdrTexture->resource) { - auto& fb = globals::game::renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kFRAMEBUFFER]; - if (fb.texture) - globals::d3d::context->CopyResource(fb.texture, hdr->hdrTexture->resource.get()); - } } static inline REL::Relocation func; }; @@ -868,13 +848,6 @@ bool HDRDisplay::ShouldUseD3D12UIBuffer() void HDRDisplay::SetUIBuffer() { - // VR: ISCopy reads kFRAMEBUFFER.SRV to distribute the frame to the HMD and - // companion window. Redirecting kFRAMEBUFFER.RTV here would cause vanilla UI - // to render into uiTexture instead, so ISCopy would send a UI-less frame to - // the HMD. Leave kFRAMEBUFFER alone; vanilla UI bakes directly into it. - if (globals::game::isVR) - return; - auto& fb = globals::game::renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGET::kFRAMEBUFFER]; // D3D12 swap chain path: route UI to uiBufferWrapped only when a compositor @@ -936,7 +909,7 @@ void HDRDisplay::SetUIBuffer() bool HDRDisplay::UsesDeferredPresentComposite() const { - return loaded && settings.enableHDR && !globals::game::isVR && + return loaded && settings.enableHDR && !globals::features::upscaling.d3d12SwapChainActive && uiTexture && uiTexture->rtv && hdrOutputCS; } @@ -977,7 +950,7 @@ namespace { static void WINAPI thunk(ID3D11DeviceContext* This, ID3D11BlendState* pBlendState, const FLOAT BlendFactor[4], UINT SampleMask) { - if (pBlendState && !globals::game::isVR) { + if (pBlendState) { auto& hdr = globals::features::hdrDisplay; const bool d3d11HdrCapture = hdr.loaded && hdr.settings.enableHDR && hdr.uiTexture; const bool fgCapture = globals::features::upscaling.d3d12SwapChainActive; @@ -1057,7 +1030,7 @@ void HDRDisplay::DrawImGuiForPresent(bool frameGenActive, bool hdrReady) if (frameGenActive) { auto& data = globals::game::renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGET::kFRAMEBUFFER]; globals::d3d::context->OMSetRenderTargets(1, &data.RTV, nullptr); - } else if (hdrReady && !globals::game::isVR && uiTexture && uiTexture->rtv && uiTexture->resource) { + } else if (hdrReady && uiTexture && uiTexture->rtv && uiTexture->resource) { ID3D11RenderTargetView* uiRTV = uiTexture->rtv.get(); D3D11_TEXTURE2D_DESC texDesc{}; uiTexture->resource->GetDesc(&texDesc); @@ -1196,27 +1169,18 @@ void HDRDisplay::ApplyHDR() auto& framebufferRT = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kFRAMEBUFFER]; // Scene SRV selection: - // - VR: kFRAMEBUFFER at this point has scene + vanilla UI + ImGui all baked in - // (thunk restored hdrTexture→kFRAMEBUFFER, vanilla UI rendered on top, ImGui - // just rendered to kFRAMEBUFFER.RTV above). Use it directly so the companion - // window gets everything without a separate uiTexture capture pass. - // - Non-VR HDR: hdrTexture has float16 scene values >1.0 preserved from ISHDR. - // - Non-VR SDR: kFRAMEBUFFER has the tonemapped 0-1 ISHDR output. + // - HDR: hdrTexture has float16 scene values >1.0 preserved from ISHDR. + // - SDR: kFRAMEBUFFER has the tonemapped 0-1 ISHDR output. ID3D11ShaderResourceView* sceneSRV = - globals::game::isVR ? framebufferRT.SRV : (settings.enableHDR && hdrTexture && hdrTexture->srv) ? hdrTexture->srv.get() : framebufferRT.SRV; // Choose the correct UI buffer based on which path is active. - // VR uses the framebuffer directly, which already contains vanilla UI/ImGui. - // Binding a separate uiTexture here would duplicate the UI layer. ID3D11ShaderResourceView* uiSRV = nullptr; - if (!globals::game::isVR) { - if (upscaling.d3d12SwapChainActive && upscaling.dx12SwapChain.uiBufferWrapped) { - uiSRV = upscaling.dx12SwapChain.uiBufferWrapped->srv; - } else if (uiTexture && uiTexture->srv) { - uiSRV = uiTexture->srv.get(); - } + if (upscaling.d3d12SwapChainActive && upscaling.dx12SwapChain.uiBufferWrapped) { + uiSRV = upscaling.dx12SwapChain.uiBufferWrapped->srv; + } else if (uiTexture && uiTexture->srv) { + uiSRV = uiTexture->srv.get(); } ID3D11ShaderResourceView* views[2] = { sceneSRV, uiSRV }; diff --git a/src/Features/HDRDisplay.h b/src/Features/HDRDisplay.h index e5cc29b58f..41771236b8 100644 --- a/src/Features/HDRDisplay.h +++ b/src/Features/HDRDisplay.h @@ -20,7 +20,6 @@ struct HDRDisplay : public Feature virtual inline std::string GetShortName() override { return "HDRDisplay"; } virtual inline std::string GetFeatureModLink() override { return MakeNexusModURL(MOD_ID); } virtual inline std::string_view GetCategory() const override { return "Display"; } - virtual inline bool SupportsVR() override { return false; } virtual inline bool IsCore() const override { return false; } virtual inline std::string_view GetShaderDefineName() override { return "HDR_OUTPUT"; } diff --git a/src/Features/HairSpecular.h b/src/Features/HairSpecular.h index 28fab821ec..147586e42b 100644 --- a/src/Features/HairSpecular.h +++ b/src/Features/HairSpecular.h @@ -59,5 +59,4 @@ struct HairSpecular : Feature virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; }; \ No newline at end of file diff --git a/src/Features/IBL.h b/src/Features/IBL.h index 5b153208e4..bef866d50f 100644 --- a/src/Features/IBL.h +++ b/src/Features/IBL.h @@ -3,7 +3,6 @@ struct IBL : Feature { public: - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; virtual inline std::string GetName() override { return "Image Based Lighting"; } diff --git a/src/Features/InteriorSun.cpp b/src/Features/InteriorSun.cpp index ca921845b9..ffe817f8fb 100644 --- a/src/Features/InteriorSun.cpp +++ b/src/Features/InteriorSun.cpp @@ -71,7 +71,7 @@ void InteriorSun::PostPostLoad() const std::int32_t displacement = static_cast(reinterpret_cast(gShadowDistance) - (address + 8)); REL::safe_write(address + 4, &displacement, sizeof(displacement)); - rasterStateCullMode = globals::game::isVR ? &globals::game::shadowState->GetVRRuntimeData().rasterStateCullMode : &globals::game::shadowState->GetRuntimeData().rasterStateCullMode; + rasterStateCullMode = &globals::game::shadowState->GetRuntimeData().rasterStateCullMode; logger::info("[Interior Sun] Installed hooks"); } diff --git a/src/Features/InteriorSun.h b/src/Features/InteriorSun.h index 28918e6769..11f2118ae6 100644 --- a/src/Features/InteriorSun.h +++ b/src/Features/InteriorSun.h @@ -21,7 +21,6 @@ struct InteriorSun : Feature virtual void LoadSettings(json& o_json) override; virtual void SaveSettings(json& o_json) override; virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; } virtual void PostPostLoad() override; virtual void EarlyPrepass() override; diff --git a/src/Features/InverseSquareLighting.h b/src/Features/InverseSquareLighting.h index 803ebad13f..7a11099363 100644 --- a/src/Features/InverseSquareLighting.h +++ b/src/Features/InverseSquareLighting.h @@ -25,7 +25,6 @@ struct InverseSquareLighting : Feature inline bool HasShaderDefine(RE::BSShader::Type) override { return true; }; - virtual bool SupportsVR() override { return true; } virtual void PostPostLoad() override; diff --git a/src/Features/LODBlending.h b/src/Features/LODBlending.h index 9eb866ad02..0b4c1b1415 100644 --- a/src/Features/LODBlending.h +++ b/src/Features/LODBlending.h @@ -40,6 +40,5 @@ struct LODBlending : Feature virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; }; diff --git a/src/Features/LightLimitFix.cpp b/src/Features/LightLimitFix.cpp index 4eddc810d2..719f9dbc4c 100644 --- a/src/Features/LightLimitFix.cpp +++ b/src/Features/LightLimitFix.cpp @@ -78,8 +78,6 @@ LightLimitFix::PerFrame LightLimitFix::GetCommonBufferData() void LightLimitFix::SetupResources() { auto screenSize = globals::state->screenSize; - if (REL::Module::IsVR()) - screenSize.x *= .5; clusterSize[0] = ((uint)screenSize.x + 63) / 64; clusterSize[1] = ((uint)screenSize.y + 63) / 64; clusterSize[2] = 32; @@ -87,8 +85,6 @@ void LightLimitFix::SetupResources() { std::vector> clusterDefines; - if (REL::Module::IsVR()) - clusterDefines = { { "VR", "" } }; clusterBuildingCS = (ID3D11ComputeShader*)Util::CompileShader(L"Data\\Shaders\\LightLimitFix\\ClusterBuildingCS.hlsl", clusterDefines, "cs_5_0"); clusterCullingCS = (ID3D11ComputeShader*)Util::CompileShader(L"Data\\Shaders\\LightLimitFix\\ClusterCullingCS.hlsl", clusterDefines, "cs_5_0"); @@ -308,20 +304,18 @@ void LightLimitFix::BSLightingShader_SetupGeometry_After(RE::BSRenderPass*) void LightLimitFix::SetLightPosition(LightLimitFix::LightData& a_light, RE::NiPoint3 a_initialPosition, bool a_cached) { - for (int eyeIndex = 0; eyeIndex < eyeCount; eyeIndex++) { - RE::NiPoint3 eyePosition; + RE::NiPoint3 eyePosition; - if (a_cached) { - eyePosition = eyePositionCached[eyeIndex]; - } else { - eyePosition = Util::GetEyePosition(eyeIndex); - } - - auto worldPos = a_initialPosition - eyePosition; - a_light.positionWS[eyeIndex].data.x = worldPos.x; - a_light.positionWS[eyeIndex].data.y = worldPos.y; - a_light.positionWS[eyeIndex].data.z = worldPos.z; + if (a_cached) { + eyePosition = eyePositionCached[0]; + } else { + eyePosition = globals::game::shadowState->GetRuntimeData().posAdjust.getEye(0); } + + auto worldPos = a_initialPosition - eyePosition; + a_light.positionWS[0].data.x = worldPos.x; + a_light.positionWS[0].data.y = worldPos.y; + a_light.positionWS[0].data.z = worldPos.z; } void LightLimitFix::Prepass() @@ -377,8 +371,6 @@ void LightLimitFix::ClearShaderCache() clusterCullingCS = nullptr; } std::vector> clusterDefines; - if (REL::Module::IsVR()) - clusterDefines = { { "VR", "" } }; clusterBuildingCS = (ID3D11ComputeShader*)Util::CompileShader(L"Data\\Shaders\\LightLimitFix\\ClusterBuildingCS.hlsl", clusterDefines, "cs_5_0"); clusterCullingCS = (ID3D11ComputeShader*)Util::CompileShader(L"Data\\Shaders\\LightLimitFix\\ClusterCullingCS.hlsl", clusterDefines, "cs_5_0"); } @@ -392,9 +384,9 @@ void LightLimitFix::UpdateLights() // Cache data since cameraData can become invalid in first-person - for (int eyeIndex = 0; eyeIndex < eyeCount; eyeIndex++) { - auto eyePosition = globals::game::frameBufferCached.GetCameraPosAdjust(eyeIndex); - eyePositionCached[eyeIndex] = { eyePosition.x, eyePosition.y, eyePosition.z }; + { + auto eyePosition = globals::game::frameBufferCached.GetCameraPosAdjust(); + eyePositionCached[0] = { eyePosition.x, eyePosition.y, eyePosition.z }; } eastl::vector lightsData{}; @@ -495,8 +487,6 @@ void LightLimitFix::UpdateStructure() lightsFar = *globals::game::cameraFar; auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); - if (REL::Module::IsVR()) - renderSize.x *= .5; clusterSize[0] = ((uint)renderSize.x + 63) / 64; clusterSize[1] = ((uint)renderSize.y + 63) / 64; clusterSize[2] = 32; diff --git a/src/Features/LightLimitFix.h b/src/Features/LightLimitFix.h index 0dc60f4c1d..37c6c34110 100644 --- a/src/Features/LightLimitFix.h +++ b/src/Features/LightLimitFix.h @@ -115,7 +115,7 @@ struct LightLimitFix : OverlayFeature ConstantBuffer* strictLightDataCB = nullptr; - int eyeCount = !REL::Module::IsVR() ? 1 : 2; + int eyeCount = 1; bool previousEnableLightsVisualisation = settings.EnableLightsVisualisation; bool currentEnableLightsVisualisation = settings.EnableLightsVisualisation; @@ -135,7 +135,7 @@ struct LightLimitFix : OverlayFeature float lightsNear = 1; float lightsFar = 16384; - RE::NiPoint3 eyePositionCached[2]{}; + RE::NiPoint3 eyePositionCached[1]{}; bool wasEmpty = false; bool wasWorld = false; int previousRoomIndex = -1; @@ -231,7 +231,6 @@ struct LightLimitFix : OverlayFeature } }; - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; } }; diff --git a/src/Features/LinearLighting.cpp b/src/Features/LinearLighting.cpp index ce3ead1a31..ffed1a9d81 100644 --- a/src/Features/LinearLighting.cpp +++ b/src/Features/LinearLighting.cpp @@ -117,7 +117,7 @@ void LinearLighting::Prepass() if (!imageSpaceManager) return; - dirLightMult = !globals::game::isVR ? imageSpaceManager->GetRuntimeData().data.baseData.hdr.sunlightScale : imageSpaceManager->GetVRRuntimeData().data.baseData.hdr.sunlightScale; + dirLightMult = imageSpaceManager->GetRuntimeData().data.baseData.hdr.sunlightScale; } struct LinearLighting::Hooks diff --git a/src/Features/LinearLighting.h b/src/Features/LinearLighting.h index a3e30ade1c..2195154192 100644 --- a/src/Features/LinearLighting.h +++ b/src/Features/LinearLighting.h @@ -20,7 +20,6 @@ struct LinearLighting : Feature T("feature.linear_lighting.key_feature_3", "Makes PBR really work") } }; }; - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; struct Settings diff --git a/src/Features/PerformanceOverlay.h b/src/Features/PerformanceOverlay.h index d09ba40818..e3e3872bda 100644 --- a/src/Features/PerformanceOverlay.h +++ b/src/Features/PerformanceOverlay.h @@ -123,7 +123,6 @@ struct PerformanceOverlay : OverlayFeature std::string GetName() override { return "Performance Overlay"; } virtual std::string GetDisplayName() override { return T("feature.performance_overlay.name", "Performance Overlay"); } std::string GetShortName() override { return "PerformanceOverlay"; } - virtual bool SupportsVR() override { return true; } virtual bool IsCore() const override { return true; } virtual bool IsInMenu() const override { return true; } bool IsOverlayVisible() const override { return settings.ShowInOverlay; } diff --git a/src/Features/RenderDoc.h b/src/Features/RenderDoc.h index a5b093f2f0..920cba3f49 100644 --- a/src/Features/RenderDoc.h +++ b/src/Features/RenderDoc.h @@ -62,7 +62,6 @@ class RenderDoc : public Feature T("feature.render_doc.key_feature_2", "Open captures folder"), T("feature.render_doc.key_feature_3", "Capture file management") } }; } - bool SupportsVR() override { return true; } std::string_view GetShaderDefineName() override { return ""; } bool HasShaderDefine(RE::BSShader::Type) override { return false; }; diff --git a/src/Features/ScreenSpaceGI.cpp b/src/Features/ScreenSpaceGI.cpp index a232895eda..65c7297af3 100644 --- a/src/Features/ScreenSpaceGI.cpp +++ b/src/Features/ScreenSpaceGI.cpp @@ -69,13 +69,9 @@ void ScreenSpaceGI::DrawSettings() } ImGui::TableNextColumn(); { - auto vanillaSSAOGuard = Util::DisableGuard(globals::game::isVR); ImGui::Checkbox(T(TKEY("vanilla_ssao"), "Vanilla SSAO"), &settings.EnableVanillaSSAO); if (auto _tt = Util::HoverTooltipWrapper()) { - if (globals::game::isVR) - ImGui::Text("%s", T(TKEY("vanilla_ssao_tooltip_vr"), "Vanilla SSAO is not supported in VR.")); - else - ImGui::Text("%s", T(TKEY("vanilla_ssao_tooltip"), "Enable Skyrim's built-in SSAO. Usually disabled when using SSGI to avoid double-darkening.")); + ImGui::Text("%s", T(TKEY("vanilla_ssao_tooltip"), "Enable Skyrim's built-in SSAO. Usually disabled when using SSGI to avoid double-darkening.")); } } ImGui::TableNextColumn(); @@ -95,18 +91,16 @@ void ScreenSpaceGI::DrawSettings() auto qualityGuard = Util::DisableGuard(!settings.Enabled); if (ImGui::BeginTable("Presets", 5)) { - auto select = [](auto flatVal, auto vrVal) { return globals::game::isVR ? vrVal : flatVal; }; - ImGui::TableNextColumn(); if (ImGui::Button(T(TKEY("ao_only"), "AO only"), { -1, 0 })) { - settings.NumSlices = select(1, 3); - settings.NumSteps = select(6, 8); + settings.NumSlices = 1; + settings.NumSteps = 6; settings.EnableBlur = true; settings.EnableGI = false; recompileFlag = true; } if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text(select("1 Slice, 6 Steps, blur enabled, no GI\n", "3 Slices, 8 Steps, blur enabled, no GI\n")); + ImGui::Text("1 Slice, 6 Steps, blur enabled, no GI\n"); } ImGui::TableNextColumn(); @@ -587,7 +581,7 @@ void ScreenSpaceGI::SetupResources() void ScreenSpaceGI::ClearShaderCache() { static const std::vector*> shaderPtrs = { - &prefilterDepthsCompute, &prefilterRadianceCompute, &prefilterNormalCompute, &radianceDisoccCompute, &giCompute, &blurCompute, &stereoSyncCompute, &upsampleCompute + &prefilterDepthsCompute, &prefilterRadianceCompute, &prefilterNormalCompute, &radianceDisoccCompute, &giCompute, &blurCompute, &upsampleCompute }; for (auto shader : shaderPtrs) @@ -616,11 +610,7 @@ void ScreenSpaceGI::CompileComputeShaders() { &upsampleCompute, "upsample.cs.hlsl", {} }, }; - if (REL::Module::IsVR()) - shaderInfos.push_back({ &stereoSyncCompute, "stereoSync.cs.hlsl", { { "FRAMEBUFFER", "" } } }); for (auto& info : shaderInfos) { - if (REL::Module::IsVR()) - info.defines.push_back({ "VR", "" }); if (settings.ResolutionMode == 1) info.defines.push_back({ "HALF_RES", "" }); if (settings.ResolutionMode == 2) @@ -657,16 +647,14 @@ void ScreenSpaceGI::UpdateSB() SSGICB data; { - for (int eyeIndex = 0; eyeIndex < (1 + REL::Module::IsVR()); ++eyeIndex) { - auto eye = Util::GetCameraData(eyeIndex); + { + auto eye = globals::game::shadowState->GetRuntimeData().cameraData.getEye(0); - data.PrevInvViewMat[eyeIndex] = prevInvView[eyeIndex]; - data.NDCToViewMul[eyeIndex] = { 2.0f / eye.projMat(0, 0), -2.0f / eye.projMat(1, 1) }; - data.NDCToViewAdd[eyeIndex] = { -1.0f / eye.projMat(0, 0), 1.0f / eye.projMat(1, 1) }; - if (REL::Module::IsVR()) - data.NDCToViewMul[eyeIndex].x *= 2; + data.PrevInvViewMat[0] = prevInvView[0]; + data.NDCToViewMul[0] = { 2.0f / eye.projMat(0, 0), -2.0f / eye.projMat(1, 1) }; + data.NDCToViewAdd[0] = { -1.0f / eye.projMat(0, 0), 1.0f / eye.projMat(1, 1) }; - prevInvView[eyeIndex] = eye.viewMat.Invert(); + prevInvView[0] = eye.viewMat.Invert(); } data.TexDim = res; @@ -926,38 +914,6 @@ void ScreenSpaceGI::DrawSSGI() lastFrameAccumTexIdx = !lastFrameAccumTexIdx; } - // VR stereo sync: bilateral blend of SSGI buffers between eyes - // Shi, Billeter, Eisemann 2022, "Stereo-consistent screen-space ambient occlusion" - if (REL::Module::IsVR() && stereoSyncCompute) { - TracyD3D11Zone(globals::state->tracyCtx, "SSGI - Stereo Sync"); - - if (globals::state->frameAnnotations) - globals::state->BeginPerfEvent("SSGI - Stereo Sync"); - - resetViews(); - srvs.at(0) = texWorkingDepth->srv.get(); - srvs.at(1) = texAo[inputAoTexIdx]->srv.get(); - srvs.at(2) = texIlY[inputGITexIdx]->srv.get(); - srvs.at(3) = texIlCoCg[inputGITexIdx]->srv.get(); - - uavs.at(0) = texAo[!inputAoTexIdx]->uav.get(); - uavs.at(1) = texIlY[!inputGITexIdx]->uav.get(); - uavs.at(2) = texIlCoCg[!inputGITexIdx]->uav.get(); - - context->CSSetShaderResources(0, (uint)srvs.size(), srvs.data()); - context->CSSetUnorderedAccessViews(0, (uint)uavs.size(), uavs.data(), nullptr); - context->CSSetShader(stereoSyncCompute.get(), nullptr, 0); - globals::profiler->BeginPass("ScreenSpaceGI::StereoSync"); - context->Dispatch((internalRes[0] + 7u) >> 3, (internalRes[1] + 7u) >> 3, 1); - globals::profiler->EndPass(); - - inputAoTexIdx = !inputAoTexIdx; - inputGITexIdx = !inputGITexIdx; - - if (globals::state->frameAnnotations) - globals::state->EndPerfEvent(); - } - // upsample if (settings.ResolutionMode != 0) { resetViews(); diff --git a/src/Features/ScreenSpaceGI.h b/src/Features/ScreenSpaceGI.h index e2dddc30de..72f853d6f3 100644 --- a/src/Features/ScreenSpaceGI.h +++ b/src/Features/ScreenSpaceGI.h @@ -8,7 +8,6 @@ struct ScreenSpaceGI : Feature static constexpr std::string_view MOD_ID = "130375"; public: - bool inline SupportsVR() override { return true; } virtual inline std::string GetName() override { return "Screen Space GI"; } virtual std::string GetDisplayName() override { return T("feature.screen_space_gi.name", "Screen Space GI"); } @@ -19,9 +18,6 @@ struct ScreenSpaceGI : Feature virtual std::pair> GetFeatureSummary() override { std::string desc = T("feature.screen_space_gi.description", "Screen Space Global Illumination adds realistic indirect lighting and ambient occlusion to the game. This technique simulates how light bounces off surfaces to illuminate other objects naturally."); - if (REL::Module::IsVR()) { - desc += T("feature.screen_space_gi.vr_warning", "\n\nWarning: In VR, this feature may have visual artifacts and can have a significant performance impact due to the nature of screen space effects."); - } return { desc, { T("feature.screen_space_gi.key_feature_1", "Realistic indirect lighting"), T("feature.screen_space_gi.key_feature_2", "Enhanced ambient occlusion"), @@ -53,12 +49,12 @@ struct ScreenSpaceGI : Feature struct Settings { bool Enabled = true; - bool EnableGI = REL::Module::IsVR() ? false : true; // AO only for VR by default + bool EnableGI = true; bool EnableExperimentalSpecularGI = false; bool EnableVanillaSSAO = false; // performance/quality - uint NumSlices = REL::Module::IsVR() ? 3u : 4u; // AO preset for VR - uint NumSteps = REL::Module::IsVR() ? 6u : 8u; + uint NumSlices = 4u; + uint NumSteps = 8u; int ResolutionMode = 1; // 0-full, 1-half, 2-quarter - DBF default // visual float MinScreenRadius = 0.01f; @@ -160,6 +156,5 @@ struct ScreenSpaceGI : Feature winrt::com_ptr radianceDisoccCompute = nullptr; winrt::com_ptr giCompute = nullptr; winrt::com_ptr blurCompute = nullptr; - winrt::com_ptr stereoSyncCompute = nullptr; winrt::com_ptr upsampleCompute = nullptr; }; diff --git a/src/Features/ScreenSpaceShadows.cpp b/src/Features/ScreenSpaceShadows.cpp index c5452d91fe..99b7ab2197 100644 --- a/src/Features/ScreenSpaceShadows.cpp +++ b/src/Features/ScreenSpaceShadows.cpp @@ -45,15 +45,6 @@ void ScreenSpaceShadows::DrawSettings() if (auto _tt = Util::HoverTooltipWrapper()) ImGui::Text("%s", T(TKEY("shadow_contrast_tooltip"), "Contrast boost for the shadow transition. Higher values produce harder shadow edges.")); - if (globals::game::isVR && globals::state->IsDeveloperMode()) { - ImGui::Checkbox(T(TKEY("vr_stereo_sync"), "VR Stereo Sync"), &enableStereoSync); - if (auto _tt = Util::HoverTooltipWrapper()) - ImGui::Text("%s", T(TKEY("vr_stereo_sync_tooltip"), - "Synchronizes shadow data between left and right eyes via bilateral reprojection " - "and applies a depth-weighted blur to reduce per-eye noise. " - "Uses min-blend so if either eye detects an occluder, the shadow is preserved. ")); - } - ImGui::Spacing(); ImGui::Spacing(); ImGui::TreePop(); @@ -66,30 +57,15 @@ void ScreenSpaceShadows::InvalidateRaymarchShaders() raymarchCS->Release(); raymarchCS = nullptr; } - if (raymarchRightCS) { - raymarchRightCS->Release(); - raymarchRightCS = nullptr; - } } void ScreenSpaceShadows::ClearShaderCache() { InvalidateRaymarchShaders(); - if (stereoSyncCS) { - stereoSyncCS->Release(); - stereoSyncCS = nullptr; - } } uint ScreenSpaceShadows::GetScaledSampleCount() { - if (globals::game::isVR) { - // In VR, SAMPLE_COUNT is a pixel-space ray length that is FOV-driven, not resolution-driven. - // Resolution-scaling produced 2-8x excess samples at VR resolutions with no quality benefit. - // WAVE_SIZE (64) alignment is required for correct Bend READ_COUNT computation. - return bendSettings.SampleCount * 64; - } - float2 renderSize = Util::ConvertToDynamic(globals::state->screenSize); // Scale sample count based on both dimensions relative to 1920x1080 reference @@ -127,19 +103,6 @@ ID3D11ComputeShader* ScreenSpaceShadows::GetComputeRaymarch() return raymarchCS; } -ID3D11ComputeShader* ScreenSpaceShadows::GetComputeRaymarchRight() -{ - if (!raymarchRightCS) { - uint scaledSampleCount = GetScaledSampleCount(); - auto sampleCount = std::format("{}", scaledSampleCount); - std::vector> defines{ { "SAMPLE_COUNT", sampleCount.c_str() }, { "RIGHT", "" } }; - if (globals::features::terrainBlending.loaded) - defines.push_back({ "TERRAIN_BLENDING", "" }); - raymarchRightCS = (ID3D11ComputeShader*)Util::CompileShader(L"Data\\Shaders\\ScreenSpaceShadows\\RaymarchCS.hlsl", defines, "cs_5_0"); - } - return raymarchRightCS; -} - void ScreenSpaceShadows::DrawShadows() { ZoneScopedS(8); @@ -156,21 +119,18 @@ void ScreenSpaceShadows::DrawShadows() light.Normalize(); float4 lightProjection = float4(-light.x, -light.y, -light.z, 0.0f); - // Helper lambda to calculate light projection for a given eye - auto CalculateLightProjection = [&](uint32_t eyeIndex = 0) -> std::array { - auto viewProjMat = globals::game::frameBufferCached.GetCameraViewProj(eyeIndex).Transpose(); + // Helper lambda to calculate light projection + auto CalculateLightProjection = [&]() -> std::array { + auto viewProjMat = globals::game::frameBufferCached.GetCameraViewProj().Transpose(); auto projectedLight = DirectX::SimpleMath::Vector4::Transform(lightProjection, viewProjMat); return { projectedLight.x, projectedLight.y, projectedLight.z, projectedLight.w }; }; - auto lightProjectionF = CalculateLightProjection(0); + auto lightProjectionF = CalculateLightProjection(); float2 renderSize = Util::ConvertToDynamic(state->screenSize); int viewportSize[2] = { (int)renderSize.x, (int)renderSize.y }; - if (globals::game::isVR) - viewportSize[0] /= 2; - int minRenderBounds[2] = { 0, 0 }; int maxRenderBounds[2] = { viewportSize[0], viewportSize[1] }; @@ -195,7 +155,7 @@ void ScreenSpaceShadows::DrawShadows() float2 dynamicRes = { viewport->GetRuntimeData().dynamicResolutionWidthRatio, viewport->GetRuntimeData().dynamicResolutionHeightRatio }; - // Shared dispatch logic for both VR and non-VR + // Shared dispatch logic auto DispatchEye = [&](const char* eyeName, ID3D11ComputeShader* shader, const float* lightProj, float invTexSizeX, float invTexSizeY) { std::string timerName = eyeName ? std::format("ScreenSpaceShadows::RayMarch({})", eyeName) : "ScreenSpaceShadows::RayMarch"; @@ -256,21 +216,7 @@ void ScreenSpaceShadows::DrawShadows() float InvTexSizeX = 1.0f / (float)viewportSize[0]; float InvTexSizeY = 1.0f / (float)viewportSize[1]; - if (!globals::game::isVR) { - DispatchEye(nullptr, GetComputeRaymarch(), lightProjectionF.data(), InvTexSizeX, InvTexSizeY); - } else { - { - TracyD3D11Zone(globals::state->tracyCtx, "SSS - Left Eye"); - DispatchEye("Left Eye", GetComputeRaymarch(), lightProjectionF.data(), InvTexSizeX, InvTexSizeY); - } - - // Calculate light projection for right eye - auto lightProjectionRightF = CalculateLightProjection(1); - { - TracyD3D11Zone(globals::state->tracyCtx, "SSS - Right Eye"); - DispatchEye("Right Eye", GetComputeRaymarchRight(), lightProjectionRightF.data(), InvTexSizeX, InvTexSizeY); - } - } + DispatchEye(nullptr, GetComputeRaymarch(), lightProjectionF.data(), InvTexSizeX, InvTexSizeY); ID3D11ShaderResourceView* views[1]{ nullptr }; context->CSSetShaderResources(0, 1, views); @@ -287,73 +233,6 @@ void ScreenSpaceShadows::DrawShadows() context->CSSetConstantBuffers(1, 1, &buffer); } -void ScreenSpaceShadows::DrawStereoSync() -{ - if (!globals::game::isVR || !enableStereoSync || !stereoSyncCopyTex || !stereoSyncCB) - return; - - if (!stereoSyncCS) { - std::vector> defines{ { "VR", "" }, { "FRAMEBUFFER", "" } }; - if (globals::features::terrainBlending.loaded) - defines.push_back({ "TERRAIN_BLENDING", "" }); - stereoSyncCS = reinterpret_cast(Util::CompileShader(L"Data\\Shaders\\ScreenSpaceShadows\\StereoSyncCS.hlsl", defines, "cs_5_0")); - } - if (!stereoSyncCS) - return; - - ZoneScoped; - TracyD3D11Zone(globals::state->tracyCtx, "SSS - Stereo Sync"); - - if (globals::state->frameAnnotations) - globals::state->BeginPerfEvent("SSS - Stereo Sync"); - - auto context = globals::d3d::context; - globals::profiler->BeginPass("ScreenSpaceShadows::StereoSync"); - - context->CopyResource(stereoSyncCopyTex->resource.get(), screenSpaceShadowsTexture->resource.get()); - - float2 resolution = Util::ConvertToDynamic(globals::state->screenSize); - - StereoSyncCB cbData{}; - cbData.FrameDim[0] = resolution.x; - cbData.FrameDim[1] = resolution.y; - cbData.RcpFrameDim[0] = 1.0f / resolution.x; - cbData.RcpFrameDim[1] = 1.0f / resolution.y; - - stereoSyncCB->Update(cbData); - auto cbPtr = stereoSyncCB->CB(); - - // Same 24/32-bit depth path as the raymarch — SrcDepthTexture's HLSL type is - // conditional on TERRAIN_BLENDING via the define passed at compile time below. - auto* depthSRV = Util::GetCurrentSceneDepthSRV(false); - ID3D11ShaderResourceView* srvs[2]{ depthSRV, stereoSyncCopyTex->srv.get() }; - ID3D11UnorderedAccessView* uavs[1]{ screenSpaceShadowsTexture->uav.get() }; - - context->CSSetConstantBuffers(1, 1, &cbPtr); - auto* sharedDataBuf = globals::state->sharedDataCB->CB(); - context->CSSetConstantBuffers(5, 1, &sharedDataBuf); - context->CSSetShaderResources(0, 2, srvs); - context->CSSetUnorderedAccessViews(0, 1, uavs, nullptr); - context->CSSetShader(stereoSyncCS, nullptr, 0); - - auto dispatchCount = Util::GetScreenDispatchCount(true); - context->Dispatch(dispatchCount.x, dispatchCount.y, 1); - - srvs[0] = nullptr; - srvs[1] = nullptr; - uavs[0] = nullptr; - cbPtr = nullptr; - context->CSSetShaderResources(0, 2, srvs); - context->CSSetUnorderedAccessViews(0, 1, uavs, nullptr); - context->CSSetConstantBuffers(1, 1, &cbPtr); - context->CSSetShader(nullptr, nullptr, 0); - - globals::profiler->EndPass(); - - if (globals::state->frameAnnotations) - globals::state->EndPerfEvent(); -} - void ScreenSpaceShadows::Prepass() { auto context = globals::d3d::context; @@ -364,7 +243,6 @@ void ScreenSpaceShadows::Prepass() if (auto sky = globals::game::sky) if (bendSettings.Enable && sky->mode.get() == RE::Sky::Mode::kFull) { DrawShadows(); - DrawStereoSync(); } auto view = screenSpaceShadowsTexture->srv.get(); @@ -395,10 +273,6 @@ void ScreenSpaceShadows::SetupResources() { raymarchCB = new ConstantBuffer(ConstantBufferDesc(), "SSS::RaymarchCB"); - if (globals::game::isVR) { - stereoSyncCB = new ConstantBuffer(ConstantBufferDesc(), "SSS::StereoSyncCB"); - } - { auto device = globals::d3d::device; @@ -441,11 +315,6 @@ void ScreenSpaceShadows::SetupResources() screenSpaceShadowsTexture = new Texture2D(texDesc, "SSS::ShadowTexture"); screenSpaceShadowsTexture->CreateSRV(srvDesc); screenSpaceShadowsTexture->CreateUAV(uavDesc); - - if (globals::game::isVR) { - stereoSyncCopyTex = new Texture2D(texDesc, "SSS::StereoSyncCopy"); - stereoSyncCopyTex->CreateSRV(srvDesc); - } } } #undef I18N_KEY_PREFIX diff --git a/src/Features/ScreenSpaceShadows.h b/src/Features/ScreenSpaceShadows.h index 48c79556c1..fadd8658dc 100644 --- a/src/Features/ScreenSpaceShadows.h +++ b/src/Features/ScreenSpaceShadows.h @@ -25,9 +25,9 @@ struct ScreenSpaceShadows : Feature struct BendSettings { - float SurfaceThickness = !globals::game::isVR ? 0.02f : 0.010f; + float SurfaceThickness = 0.02f; float BilinearThreshold = 0.02f; - float ShadowContrast = !globals::game::isVR ? 1.0f : 4.0f; + float ShadowContrast = 1.0f; uint Enable = 1; uint SampleCount = 1; uint pad0[3]; @@ -56,28 +56,13 @@ struct ScreenSpaceShadows : Feature }; STATIC_ASSERT_ALIGNAS_16(RaymarchCB); - bool enableStereoSync = true; - - struct alignas(16) StereoSyncCB - { - float FrameDim[2]; - float RcpFrameDim[2]; - }; - STATIC_ASSERT_ALIGNAS_16(StereoSyncCB); - ID3D11SamplerState* pointBorderSampler = nullptr; ConstantBuffer* raymarchCB = nullptr; ID3D11ComputeShader* raymarchCS = nullptr; - ID3D11ComputeShader* raymarchRightCS = nullptr; Texture2D* screenSpaceShadowsTexture = nullptr; - // VR stereo sync resources - Texture2D* stereoSyncCopyTex = nullptr; - ConstantBuffer* stereoSyncCB = nullptr; - ID3D11ComputeShader* stereoSyncCS = nullptr; - virtual void SetupResources() override; virtual void DrawSettings() override; @@ -87,7 +72,6 @@ struct ScreenSpaceShadows : Feature uint GetScaledSampleCount(); uint lastCompiledSampleCount = 0; ID3D11ComputeShader* GetComputeRaymarch(); - ID3D11ComputeShader* GetComputeRaymarchRight(); virtual void Prepass() override; @@ -95,9 +79,7 @@ struct ScreenSpaceShadows : Feature virtual void SaveSettings(json& o_json) override; void DrawShadows(); - void DrawStereoSync(); virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; }; diff --git a/src/Features/ScreenshotFeature.cpp b/src/Features/ScreenshotFeature.cpp index 39f7aaf5bb..d7cf869caf 100644 --- a/src/Features/ScreenshotFeature.cpp +++ b/src/Features/ScreenshotFeature.cpp @@ -1,5 +1,5 @@ // Screenshot Feature -// Non-blocking screenshot tool for flat (SE/AE) and VR. GPU copy runs on the +// Non-blocking screenshot tool. GPU copy runs on the // render thread; encoding and disk I/O run on a dedicated worker thread so // capture does not stall the frame. @@ -340,13 +340,11 @@ namespace bool IsFlatHdrScreenshotCapture() { - return !globals::game::isVR && - globals::features::hdrDisplay.loaded && + return globals::features::hdrDisplay.loaded && globals::features::hdrDisplay.settings.enableHDR; } // Picks the capture source: - // VR -> kVR_FRAMEBUFFER (SBS). // HDR enabled -> swap-chain back buffer after ApplyHDR (PQ HDR10 / PQ float). // otherwise -> kFRAMEBUFFER (tonemapped UNORM). CaptureSource SelectCaptureSource(winrt::com_ptr& holder) @@ -357,13 +355,6 @@ namespace return src; } - if (globals::game::isVR) { - auto& slot = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kVR_FRAMEBUFFER]; - src.texture = ResolveSlotTexture(slot, holder); - src.srv = slot.SRV; - src.description = "VR SBS framebuffer"; - return src; - } if (IsFlatHdrScreenshotCapture()) { src.texture = ResolveDisplayedBackBuffer(holder); @@ -396,11 +387,9 @@ namespace // 1. BlendEnable must stay FALSE - the source texture carries non-1 alpha // where Skyrim composited UI plates; default SRC_ALPHA blend lets the // host window background show through (visible on the desktop mirror). - // 2. WriteMask must exclude alpha (RGB only). In VR, Skyrim's menu UI - // shader recomposites our menu plate over the SBS framebuffer with - // alpha blending; writing texture alpha into the menu plate RT - // produces a cutout visible only through the HMD. RGB-only writes - // leave the plate's pre-cleared alpha=1 in place. + // 2. WriteMask must exclude alpha (RGB only) to avoid compositing + // artifacts. RGB-only writes leave the plate's pre-cleared alpha=1 + // in place. // Paired with ImDrawCallback_ResetRenderState queued by Subrect::DrawEditor // immediately after the image draw. void OpaquePreviewBlendCallback(const ImDrawList*, const ImDrawCmd*) @@ -569,17 +558,6 @@ bool ScreenshotFeature::IsInMenu() const void ScreenshotFeature::PostPostLoad() { - // Seed VR-specific presets here rather than in LoadSettings: Feature::Load - // only dispatches to LoadSettings when the JSON already has a settings - // block, so a fresh install would skip a seed placed there. Left first so - // it's the initial selection (matches vanilla Skyrim VR's left-eye save). - if (REL::Module::IsVR()) { - subrect.SeedDefaultPresets({ - { .name = "Left Eye", .uv = { 0.0f, 0.0f, 0.5f, 1.0f } }, - { .name = "Right Eye", .uv = { 0.5f, 0.0f, 0.5f, 1.0f } }, - { .name = "Full Frame", .uv = { 0.0f, 0.0f, 1.0f, 1.0f } }, - }); - } } void ScreenshotFeature::LoadSettings(json& a_json) @@ -637,7 +615,7 @@ void ScreenshotFeature::DrawSettings() ImGui::TextWrapped("%s", T(TKEY("sdr_note"), "Enable HDR Display to capture HDR PNG screenshots with HDR10 metadata. " - "SDR and VR captures use the lossless format selected below.")); + "SDR captures use the lossless format selected below.")); } if (ImGui::Button(T(TKEY("take_screenshot"), "Take Screenshot Now"))) { @@ -652,15 +630,12 @@ void ScreenshotFeature::DrawSettings() if (auto _tt = Util::HoverTooltipWrapper()) ImGui::Text("Places the saved screenshot on the clipboard as a file (paste in Explorer or attach in chat apps)."); - if (!hdrCaptureAvailable || globals::game::isVR) { + if (!hdrCaptureAvailable) { int sdrFormat = sdrUsePng ? 1 : 0; ImGui::RadioButton("BMP (lossless)", &sdrFormat, 0); ImGui::SameLine(); ImGui::RadioButton("PNG (lossless)", &sdrFormat, 1); sdrUsePng = sdrFormat != 0; - if (hdrCaptureAvailable && globals::game::isVR) { - ImGui::TextWrapped("VR captures use this format. Flat HDR mode always saves HDR PNG."); - } } char buf[260]; @@ -703,8 +678,7 @@ void ScreenshotFeature::DrawSettings() ImGui::SeparatorText(T(TKEY("crop"), "Crop")); - // Preview reflects what Capture() would save. Full source frame so VR users - // can drag-crop across the eye boundary if a seeded preset doesn't fit. + // Preview reflects what Capture() would save. winrt::com_ptr previewTextureKeepAlive; const auto src = SelectCaptureSource(previewTextureKeepAlive); diff --git a/src/Features/ScreenshotFeature.h b/src/Features/ScreenshotFeature.h index c5a87cb8f7..67381d2d89 100644 --- a/src/Features/ScreenshotFeature.h +++ b/src/Features/ScreenshotFeature.h @@ -18,7 +18,6 @@ struct ScreenshotFeature : public Feature virtual std::string GetShortName() override { return "Screenshot"; } virtual std::string_view GetCategory() const override { return FeatureCategories::kUtility; } - virtual bool SupportsVR() override { return true; } virtual bool IsInMenu() const override; virtual void DrawSettings() override; @@ -36,7 +35,7 @@ struct ScreenshotFeature : public Feature std::string screenshotPath = "Screenshots"; // HDR PNG quantization (7-16); used when HDR Display captures the back buffer. unsigned int hdrPngBitDepth = 11; - // SDR / VR output (HDR captures always use PNG). + // SDR output (HDR captures always use PNG). bool sdrUsePng = false; // After save, put the file path on the clipboard (CF_HDROP). bool copyToClipboard = false; diff --git a/src/Features/Skin.h b/src/Features/Skin.h index 9e21044810..b5af9053d6 100644 --- a/src/Features/Skin.h +++ b/src/Features/Skin.h @@ -30,7 +30,6 @@ struct Skin : Feature return t == RE::BSShader::Type::Lighting; }; - virtual inline bool SupportsVR() { return true; } virtual void RestoreDefaultSettings() override; virtual void DrawSettings() override; diff --git a/src/Features/SkySync.h b/src/Features/SkySync.h index 2290fe1819..779fb31988 100644 --- a/src/Features/SkySync.h +++ b/src/Features/SkySync.h @@ -50,7 +50,6 @@ struct SkySync : Feature virtual void RestoreDefaultSettings() override; virtual bool IsCore() const override { return true; } - virtual bool SupportsVR() override { return true; } void OnSkyUpdateColors(RE::Sky* sky); diff --git a/src/Features/Skylighting.cpp b/src/Features/Skylighting.cpp index b52305700c..db2694252b 100644 --- a/src/Features/Skylighting.cpp +++ b/src/Features/Skylighting.cpp @@ -174,7 +174,7 @@ Skylighting::SkylightingCB Skylighting::GetCommonBufferData(bool a_inWorld) static float3 prevCellID = { 0, 0, 0 }; - auto eyePosNI = Util::GetEyePosition(0); + auto eyePosNI = Util::GetAverageEyePosition(); auto eyePos = float3{ eyePosNI.x, eyePosNI.y, eyePosNI.z }; float3 cellSize = { @@ -259,12 +259,9 @@ void Skylighting::PostPostLoad() { logger::info("[SKYLIGHTING] Hooking BSLightingShaderProperty::GetPrecipitationOcclusionMapRenderPassesImp"); stl::write_vfunc<0x2D, BSLightingShaderProperty_GetPrecipitationOcclusionMapRenderPassesImpl>(RE::VTABLE_BSLightingShaderProperty[0]); - stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x3A1, 0x3A1, 0x2FA)); + stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x3A1, 0x3A1)); - if (REL::Module::IsVR()) - stl::write_thunk_call(REL::RelocationID(25643, 26185).address() + REL::Relocate(0x5D9, 0x59D, 0x5DC)); - else - stl::write_thunk_call(REL::RelocationID(25643, 26185).address() + REL::Relocate(0x5D9, 0x59D, 0x5DC)); + stl::write_thunk_call(REL::RelocationID(25643, 26185).address() + REL::Relocate(0x5D9, 0x59D)); MenuOpenCloseEventHandler::Register(); } @@ -461,24 +458,6 @@ void Skylighting::SetViewFrustum::thunk(RE::NiCamera* a_camera, RE::NiFrustum* a func(a_camera, a_frustum); } -void Skylighting::SetViewFrustumVR::thunk(RE::NiCamera* a_camera, RE::NiFrustum* a_frustum, uint a_eyeIndex) -{ - auto& skylighting = globals::features::skylighting; - - if (skylighting.inOcclusion) { - uint corner = skylighting.frameCount % 4; - - float frustumSize = a_frustum->fTop; - - a_frustum->fBottom = (corner == 0 || corner == 1) ? -frustumSize : 0.0f; - a_frustum->fLeft = (corner == 0 || corner == 2) ? -frustumSize : 0.0f; - a_frustum->fRight = (corner == 1 || corner == 3) ? frustumSize : 0.0f; - a_frustum->fTop = (corner == 2 || corner == 3) ? frustumSize : 0.0f; - } - - func(a_camera, a_frustum, a_eyeIndex); -} - void Skylighting::RenderOcclusion() { ZoneScopedS(8); diff --git a/src/Features/Skylighting.h b/src/Features/Skylighting.h index 900f709ab2..78aa3ee0c6 100644 --- a/src/Features/Skylighting.h +++ b/src/Features/Skylighting.h @@ -6,7 +6,6 @@ struct Skylighting : Feature static constexpr std::string_view MOD_ID = "139352"; public: - virtual bool SupportsVR() override { return true; }; virtual inline std::string GetName() override { return "Skylighting"; } virtual std::string GetDisplayName() override { return T("feature.skylighting.name", "Skylighting"); } @@ -114,12 +113,6 @@ struct Skylighting : Feature static inline REL::Relocation func; }; - struct SetViewFrustumVR - { - static void thunk(RE::NiCamera* a_camera, RE::NiFrustum* a_frustum, uint a_eyeIndex); - static inline REL::Relocation func; - }; - // Event handler class MenuOpenCloseEventHandler : public RE::BSTEventSink { diff --git a/src/Features/SubsurfaceScattering.cpp b/src/Features/SubsurfaceScattering.cpp index 591d1ae194..6e4136d425 100644 --- a/src/Features/SubsurfaceScattering.cpp +++ b/src/Features/SubsurfaceScattering.cpp @@ -230,7 +230,7 @@ void SubsurfaceScattering::DrawSSS() auto dispatchCount = Util::GetScreenDispatchCount(); { - auto cameraData = Util::GetCameraData(0); + auto cameraData = globals::game::shadowState->GetRuntimeData().cameraData.getEye(); blurCBData.SSSS_FOVY = atan(1.0f / cameraData.projMat.m[0][0]) * 2.0f * (180.0f / 3.14159265359f); diff --git a/src/Features/SubsurfaceScattering.h b/src/Features/SubsurfaceScattering.h index 7ebd3ae33e..edcc3954d2 100644 --- a/src/Features/SubsurfaceScattering.h +++ b/src/Features/SubsurfaceScattering.h @@ -135,5 +135,4 @@ struct SubsurfaceScattering : Feature } }; - virtual bool SupportsVR() override { return true; }; }; diff --git a/src/Features/TerrainBlending.cpp b/src/Features/TerrainBlending.cpp index b298fdbb13..7643d95e1d 100644 --- a/src/Features/TerrainBlending.cpp +++ b/src/Features/TerrainBlending.cpp @@ -6,7 +6,6 @@ #include "ShaderCache.h" #include "State.h" #include "Utils/D3D.h" -#include "VR.h" #define I18N_KEY_PREFIX "feature.terrain_blending." @@ -44,7 +43,7 @@ namespace // 1) PS slot 17 override: bind TB-selected depth SRV for OBB depth reads; prevents occlusion instability / mesh popping. // 2) PS slot 2 override: bind TB-selected depth SRV for shadowmask reads; prevents unstable/moving ground shadow imprint, and dark overlay style artifacts. // 3) OM depth override: force DepthFunc=ALWAYS only on descriptor 0x1062002; mitigate shadowmask ground artifacts caused by failed depth testing in 0x1062002. - // All override paths below are gated by IsEngineHookFeatureGateSatisfied and all are VR-specific at runtime (isVR, gateSatisfied). + // All override paths below are gated by IsEngineHookFeatureGateSatisfied. // Developer Mode only: logs one hook snapshot per session ([TB Override]/[TB DepthOverride]) and explicit fallback activate/reset events. // Fallbacks: caller fallback is in ShouldAllowCallerWithFallback(...) (2 and 3 widen after 5 rejects and collapse on first allowlisted hit), SRV-source fallback is in Util::GetCurrentSceneDepthSRV(...). // Pixel descriptors: @@ -118,8 +117,7 @@ namespace bool ShouldUseBlendedDepthSRV() { - auto& vr = globals::features::vr; - return !globals::game::isVR || !vr.gDepthBufferCulling || !*vr.gDepthBufferCulling; + return true; } bool IsShadowmaskDepthDescriptorWhitelisted(const uint32_t a_descriptor) @@ -228,13 +226,9 @@ namespace a_callerRva); } - bool IsEngineHookFeatureGateSatisfied(const TerrainBlending& a_singleton) + bool IsEngineHookFeatureGateSatisfied([[maybe_unused]] const TerrainBlending& a_singleton) { - if (!globals::game::isVR || !a_singleton.loaded || !a_singleton.settings.Enabled) { - return false; - } - - return !ShouldUseBlendedDepthSRV(); + return false; } struct EngineHookPassGateState @@ -826,7 +820,7 @@ void TerrainBlending::BlendPrepassDepths() auto stateUpdateFlags = globals::game::stateUpdateFlags; stateUpdateFlags->set(RE::BSGraphics::ShaderFlags::DIRTY_RENDERTARGET); // CopyResource(terrainDepth <- mainDepth) eliminated: main depth is now written - // directly into mainDepthCopy (u2) by the CS above, saving a full-stereo D24S8 copy. + // directly into mainDepthCopy (u2) by the CS above, saving a full D24S8 copy. if (globals::state->frameAnnotations) globals::state->EndPerfEvent(); diff --git a/src/Features/TerrainBlending.h b/src/Features/TerrainBlending.h index 8f13612eb9..2be155c498 100644 --- a/src/Features/TerrainBlending.h +++ b/src/Features/TerrainBlending.h @@ -23,7 +23,6 @@ struct TerrainBlending : Feature }; virtual inline bool HasShaderDefine(RE::BSShader::Type) override { return true; } - virtual bool SupportsVR() override { return true; } struct Settings { diff --git a/src/Features/TerrainHelper.cpp b/src/Features/TerrainHelper.cpp index bcd09054e9..6bef135c62 100644 --- a/src/Features/TerrainHelper.cpp +++ b/src/Features/TerrainHelper.cpp @@ -228,8 +228,7 @@ void TerrainHelper::Load() { // Install TESObjectLAND hook early so TH is inner relative to TruePBR's PostPostLoad hook. // This ensures TH reads the vanilla material hashKey before TruePBR replaces it with a PBR material. - // This intentionally matches TruePBR's REL::RelocationID(18368, 18791), so no extra - // VR gate is needed unless those offsets diverge. + // This intentionally matches TruePBR's REL::RelocationID(18368, 18791). logger::info("[Terrain Helper] Hooking TESObjectLAND"); stl::detour_thunk(REL::RelocationID(18368, 18791)); } diff --git a/src/Features/TerrainHelper.h b/src/Features/TerrainHelper.h index c477a27ce0..796c1628da 100644 --- a/src/Features/TerrainHelper.h +++ b/src/Features/TerrainHelper.h @@ -39,7 +39,6 @@ struct TerrainHelper : Feature virtual void Load() override; virtual void DataLoaded() override; virtual void PostPostLoad() override; - virtual bool SupportsVR() override { return true; }; virtual std::string GetFeatureModLink() override { return MakeNexusModURL(MOD_ID); } void SetShaderResources(ID3D11DeviceContext* a_context); diff --git a/src/Features/TerrainShadows.h b/src/Features/TerrainShadows.h index 3d824de82c..dd79a56f23 100644 --- a/src/Features/TerrainShadows.h +++ b/src/Features/TerrainShadows.h @@ -91,6 +91,5 @@ struct TerrainShadows : public Feature virtual inline void RestoreDefaultSettings() override { settings = {}; } virtual void ClearShaderCache() override; - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; }; \ No newline at end of file diff --git a/src/Features/TerrainVariation.h b/src/Features/TerrainVariation.h index 83bf3385f1..66dc538276 100644 --- a/src/Features/TerrainVariation.h +++ b/src/Features/TerrainVariation.h @@ -16,7 +16,6 @@ struct TerrainVariation : Feature return (shaderType == RE::BSShader::Type::Lighting); } virtual bool IsCore() const override { return false; }; - virtual bool SupportsVR() override { return true; } virtual std::string_view GetCategory() const override { return FeatureCategories::kLandscapeAndTextures; } virtual std::pair> GetFeatureSummary() override diff --git a/src/Features/UnifiedWater.h b/src/Features/UnifiedWater.h index 0de2594480..9ae1f05259 100644 --- a/src/Features/UnifiedWater.h +++ b/src/Features/UnifiedWater.h @@ -106,7 +106,6 @@ struct UnifiedWater : OverlayFeature virtual bool IsCore() const override { return true; } virtual bool IsDisabledByDefault() const override { return true; } - virtual bool SupportsVR() override { return true; } virtual void PostPostLoad() override; diff --git a/src/Features/Upscaling.cpp b/src/Features/Upscaling.cpp index 649b1af626..11df01b9ed 100644 --- a/src/Features/Upscaling.cpp +++ b/src/Features/Upscaling.cpp @@ -84,7 +84,7 @@ HRESULT WINAPI hk_D3D11CreateDeviceAndSwapChainUpscaling( pSwapChainDesc->BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; } - bool shouldProxy = !globals::game::isVR; + bool shouldProxy = true; if (shouldProxy) if (!pSwapChainDesc->Windowed) shouldProxy = false; @@ -218,8 +218,8 @@ void Upscaling::DrawSettings() // Check the current upscale method auto upscaleMethod = GetUpscaleMethod(); - // Display warning for DLSS resolution limits (non-VR only; VR handles this automatically) - if (!globals::game::isVR && upscaleMethod == UpscaleMethod::kDLSS) { + // Display warning for DLSS resolution limits + if (upscaleMethod == UpscaleMethod::kDLSS) { auto screenSize = globals::state->screenSize; if (screenSize.x > streamline.MAX_RESOLUTION || screenSize.y > streamline.MAX_RESOLUTION) { Util::Text::Warning("Warning: Requested resolution %.0f x %.0f exceeds maximum supported resolution %d x %d for DLSS.", @@ -293,73 +293,71 @@ void Upscaling::DrawSettings() const bool frameGenerationDx12PathActive = IsFrameGenerationDx12PathActive(); - if (!globals::game::isVR) { - if (ImGui::TreeNodeEx(T(TKEY("frame_generation"), "Frame Generation"), ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::Text("%s", T(TKEY("frame_generation_desc"), - "Frame Generation interpolates real frames with generated ones for a smoother experience")); - ImGui::Text("%s", T(TKEY("frame_generation_tech"), - "Uses AMD FSR Frame Generation technology")); - if (HasFrameGenModule()) - ImGui::Text("%s", T(TKEY("frame_generation_available"), - "AMD FSR Frame Generation is available.")); - ImGui::Text("%s", T(TKEY("frame_generation_proxy_note"), - "Requires a D3D11 to D3D12 proxy which can create compatibility issues")); - ImGui::Text("%s", T(TKEY("frame_generation_restart_note"), - "Toggling this setting requires a restart to work correctly")); - - bool onlyRequiresRestart = true; - - if (!isWindowed) { - Util::Text::Warning("Warning: Requires windowed mode"); - - onlyRequiresRestart = false; - } + if (ImGui::TreeNodeEx(T(TKEY("frame_generation"), "Frame Generation"), ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::Text("%s", T(TKEY("frame_generation_desc"), + "Frame Generation interpolates real frames with generated ones for a smoother experience")); + ImGui::Text("%s", T(TKEY("frame_generation_tech"), + "Uses AMD FSR Frame Generation technology")); + if (HasFrameGenModule()) + ImGui::Text("%s", T(TKEY("frame_generation_available"), + "AMD FSR Frame Generation is available.")); + ImGui::Text("%s", T(TKEY("frame_generation_proxy_note"), + "Requires a D3D11 to D3D12 proxy which can create compatibility issues")); + ImGui::Text("%s", T(TKEY("frame_generation_restart_note"), + "Toggling this setting requires a restart to work correctly")); + + bool onlyRequiresRestart = true; + + if (!isWindowed) { + Util::Text::Warning("Warning: Requires windowed mode"); + + onlyRequiresRestart = false; + } - if (lowRefreshRate && !settings.frameGenerationForceEnable) { - Util::Text::Warning("Warning: Requires a high refresh rate monitor or Force Enable Frame Generation"); + if (lowRefreshRate && !settings.frameGenerationForceEnable) { + Util::Text::Warning("Warning: Requires a high refresh rate monitor or Force Enable Frame Generation"); - onlyRequiresRestart = false; - } + onlyRequiresRestart = false; + } - if (fidelityFXMissing) { - Util::Text::Warning("Warning: FidelityFX DLLs are not loaded"); + if (fidelityFXMissing) { + Util::Text::Warning("Warning: FidelityFX DLLs are not loaded"); - onlyRequiresRestart = false; - } + onlyRequiresRestart = false; + } - if (onlyRequiresRestart && settings.frameGenerationMode && !frameGenerationDx12PathActive) - Util::Text::Warning("Warning: Requires restart"); + if (onlyRequiresRestart && settings.frameGenerationMode && !frameGenerationDx12PathActive) + Util::Text::Warning("Warning: Requires restart"); - if (!settings.frameGenerationMode && frameGenerationDx12PathActive) - Util::Text::Warning("Warning: Requires restart"); + if (!settings.frameGenerationMode && frameGenerationDx12PathActive) + Util::Text::Warning("Warning: Requires restart"); - bool fgEnabled = settings.frameGenerationMode != 0; - if (ImGui::Checkbox(T(TKEY("frame_generation"), "Frame Generation"), &fgEnabled)) - settings.frameGenerationMode = fgEnabled ? 1 : 0; + bool fgEnabled = settings.frameGenerationMode != 0; + if (ImGui::Checkbox(T(TKEY("frame_generation"), "Frame Generation"), &fgEnabled)) + settings.frameGenerationMode = fgEnabled ? 1 : 0; - if (!frameGenerationDx12PathActive) - ImGui::BeginDisabled(); + if (!frameGenerationDx12PathActive) + ImGui::BeginDisabled(); - bool flEnabled = settings.frameLimitMode != 0; - if (ImGui::Checkbox(T(TKEY("frame_limit_vrr"), "Frame Limit (Variable Refresh Rate)"), &flEnabled)) - settings.frameLimitMode = flEnabled ? 1 : 0; + bool flEnabled = settings.frameLimitMode != 0; + if (ImGui::Checkbox(T(TKEY("frame_limit_vrr"), "Frame Limit (Variable Refresh Rate)"), &flEnabled)) + settings.frameLimitMode = flEnabled ? 1 : 0; - if (!frameGenerationDx12PathActive) - ImGui::EndDisabled(); + if (!frameGenerationDx12PathActive) + ImGui::EndDisabled(); - ImGui::TextWrapped("Allows frame generation to function on low refresh rate monitors. Detected: %.2f Hz", refreshRate); - bool fgForce = settings.frameGenerationForceEnable != 0; - if (ImGui::Checkbox(T(TKEY("force_enable_frame_generation"), "Force Enable Frame Generation"), &fgForce)) - settings.frameGenerationForceEnable = fgForce ? 1 : 0; + ImGui::TextWrapped("Allows frame generation to function on low refresh rate monitors. Detected: %.2f Hz", refreshRate); + bool fgForce = settings.frameGenerationForceEnable != 0; + if (ImGui::Checkbox(T(TKEY("force_enable_frame_generation"), "Force Enable Frame Generation"), &fgForce)) + settings.frameGenerationForceEnable = fgForce ? 1 : 0; - ImGui::Checkbox(T(TKEY("frame_generation_in_menus"), "Frame Generation in Menus"), &settings.frameGenerationAllowInMenus); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::TextUnformatted(T(TKEY("frame_generation_in_menus_tooltip_1"), "Keeps frame generation active while game menus are open.")); - ImGui::TextUnformatted(T(TKEY("frame_generation_in_menus_tooltip_2"), "May feel smoother, but increases menu input latency.")); - } - - ImGui::TreePop(); + ImGui::Checkbox(T(TKEY("frame_generation_in_menus"), "Frame Generation in Menus"), &settings.frameGenerationAllowInMenus); + if (auto _tt = Util::HoverTooltipWrapper()) { + ImGui::TextUnformatted(T(TKEY("frame_generation_in_menus_tooltip_1"), "Keeps frame generation active while game menus are open.")); + ImGui::TextUnformatted(T(TKEY("frame_generation_in_menus_tooltip_2"), "May feel smoother, but increases menu input latency.")); } + + ImGui::TreePop(); } if (streamline.reflexSupportedOnCurrentAdapter && ImGui::TreeNodeEx(T(TKEY("nvidia_reflex"), "NVIDIA Reflex"), ImGuiTreeNodeFlags_DefaultOpen)) { @@ -451,68 +449,6 @@ void Upscaling::DrawSettings() ImGui::Text("%s", T(TKEY("streamline_logging_tooltip"), "Streamline logging controls the verbosity of NVIDIA Streamline backend logs. Useful for debugging issues with DLSS/DLSS-G.")); } - // VR Debug visualization -- per-eye buffers and native inputs - if (globals::game::isVR) { - ImGui::Separator(); - static float debugRescale = 0.15f; - ImGui::SliderFloat(T(TKEY("view_resize"), "View Resize"), &debugRescale, 0.05f, 1.f); - - if (ImGui::TreeNode(T(TKEY("upscaling_intermediates"), "Upscaling Intermediates"))) { - if (vrIntermediateMotionVectors[0]) { - bool isDLSS = GetUpscaleMethod() == UpscaleMethod::kDLSS; - if (vrIntermediateColorIn[0] && vrIntermediateColorOut[0]) { - BUFFER_VIEWER_NODE_TITLE(vrIntermediateColorIn[0], "Left Eye In", debugRescale) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateColorIn[1], "Right Eye In", debugRescale) - if (!isDLSS) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateColorOut[0], "Left Eye Out", debugRescale) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateColorOut[1], "Right Eye Out", debugRescale) - } - BUFFER_VIEWER_NODE_TITLE(vrIntermediateMotionVectors[0], "Left Eye MVec", debugRescale) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateMotionVectors[1], "Right Eye MVec", debugRescale) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateReactiveMask[0], "Left Eye Reactive", debugRescale) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateReactiveMask[1], "Right Eye Reactive", debugRescale) - if (vrIntermediateTransparencyMask[0]) { - BUFFER_VIEWER_NODE_TITLE(vrIntermediateTransparencyMask[0], "Left Eye Transparency", debugRescale) - BUFFER_VIEWER_NODE_TITLE(vrIntermediateTransparencyMask[1], "Right Eye Transparency", debugRescale) - } - } else { - ImGui::TextDisabled("%s", T(TKEY("vr_intermediates_not_created"), "VR intermediates not yet created (enter game world)")); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode(T(TKEY("native_inputs"), "Native Inputs"))) { - auto renderer = globals::game::renderer; - auto& main = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN]; - auto& mvec = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMOTION_VECTOR]; - auto& depth = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - - auto DisplayRT = [&](const char* label, ID3D11Texture2D* tex, ID3D11ShaderResourceView* srv) { - if (srv && tex) { - D3D11_TEXTURE2D_DESC desc; - tex->GetDesc(&desc); - char buf[128]; - snprintf(buf, sizeof(buf), "%s (%ux%u)", label, desc.Width, desc.Height); - if (ImGui::TreeNode(buf)) { - ImGui::Image(srv, { desc.Width * debugRescale, desc.Height * debugRescale }); - ImGui::TreePop(); - } - } - }; - - DisplayRT("kMAIN (Color Input)", (ID3D11Texture2D*)main.texture, (ID3D11ShaderResourceView*)main.SRV); - DisplayRT("Motion Vectors", (ID3D11Texture2D*)mvec.texture, (ID3D11ShaderResourceView*)mvec.SRV); - DisplayRT("Depth", depth.texture, depth.depthSRV); - - if (reactiveMaskTexture) - BUFFER_VIEWER_NODE_TITLE(reactiveMaskTexture, "Reactive Mask", debugRescale) - if (transparencyCompositionMaskTexture) - BUFFER_VIEWER_NODE_TITLE(transparencyCompositionMaskTexture, "Transparency Mask", debugRescale) - - ImGui::TreePop(); - } - } - ImGui::Separator(); Util::DrawDllVersionTable("AMD FidelityFX DLLs (click to open folder)", FidelityFX::PluginDir, FidelityFX::dllVersions, "ffx_dll_versions"); Util::DrawDllVersionTable("NVIDIA Streamline DLLs (click to open folder)", Streamline::PluginDir, Streamline::dllVersions, "sl_dll_versions"); @@ -589,31 +525,6 @@ void Upscaling::DataLoaded() static auto fDRClampOffset = RE::GetINISetting("fDRClampOffset:Display"); fDRClampOffset->data.f = 0.0f; - // VR + DLSS workaround: rebuild the DLSS feature on cell/worldspace transitions to - // clear a persistent post-load GPU-time regression (see pendingDLSSReset comment). - if (globals::game::isVR) - MenuOpenCloseEventHandler::Register(); -} - -RE::BSEventNotifyControl Upscaling::MenuOpenCloseEventHandler::ProcessEvent( - const RE::MenuOpenCloseEvent* a_event, RE::BSTEventSource*) -{ - if (a_event && a_event->menuName == RE::LoadingMenu::MENU_NAME && !a_event->opening) - globals::features::upscaling.pendingDLSSReset.store(true, std::memory_order_relaxed); - return RE::BSEventNotifyControl::kContinue; -} - -bool Upscaling::MenuOpenCloseEventHandler::Register() -{ - static MenuOpenCloseEventHandler singleton; - auto ui = globals::game::ui; - if (!ui) { - logger::error("[Upscaling] UI event source not found; DLSS reset-on-load disabled"); - return false; - } - ui->GetEventSource()->AddEventSink(&singleton); - logger::info("[Upscaling] Registered MenuOpenCloseEventHandler for DLSS reset-on-load"); - return true; } void Upscaling::Load() @@ -648,9 +559,7 @@ void Upscaling::PostPostLoad() stl::write_thunk_call(REL::RelocationID(100430, 107148).address() + REL::Relocate(0x1F0, 0x1E7, 0x206)); // Patches RSSetScissorRect calls to use dynamic resolution - // This is a PC-specific function hence it was missing - if (!globals::game::isVR) - stl::detour_thunk(REL::RelocationID(75564, 77365)); + stl::detour_thunk(REL::RelocationID(75564, 77365)); // Patches facegen texture generation to not use dynamic resolution stl::detour_thunk(REL::RelocationID(26455, 27041)); @@ -817,18 +726,6 @@ void Upscaling::CheckResources(UpscaleMethod a_upscalemethod) streamline.DestroyDLSSResources(); else if (previousUpscaleMode == UpscaleMethod::kFSR) fidelityFX.DestroyFSRResources(); - - if (globals::game::isVR) { - for (int i = 0; i < 2; i++) { - vrIntermediateColorIn[i].reset(); - vrIntermediateColorOut[i].reset(); - vrIntermediateLinearDepth[i].reset(); - vrIntermediateMotionVectors[i].reset(); - vrIntermediateReactiveMask[i].reset(); - vrIntermediateTransparencyMask[i].reset(); - } - vrIntermediateDepth.reset(); - } } if (a_upscalemethod == UpscaleMethod::kFSR) fidelityFX.CreateFSRResources(); @@ -851,20 +748,6 @@ ID3D11ComputeShader* Upscaling::GetEncodeTexturesCS() auto upscaleMethod = GetUpscaleMethod(); uint methodIndex = (uint)upscaleMethod; - // VR FSR needs a separate variant: DEPTH_OUTPUT converts the R24G8_TYPELESS game depth to - // R32_FLOAT so GetFfxResourceDescriptionDX11() returns a valid format instead of UNKNOWN. - if (globals::game::isVR && upscaleMethod == UpscaleMethod::kFSR) { - if (!encodeTexturesCSDepthOutput) { - logger::debug("Compiling EncodeTexturesCS.hlsl for VR FSR (FSR + DEPTH_OUTPUT)"); - std::vector> defines = { - { "FSR", "" }, - { "DEPTH_OUTPUT", "" } - }; - encodeTexturesCSDepthOutput.attach((ID3D11ComputeShader*)Util::CompileShader(L"Data/Shaders/Upscaling/EncodeTexturesCS.hlsl", defines, "cs_5_0")); - } - return encodeTexturesCSDepthOutput.get(); - } - if (!encodeTexturesCS[methodIndex]) { logger::debug("Compiling EncodeTexturesCS.hlsl for upscale method {}", methodIndex); @@ -904,8 +787,6 @@ ID3D11PixelShader* Upscaling::GetUnderwaterMaskUpscalePS() if (!underwaterMaskUpscalePS) { logger::debug("Compiling UnderwaterMaskPS.hlsl"); std::vector> defines = { { "PSHADER", "" } }; - if (globals::game::isVR) - defines.push_back({ "VR", "" }); underwaterMaskUpscalePS.attach((ID3D11PixelShader*)Util::CompileShader(L"Data/Shaders/Upscaling/UnderwaterMaskUpscalePS.hlsl", defines, "ps_5_0")); } @@ -962,236 +843,6 @@ eastl::unique_ptr Upscaling::CreateTextureFromSource(ID3D11Resource* return tex; } -void Upscaling::CreateVRIntermediateTextures(uint32_t inWidth, uint32_t inHeight, uint32_t outWidth, uint32_t outHeight, - ID3D11Resource* colorSrc, ID3D11Resource* mvecSrc, ID3D11Resource* reactiveSrc, ID3D11Resource* transparencySrc) -{ - // Right-eye-only depth intermediate for DLSS. Streamline.Upscale copies the right-eye depth - // slice here before evaluating DLSS eye 1; eye 0 reads the combined stereo depth directly at - // zero offset. R24G8_TYPELESS matches the game's D24S8_TYPELESS cast group — R32_TYPELESS is - // a different cast group and produces silent zero-copy failures. - { - D3D11_TEXTURE2D_DESC depthDesc = {}; - depthDesc.Width = inWidth; - depthDesc.Height = inHeight; - depthDesc.MipLevels = 1; - depthDesc.ArraySize = 1; - depthDesc.Format = DXGI_FORMAT_R24G8_TYPELESS; - depthDesc.SampleDesc.Count = 1; - depthDesc.Usage = D3D11_USAGE_DEFAULT; - depthDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - vrIntermediateDepth = eastl::make_unique(depthDesc); - - Util::SetResourceName(vrIntermediateDepth->resource.get(), "Upscale_Depth_Right"); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - vrIntermediateDepth->CreateSRV(srvDesc); - } - - // All buffers are per-eye: Streamline validates all extents against the input color texture - // dimensions, so every tagged resource must be isolated per-eye at {0,0}. - for (int i = 0; i < 2; i++) { - std::string suffix = (i == 0) ? "Left" : "Right"; - - vrIntermediateColorIn[i] = CreateTextureFromSource(colorSrc, inWidth, inHeight, false, true, true, ("Upscale_ColorIn_" + suffix).c_str()); - vrIntermediateColorOut[i] = CreateTextureFromSource(colorSrc, outWidth, outHeight, false, true, false, ("Upscale_ColorOut_" + suffix).c_str()); - - // Linear depth: R32_FLOAT so FSR's GetFfxResourceDescriptionDX11() returns a valid format. - // EncodeTexturesCS writes the non-linear depth as R32_FLOAT for FSR. Kept separate from - // vrIntermediateDepth (R24G8_TYPELESS) which Streamline copies into for DLSS right eye. - { - D3D11_TEXTURE2D_DESC ldDesc = {}; - ldDesc.Width = inWidth; - ldDesc.Height = inHeight; - ldDesc.MipLevels = 1; - ldDesc.ArraySize = 1; - ldDesc.Format = DXGI_FORMAT_R32_FLOAT; - ldDesc.SampleDesc.Count = 1; - ldDesc.Usage = D3D11_USAGE_DEFAULT; - ldDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; - vrIntermediateLinearDepth[i] = eastl::make_unique(ldDesc); - - Util::SetResourceName(vrIntermediateLinearDepth[i]->resource.get(), ("Upscale_LinearDepth_" + suffix).c_str()); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc2 = {}; - srvDesc2.Format = DXGI_FORMAT_R32_FLOAT; - srvDesc2.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc2.Texture2D.MipLevels = 1; - vrIntermediateLinearDepth[i]->CreateSRV(srvDesc2); - - D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc2 = {}; - uavDesc2.Format = DXGI_FORMAT_R32_FLOAT; - uavDesc2.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; - uavDesc2.Texture2D.MipSlice = 0; - vrIntermediateLinearDepth[i]->CreateUAV(uavDesc2); - } - - // UAV required: EncodeTexturesCS writes directly into these per-eye buffers - vrIntermediateMotionVectors[i] = CreateTextureFromSource(mvecSrc, inWidth, inHeight, false, true, true, ("Upscale_MVec_" + suffix).c_str()); - vrIntermediateReactiveMask[i] = CreateTextureFromSource(reactiveSrc, inWidth, inHeight, false, true, true, ("Upscale_Reactive_" + suffix).c_str()); - vrIntermediateTransparencyMask[i] = CreateTextureFromSource(transparencySrc, inWidth, inHeight, false, true, true, ("Upscale_Transparency_" + suffix).c_str()); - } - - logger::info("[Upscaling] Created VR intermediate textures: per-eye in {}x{}, out {}x{}", - inWidth, inHeight, outWidth, outHeight); -} - -void Upscaling::EnsureVRIntermediateTextures() -{ - auto renderer = globals::game::renderer; - auto& main = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN]; - auto& motionVectorRT = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMOTION_VECTOR]; - - auto screenSize = globals::state->screenSize; - auto renderSize = Util::ConvertToDynamic(screenSize); - - uint32_t eyeWidthOut = (uint32_t)(screenSize.x / 2); - uint32_t eyeHeightOut = (uint32_t)screenSize.y; - uint32_t eyeWidthIn = (uint32_t)(renderSize.x / 2); - uint32_t eyeHeightIn = (uint32_t)renderSize.y; - - bool needsRecreate = !vrIntermediateColorIn[0] || !vrIntermediateColorOut[0] || !vrIntermediateLinearDepth[0]; - if (!needsRecreate) { - needsRecreate = (vrIntermediateColorIn[0]->desc.Width != eyeWidthIn || - vrIntermediateColorIn[0]->desc.Height != eyeHeightIn || - vrIntermediateColorOut[0]->desc.Width != eyeWidthOut || - vrIntermediateColorOut[0]->desc.Height != eyeHeightOut); - } - if (needsRecreate) { - logger::info("[Upscaling] (Re)creating VR intermediates: per-eye in {}x{}, out {}x{}", - eyeWidthIn, eyeHeightIn, eyeWidthOut, eyeHeightOut); - CreateVRIntermediateTextures(eyeWidthIn, eyeHeightIn, eyeWidthOut, eyeHeightOut, - main.texture, motionVectorRT.texture, - reactiveMaskTexture->resource.get(), transparencyCompositionMaskTexture->resource.get()); - } -} - -void Upscaling::PreparePerEyeInputs(ID3D11Resource* colorSrc) -{ - if (!globals::game::isVR) - return; - - auto state = globals::state; - if (state->frameAnnotations) - state->BeginPerfEvent("VR Upscaling Prepare"); - - auto context = globals::d3d::context; - auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); - - uint32_t eyeWidthIn = (uint32_t)(renderSize.x / 2); - uint32_t eyeHeightIn = (uint32_t)renderSize.y; - - // Textures guaranteed to exist: EnsureVRIntermediateTextures() was called in Upscale() - // Read the original game depth SRV for ClearHMDMask — the combined stereo buffer is - // definitively valid here, whereas the per-eye copy may silently produce zeros on some - // depth-stencil format / driver combinations. - auto& depthTexture = globals::game::renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - auto& motionVectorRT = globals::game::renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMOTION_VECTOR]; - - for (uint32_t i = 0; i < 2; ++i) { - uint32_t offsetXIn = (i == 1) ? eyeWidthIn : 0; - D3D11_BOX srcBox = { offsetXIn, 0, 0, offsetXIn + eyeWidthIn, eyeHeightIn, 1 }; - - context->CopySubresourceRegion(vrIntermediateColorIn[i]->resource.get(), 0, 0, 0, 0, colorSrc, 0, &srcBox); - context->CopySubresourceRegion(vrIntermediateMotionVectors[i]->resource.get(), 0, 0, 0, 0, motionVectorRT.texture, 0, &srcBox); - - uint32_t depthOffset = (i == 1) ? eyeWidthIn : 0; - ClearHMDMask(vrIntermediateColorIn[i]->uav.get(), depthTexture.depthSRV, - eyeWidthIn, eyeHeightIn, depthOffset, 0); - } - - if (state->frameAnnotations) - state->EndPerfEvent(); -} - -void Upscaling::FinalizePerEyeOutputs(ID3D11Resource* colorDst) -{ - ZoneScoped; - TracyD3D11Zone(globals::state->tracyCtx, "VR Upscaling - Finalize Per Eye"); - - if (!globals::game::isVR) - return; - - auto state = globals::state; - if (state->frameAnnotations) - state->BeginPerfEvent("VR Upscaling Finalize"); - - auto context = globals::d3d::context; - auto screenSize = state->screenSize; - - uint32_t eyeWidthOut = (uint32_t)(screenSize.x / 2); - uint32_t eyeHeightOut = (uint32_t)screenSize.y; - - // Write upscaled outputs back - for (uint32_t i = 0; i < 2; ++i) { - uint32_t offsetXOut = (i == 1) ? eyeWidthOut : 0; - D3D11_BOX outBox = { 0, 0, 0, eyeWidthOut, eyeHeightOut, 1 }; - context->CopySubresourceRegion(colorDst, 0, offsetXOut, 0, 0, vrIntermediateColorOut[i]->resource.get(), 0, &outBox); - } - - if (state->frameAnnotations) - state->EndPerfEvent(); -} - -void Upscaling::ClearHMDMask(ID3D11UnorderedAccessView* colorUAV, ID3D11ShaderResourceView* depthSRV, - uint32_t eyeWidth, uint32_t eyeHeight, uint32_t depthOffsetX, uint32_t colorOffsetX) -{ - if (!globals::game::isVR) - return; - - auto context = globals::d3d::context; - - if (!vrClearHMDMaskCS) { - vrClearHMDMaskCS.attach((ID3D11ComputeShader*)Util::CompileShader(L"Data/Shaders/Upscaling/ClearHMDMaskCS.hlsl", {}, "cs_5_0")); - - D3D11_BUFFER_DESC cbDesc = {}; - cbDesc.ByteWidth = 16; // 4 uints - cbDesc.Usage = D3D11_USAGE_DYNAMIC; - cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - DX::ThrowIfFailed(globals::d3d::device->CreateBuffer(&cbDesc, nullptr, vrClearHMDMaskCB.put())); - } - - if (vrClearHMDMaskCS) { - auto dispatchX = (eyeWidth + 7) / 8; - auto dispatchY = (eyeHeight + 7) / 8; - - context->CSSetShader(vrClearHMDMaskCS.get(), nullptr, 0); - - ID3D11ShaderResourceView* srvs[1] = { depthSRV }; - context->CSSetShaderResources(0, 1, srvs); - - ID3D11UnorderedAccessView* uavs[1] = { colorUAV }; - context->CSSetUnorderedAccessViews(0, 1, uavs, nullptr); - - D3D11_MAPPED_SUBRESOURCE mapped{}; - context->Map(vrClearHMDMaskCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); - - uint32_t offsets[4] = { depthOffsetX, colorOffsetX, 0, 0 }; - - memcpy(mapped.pData, offsets, sizeof(offsets)); - context->Unmap(vrClearHMDMaskCB.get(), 0); - - ID3D11Buffer* cbs[1] = { vrClearHMDMaskCB.get() }; - context->CSSetConstantBuffers(0, 1, cbs); - - globals::profiler->BeginPass("Upscaling::ClearHMDMask"); - context->Dispatch(dispatchX, dispatchY, 1); - globals::profiler->EndPass(); - - // Unbind - ID3D11ShaderResourceView* nullSRV[1] = { nullptr }; - ID3D11UnorderedAccessView* nullUAV[1] = { nullptr }; - ID3D11Buffer* nullCB[1] = { nullptr }; - context->CSSetShaderResources(0, 1, nullSRV); - context->CSSetUnorderedAccessViews(0, 1, nullUAV, nullptr); - context->CSSetConstantBuffers(0, 1, nullCB); - context->CSSetShader(nullptr, nullptr, 0); - } -} - int32_t GetJitterPhaseCount(int32_t renderWidth, int32_t displayWidth) { const float basePhaseCount = 8.0f; @@ -1264,19 +915,13 @@ void Upscaling::ConfigureUpscaling(RE::BSGraphics::State* a_viewport) GetJitterOffset(&jitter.x, &jitter.y, state->frameCount, phaseCount); - if (globals::game::isVR) - a_viewport->projectionPosScaleX = -jitter.x / renderWidth; - else - a_viewport->projectionPosScaleX = -2.0f * jitter.x / renderWidth; + a_viewport->projectionPosScaleX = -2.0f * jitter.x / renderWidth; a_viewport->projectionPosScaleY = 2.0f * jitter.y / renderHeight; } else { resolutionScale = { 1.0f, 1.0f }; - if (globals::game::isVR) - jitter.x = -a_viewport->projectionPosScaleX * screenWidth; - else - jitter.x = -a_viewport->projectionPosScaleX * screenWidth / 2.0f; + jitter.x = -a_viewport->projectionPosScaleX * screenWidth / 2.0f; jitter.y = a_viewport->projectionPosScaleY * screenHeight / 2.0f; } @@ -1292,8 +937,7 @@ void Upscaling::ConfigureUpscaling(RE::BSGraphics::State* a_viewport) dynamicResolutionHeightRatio = resolutionScale.y; // Disable dynamic resolution unless the game explicitly enables it - if (!globals::game::isVR) - runtimeData.dynamicResolutionLock = 1; + runtimeData.dynamicResolutionLock = 1; } void Upscaling::SetupResources() @@ -1322,25 +966,7 @@ void Upscaling::SetupResources() depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; // Write to all depth bits depthStencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS; // Always pass depth test (write all depths) - if (globals::game::isVR) { - depthStencilDesc.StencilEnable = true; // Enable stencil testing - depthStencilDesc.StencilReadMask = 0xFF; // Read all stencil bits - depthStencilDesc.StencilWriteMask = 0xFF; // Write to all stencil bits - - // Configure front-facing stencil operations - depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; // Replace on stencil fail - depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; // Replace on depth fail - depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_REPLACE; // Replace on pass - depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; // Always pass stencil test - - // Configure back-facing stencil operations (same as front) - depthStencilDesc.BackFace.StencilFailOp = depthStencilDesc.FrontFace.StencilFailOp; - depthStencilDesc.BackFace.StencilDepthFailOp = depthStencilDesc.FrontFace.StencilDepthFailOp; - depthStencilDesc.BackFace.StencilPassOp = depthStencilDesc.FrontFace.StencilPassOp; - depthStencilDesc.BackFace.StencilFunc = depthStencilDesc.FrontFace.StencilFunc; - } else { - depthStencilDesc.StencilEnable = false; // Disable stencil testing - } + depthStencilDesc.StencilEnable = false; // Disable stencil testing DX::ThrowIfFailed(globals::d3d::device->CreateDepthStencilState(&depthStencilDesc, upscaleDepthStencilState.put())); @@ -1392,7 +1018,6 @@ void Upscaling::ClearShaderCache() for (int i = 0; i < 5; ++i) { encodeTexturesCS[i] = nullptr; // com_ptr automatically releases } - encodeTexturesCSDepthOutput = nullptr; depthRefractionUpscalePS = nullptr; // com_ptr automatically releases underwaterMaskUpscalePS = nullptr; // com_ptr automatically releases @@ -1594,7 +1219,7 @@ double Upscaling::GetRefreshRate(HWND a_window) bool Upscaling::IsFrameGenerationDx12PathActive() const { - return d3d12SwapChainActive && !globals::game::isVR; + return d3d12SwapChainActive; } bool Upscaling::IsFrameGenerationActive() const @@ -1754,16 +1379,11 @@ void Upscaling::Upscale() auto& normals = renderer->GetRuntimeData().renderTargets[globals::deferred->forwardRenderTargets[2]]; auto& depth = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - // VR: ensure per-eye intermediate textures exist before the dispatch writes into them - if (globals::game::isVR) - EnsureVRIntermediateTextures(); - auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); - uint32_t numEyes = globals::game::isVR ? 2 : 1; + uint32_t numEyes = 1; uint32_t eyeRenderWidth = (uint32_t)(renderSize.x / numEyes); uint32_t eyeRenderHeight = (uint32_t)renderSize.y; - // Sources are the same combined stereo buffers for both VR and non-VR. // The shader applies EyeOffsetX to sample the correct half. ID3D11ShaderResourceView* views[4] = { temporalAAMask.SRV, normals.SRV, motionVector.SRV, depth.depthSRV }; context->CSSetShaderResources(0, ARRAYSIZE(views), views); @@ -1780,13 +1400,11 @@ void Upscaling::Upscale() context->CSSetConstantBuffers(0, 1, &upscalingBuffer); // u2 (MotionVectorOutput): DLSS only — 5x5 dilated MVec for ghosting reduction. - // u3 (DepthOutput): VR FSR only — converts R24G8_TYPELESS to R32_FLOAT so - // GetFfxResourceDescriptionDX11() returns a valid format. DLSS depth is copied in Streamline.cpp. ID3D11UnorderedAccessView* uavs[4] = { - globals::game::isVR ? vrIntermediateReactiveMask[i]->uav.get() : reactiveMaskTexture->uav.get(), - globals::game::isVR ? vrIntermediateTransparencyMask[i]->uav.get() : transparencyCompositionMaskTexture->uav.get(), - (upscaleMethod == UpscaleMethod::kDLSS) ? (globals::game::isVR ? vrIntermediateMotionVectors[i]->uav.get() : motionVectorCopyTexture->uav.get()) : nullptr, - (upscaleMethod == UpscaleMethod::kFSR && globals::game::isVR) ? vrIntermediateLinearDepth[i]->uav.get() : nullptr + reactiveMaskTexture->uav.get(), + transparencyCompositionMaskTexture->uav.get(), + (upscaleMethod == UpscaleMethod::kDLSS) ? motionVectorCopyTexture->uav.get() : nullptr, + nullptr }; context->CSSetUnorderedAccessViews(0, ARRAYSIZE(uavs), uavs, nullptr); @@ -1815,14 +1433,6 @@ void Upscaling::Upscale() TracyD3D11Zone(globals::state->tracyCtx, "Upscaling Dispatch"); if (upscaleMethod == UpscaleMethod::kDLSS) { - // VR-only workaround: a worldspace/cell transition causes ~2-3ms persistent GPU-time - // regression in the DLSS feature that only clears on a manual mode/preset toggle. - // Mirror that toggle by tearing down the DLSS feature on LoadingMenu close — the next - // SetDLSSOptions/slEvaluateFeature call below recreates it with current per-eye extents. - if (globals::game::isVR && pendingDLSSReset.exchange(false, std::memory_order_relaxed)) { - logger::debug("[Upscaling] LoadingMenu close detected — rebuilding DLSS feature"); - streamline.DestroyDLSSResources(); - } streamline.Upscale(main.texture, reactiveMaskTexture->resource.get(), transparencyCompositionMaskTexture->resource.get(), motionVectorCopyTexture->resource.get()); } else if (upscaleMethod == UpscaleMethod::kFSR) { fidelityFX.Upscale(main.texture, reactiveMaskTexture->resource.get(), transparencyCompositionMaskTexture->resource.get(), motionVector.texture, settings.sharpnessFSR); @@ -1887,10 +1497,6 @@ void Upscaling::UpscaleDepth() !underwaterMask.texture || !underwaterMask.textureCopy || !underwaterMask.SRVCopy || !underwaterMask.RTV) { return; } - if (globals::game::isVR && (!depthCopy.views[0] || !depthCopy.stencilSRV)) { - return; - } - auto* fullscreenVS = GetUpscaleVS(); auto* depthUpscalePS = GetDepthRefractionUpscalePS(); auto* underwaterMaskPS = GetUnderwaterMaskUpscalePS(); @@ -1968,11 +1574,6 @@ void Upscaling::UpscaleDepth() // Skip alias copies to reduce unnecessary copy churn. copyIfNonAliased(depthCopy.texture, depth.texture); - // Clear stencil to be 0xFF - if (globals::game::isVR) { - context->ClearDepthStencilView(depthCopy.views[0], D3D11_CLEAR_STENCIL, 1.0f, 0xFF); - } - // Set depth stencil state to write 0x00 context->OMSetDepthStencilState(upscaleDepthStencilState.get(), 0x00); @@ -1981,10 +1582,7 @@ void Upscaling::UpscaleDepth() ID3D11ShaderResourceView* srvs[] = { refractionNormals.SRVCopy, depthCopy.depthSRV, depthCopy.stencilSRV }; context->PSSetShaderResources(0, ARRAYSIZE(srvs), srvs); - // kSAO_CAMERAZ is at quarter-stereo resolution in VR; the full-stereo viewport would - // corrupt only the top-left quarter. The engine's ISSAOCameraZ pass populates it correctly. - ID3D11RenderTargetView* rtvs[] = { refractionNormals.RTV, - globals::game::isVR ? nullptr : saoCameraZ.RTV }; + ID3D11RenderTargetView* rtvs[] = { refractionNormals.RTV, saoCameraZ.RTV }; context->OMSetRenderTargets(2, rtvs, depth.views[0]); context->PSSetShader(depthUpscalePS, nullptr, 0); @@ -2004,8 +1602,7 @@ void Upscaling::UpscaleDepth() context->OMSetDepthStencilState(nullptr, 0x00); - // t0: vanilla mask copy, t1: original depth (for VR per-eye analytical mask). - // depthCopy still holds the original pre-upscale depth here (VR re-copy deferred). + // t0: vanilla mask copy, t1: original depth. ID3D11ShaderResourceView* srvs[] = { underwaterMask.SRVCopy, depthCopy.depthSRV }; context->PSSetShaderResources(0, ARRAYSIZE(srvs), srvs); @@ -2018,12 +1615,6 @@ void Upscaling::UpscaleDepth() globals::profiler->EndPass(); } - // Now propagate the upscaled depth to kMAIN_COPY so downstream VR passes see it. - if (globals::game::isVR) { - TracyD3D11Zone(globals::state->tracyCtx, "Upscaling - Depth VR Propagate"); - copyIfNonAliased(depthCopy.texture, depth.texture); - } - ID3D11ShaderResourceView* nullPSResources[3] = { nullptr, nullptr, nullptr }; context->PSSetShaderResources(0, ARRAYSIZE(nullPSResources), nullPSResources); diff --git a/src/Features/Upscaling.h b/src/Features/Upscaling.h index 52f98ca8e1..5d9055ac26 100644 --- a/src/Features/Upscaling.h +++ b/src/Features/Upscaling.h @@ -26,7 +26,6 @@ struct Upscaling : Feature virtual std::string GetDisplayName() override { return T("feature.upscaling.name", "Upscaling"); } virtual inline std::string GetShortName() override { return "Upscaling"; } virtual inline std::string GetFeatureModLink() override { return MakeNexusModURL(MOD_ID); } - virtual inline bool SupportsVR() override { return true; } virtual inline bool IsCore() const override { return false; } virtual inline std::string_view GetCategory() const override { return FeatureCategories::kDisplay; } @@ -80,8 +79,8 @@ struct Upscaling : Feature struct UpscalingDataCB { - float2 trueSamplingDim; // per-eye render dim in VR, full render dim otherwise - uint eyeOffsetX; // X offset into stereo source buffers; 0 for non-VR / left eye + float2 trueSamplingDim; + uint eyeOffsetX; uint pad0; }; @@ -129,7 +128,7 @@ struct Upscaling : Feature void DestroyUpscalingTextureResources(UpscaleMethod a_upscalemethod); winrt::com_ptr encodeTexturesCS[5]; // One for each UpscaleMethod - winrt::com_ptr encodeTexturesCSDepthOutput; // FSR + VR: converts R24G8_TYPELESS depth to R32_FLOAT + winrt::com_ptr encodeTexturesCSDepthOutput; // converts R24G8_TYPELESS depth to R32_FLOAT ID3D11ComputeShader* GetEncodeTexturesCS(); winrt::com_ptr depthRefractionUpscalePS; @@ -145,43 +144,10 @@ struct Upscaling : Feature winrt::com_ptr upscaleBlendState; winrt::com_ptr upscaleRasterizerState; - // Shared VR HMD Mask Clearing - winrt::com_ptr vrClearHMDMaskCS; - winrt::com_ptr vrClearHMDMaskCB; - // Helper to dispatch mask clearing for a single eye region - void ClearHMDMask(ID3D11UnorderedAccessView* colorUAV, ID3D11ShaderResourceView* depthSRV, - uint32_t eyeWidth, uint32_t eyeHeight, uint32_t depthOffsetX, uint32_t colorOffsetX); - - // Shared VR Per-Eye Intermediate Buffers - // Owned here so both Streamline (DLSS) and FidelityFX (FSR) can use them. - eastl::unique_ptr vrIntermediateColorIn[2]; // per-eye render resolution - eastl::unique_ptr vrIntermediateColorOut[2]; // per-eye output resolution - eastl::unique_ptr vrIntermediateDepth; // right-eye render resolution (R24G8_TYPELESS, DLSS only) - eastl::unique_ptr vrIntermediateLinearDepth[2]; // per-eye render resolution (R32_FLOAT, for FSR) - eastl::unique_ptr vrIntermediateMotionVectors[2]; // per-eye render resolution - eastl::unique_ptr vrIntermediateReactiveMask[2]; // per-eye render resolution - eastl::unique_ptr vrIntermediateTransparencyMask[2]; // per-eye render resolution - - // Helper to create/resize per-eye buffers matching source formats - void CreateVRIntermediateTextures(uint32_t inWidth, uint32_t inHeight, uint32_t outWidth, uint32_t outHeight, - ID3D11Resource* colorSrc, ID3D11Resource* mvecSrc, ID3D11Resource* reactiveSrc, ID3D11Resource* transparencySrc); - // Helper: Create a Texture2D matching source format at a given size static eastl::unique_ptr CreateTextureFromSource(ID3D11Resource* src, uint32_t width, uint32_t height, bool copyBindFlags = false, bool createSRV = false, bool createUAV = false, const char* name = nullptr); - // Shared Pipeline Steps - - /// Ensures VR per-eye intermediate textures exist at the correct resolution. - /// Must be called before any per-eye EncodeTexturesCS dispatch or PreparePerEyeInputs. - void EnsureVRIntermediateTextures(); - - /// Splits the combined stereo color buffer into per-eye intermediates, copies raw - /// motion vectors, and clears the HMD hidden area. FSR-only. - /// Reactive/transparency masks are written by EncodeTexturesCS. - void PreparePerEyeInputs(ID3D11Resource* colorSrc); - void FinalizePerEyeOutputs(ID3D11Resource* colorDst); - void ConfigureTAA(); void ConfigureUpscaling(RE::BSGraphics::State* a_state); void Upscale(); @@ -213,9 +179,7 @@ struct Upscaling : Feature /// Set by MenuOpenCloseEventHandler when LoadingMenu closes (cell/worldspace transitions, /// initial load). Consumed at the start of Upscale() to force a one-frame DLSS feature - /// rebuild — works around a VR-only persistent ~2-3ms GPU regression after worldspace - /// loads that otherwise only clears when the user manually toggles DLSS/preset. VR+DLSS - /// only; flat has no repro and per-eye extent asymmetry doesn't apply. + /// rebuild. std::atomic pendingDLSSReset{ false }; void CopySharedD3D12Resources(); diff --git a/src/Features/Upscaling/DX12SwapChain.cpp b/src/Features/Upscaling/DX12SwapChain.cpp index 430cf3a194..2dacad0ddf 100644 --- a/src/Features/Upscaling/DX12SwapChain.cpp +++ b/src/Features/Upscaling/DX12SwapChain.cpp @@ -37,18 +37,15 @@ void DX12SwapChain::CreateSwapChain(IDXGIAdapter* adapter, DXGI_SWAP_CHAIN_DESC // Runtime format negotiation for swap chain DXGI_FORMAT attemptedFormat = DXGI_FORMAT_R10G10B10A2_UNORM; DXGI_FORMAT negotiatedFormat = DXGI_FORMAT_R10G10B10A2_UNORM; - bool isVR = REL::Module::IsVR(); bool fallbackUsed = false; - // Test R10G10B10A2 support (applies to both VR and non-VR for HDR capability) + // Test R10G10B10A2 support for HDR capability D3D12_FEATURE_DATA_FORMAT_SUPPORT formatSupport = { DXGI_FORMAT_R10G10B10A2_UNORM, D3D12_FORMAT_SUPPORT1_RENDER_TARGET, D3D12_FORMAT_SUPPORT2_NONE }; if (SUCCEEDED(d3d12Device->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &formatSupport, sizeof(formatSupport)))) { if ((formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) == 0) { logger::warn("[DX12SwapChain] R10G10B10A2_UNORM not supported as render target, falling back to R8G8B8A8_UNORM"); negotiatedFormat = DXGI_FORMAT_R8G8B8A8_UNORM; fallbackUsed = true; - } else if (isVR) { - logger::info("[DX12SwapChain] VR detected with R10G10B10A2_UNORM support, attempting HDR"); } } else { logger::warn("[DX12SwapChain] CheckFeatureSupport failed for R10G10B10A2_UNORM, falling back to R8G8B8A8_UNORM"); @@ -56,10 +53,9 @@ void DX12SwapChain::CreateSwapChain(IDXGIAdapter* adapter, DXGI_SWAP_CHAIN_DESC fallbackUsed = true; } - logger::info("[DX12SwapChain] Swap chain format negotiation: attempted={}, negotiated={}, VR={}, fallback={}", + logger::info("[DX12SwapChain] Swap chain format negotiation: attempted={}, negotiated={}, fallback={}", static_cast(attemptedFormat), static_cast(negotiatedFormat), - isVR ? "true" : "false", fallbackUsed ? "true" : "false"); swapChainDesc = {}; diff --git a/src/Features/Upscaling/FidelityFX.cpp b/src/Features/Upscaling/FidelityFX.cpp index b9976a99c7..3e202abef4 100644 --- a/src/Features/Upscaling/FidelityFX.cpp +++ b/src/Features/Upscaling/FidelityFX.cpp @@ -253,7 +253,7 @@ void FidelityFX::CreateFSRResources() auto fsrDevice = ffxGetDeviceDX11_Fsr31(globals::d3d::device); - uint32_t numContexts = globals::game::isVR ? 2 : 1; + uint32_t numContexts = 1; size_t scratchBufferSize = ffxGetScratchMemorySizeDX11(numContexts); fsrScratchBuffer = calloc(scratchBufferSize, 1); if (!fsrScratchBuffer) { @@ -273,48 +273,41 @@ void FidelityFX::CreateFSRResources() auto screenSize = state->screenSize; auto renderSize = Util::ConvertToDynamic(screenSize); - uint32_t displayWidth = (uint32_t)(globals::game::isVR ? screenSize.x / 2 : screenSize.x); + uint32_t displayWidth = (uint32_t)screenSize.x; uint32_t displayHeight = (uint32_t)screenSize.y; - uint32_t renderWidth = (uint32_t)(globals::game::isVR ? renderSize.x / 2 : renderSize.x); + uint32_t renderWidth = (uint32_t)renderSize.x; uint32_t renderHeight = (uint32_t)renderSize.y; - for (uint32_t i = 0; i < numContexts; ++i) { - FfxFsr3ContextDescription contextDescription; - contextDescription.maxRenderSize.width = renderWidth; - contextDescription.maxRenderSize.height = renderHeight; - contextDescription.maxUpscaleSize.width = displayWidth; - contextDescription.maxUpscaleSize.height = displayHeight; - contextDescription.displaySize.width = displayWidth; - contextDescription.displaySize.height = displayHeight; - contextDescription.flags = FFX_FSR3_ENABLE_UPSCALING_ONLY | FFX_FSR3_ENABLE_AUTO_EXPOSURE; - if (globals::features::hdrDisplay.loaded) { - contextDescription.flags |= FFX_FSR3_ENABLE_HIGH_DYNAMIC_RANGE; - contextDescription.backBufferFormat = FFX_SURFACE_FORMAT_R10G10B10A2_UNORM; - } else { - contextDescription.backBufferFormat = FFX_SURFACE_FORMAT_R8G8B8A8_UNORM; - } - contextDescription.backendInterfaceUpscaling = fsrInterface; - - if (ffxFsr3ContextCreate(&fsrContext[i], &contextDescription) != FFX_OK) { - logger::critical("[FidelityFX] Failed to initialize FSR3 context for eye {}!", i); - for (uint32_t j = 0; j < i; ++j) - ffxFsr3ContextDestroy(&fsrContext[j]); - free(fsrScratchBuffer); - fsrScratchBuffer = nullptr; - return; - } + FfxFsr3ContextDescription contextDescription; + contextDescription.maxRenderSize.width = renderWidth; + contextDescription.maxRenderSize.height = renderHeight; + contextDescription.maxUpscaleSize.width = displayWidth; + contextDescription.maxUpscaleSize.height = displayHeight; + contextDescription.displaySize.width = displayWidth; + contextDescription.displaySize.height = displayHeight; + contextDescription.flags = FFX_FSR3_ENABLE_UPSCALING_ONLY | FFX_FSR3_ENABLE_AUTO_EXPOSURE; + if (globals::features::hdrDisplay.loaded) { + contextDescription.flags |= FFX_FSR3_ENABLE_HIGH_DYNAMIC_RANGE; + contextDescription.backBufferFormat = FFX_SURFACE_FORMAT_R10G10B10A2_UNORM; + } else { + contextDescription.backBufferFormat = FFX_SURFACE_FORMAT_R8G8B8A8_UNORM; + } + contextDescription.backendInterfaceUpscaling = fsrInterface; + + if (ffxFsr3ContextCreate(&fsrContext[0], &contextDescription) != FFX_OK) { + logger::critical("[FidelityFX] Failed to initialize FSR3 context!"); + free(fsrScratchBuffer); + fsrScratchBuffer = nullptr; + return; } - logger::info("[FidelityFX] Created {} FSR3 contexts (Display: {}x{}, Render: {}x{})", - numContexts, displayWidth, displayHeight, renderWidth, renderHeight); + logger::info("[FidelityFX] Created FSR3 context (Display: {}x{}, Render: {}x{})", + displayWidth, displayHeight, renderWidth, renderHeight); } void FidelityFX::DestroyFSRResources() { - uint32_t numContexts = globals::game::isVR ? 2 : 1; - for (uint32_t i = 0; i < numContexts; ++i) { - if (ffxFsr3ContextDestroy(&fsrContext[i]) != FFX_OK) - logger::critical("[FidelityFX] Failed to destroy FSR3 context for eye {}!", i); - } + if (ffxFsr3ContextDestroy(&fsrContext[0]) != FFX_OK) + logger::critical("[FidelityFX] Failed to destroy FSR3 context!"); // Free the scratch buffer to prevent memory leak if (fsrScratchBuffer) { @@ -357,91 +350,48 @@ void FidelityFX::Upscale(ID3D11Resource* a_upscalingTexture, ID3D11Resource* a_r auto& upscaling = globals::features::upscaling; auto jitter = upscaling.jitter; - auto DispatchFSR = [&](uint32_t contextIndex, ID3D11Resource* r_color, ID3D11Resource* r_depth, ID3D11Resource* r_mvec, - ID3D11Resource* r_reactive, ID3D11Resource* r_trans, ID3D11Resource* r_output, - uint32_t r_width, float mv_scale_x) { - if (state->frameAnnotations) { - if (globals::game::isVR) { - char buf[32]; - snprintf(buf, sizeof(buf), "FSR Dispatch Eye %u", contextIndex); - state->BeginPerfEvent(buf); - } else { - state->BeginPerfEvent("FSR Dispatch"); - } + if (state->frameAnnotations) + state->BeginPerfEvent("FSR Dispatch"); + + FfxFsr3DispatchUpscaleDescription dispatchParameters{}; + dispatchParameters.commandList = ffxGetCommandListDX11(context); + dispatchParameters.color = ffxGetResource(a_upscalingTexture, L"FSR3_Input_OutputColor"); + dispatchParameters.depth = ffxGetResource(depthTexture.texture, L"FSR3_InputDepth"); + dispatchParameters.motionVectors = ffxGetResource(a_motionVectors, L"FSR3_InputMotionVectors"); + dispatchParameters.exposure = ffxGetResource(nullptr, L"FSR3_InputExposure"); + dispatchParameters.upscaleOutput = ffxGetResource(a_upscalingTexture, L"FSR3_OutputColor"); + dispatchParameters.reactive = ffxGetResource(a_reactiveMask, L"FSR3_InputReactiveMap"); + dispatchParameters.transparencyAndComposition = ffxGetResource(a_transparencyCompositionMask, L"FSR3_TransparencyAndCompositionMap"); + + dispatchParameters.motionVectorScale.x = renderSize.x; + dispatchParameters.motionVectorScale.y = renderSize.y; + dispatchParameters.renderSize.width = (uint)renderSize.x; + dispatchParameters.renderSize.height = (uint)renderSize.y; + + dispatchParameters.jitterOffset.x = -jitter.x; + dispatchParameters.jitterOffset.y = -jitter.y; + + dispatchParameters.frameTimeDelta = *globals::game::deltaTime * 1000.f; + dispatchParameters.cameraFar = *globals::game::cameraFar; + dispatchParameters.cameraNear = *globals::game::cameraNear; + dispatchParameters.enableSharpening = true; + dispatchParameters.sharpness = a_sharpness; + dispatchParameters.cameraFovAngleVertical = Util::GetVerticalFOVRad(); + dispatchParameters.viewSpaceToMetersFactor = 0.01428222656f; + dispatchParameters.reset = false; + dispatchParameters.preExposure = 1.0f; + dispatchParameters.flags = 0; + + __try { + if (ffxFsr3ContextDispatchUpscale(&fsrContext[0], &dispatchParameters) != FFX_OK) + logger::critical("[FidelityFX] Failed to dispatch upscaling!"); + } __except (EXCEPTION_EXECUTE_HANDLER) { + if (!fsrDispatchCrashLogged) { + logger::critical("[FidelityFX] FSR3 dispatch crashed - this may be caused by RenderDoc capture interfering with FSR operations. Try disabling RenderDoc capture."); + fsrDispatchCrashLogged = true; } - - FfxFsr3DispatchUpscaleDescription dispatchParameters{}; - dispatchParameters.commandList = ffxGetCommandListDX11(context); - dispatchParameters.color = ffxGetResource(r_color, L"FSR3_Input_OutputColor"); - dispatchParameters.depth = ffxGetResource(r_depth, L"FSR3_InputDepth"); - dispatchParameters.motionVectors = ffxGetResource(r_mvec, L"FSR3_InputMotionVectors"); - dispatchParameters.exposure = ffxGetResource(nullptr, L"FSR3_InputExposure"); - dispatchParameters.upscaleOutput = ffxGetResource(r_output, L"FSR3_OutputColor"); - dispatchParameters.reactive = ffxGetResource(r_reactive, L"FSR3_InputReactiveMap"); - dispatchParameters.transparencyAndComposition = ffxGetResource(r_trans, L"FSR3_TransparencyAndCompositionMap"); - - dispatchParameters.motionVectorScale.x = mv_scale_x; - dispatchParameters.motionVectorScale.y = renderSize.y; - dispatchParameters.renderSize.width = r_width; - dispatchParameters.renderSize.height = (uint)renderSize.y; - - dispatchParameters.jitterOffset.x = -jitter.x; - dispatchParameters.jitterOffset.y = -jitter.y; - - dispatchParameters.frameTimeDelta = *globals::game::deltaTime * 1000.f; - dispatchParameters.cameraFar = *globals::game::cameraFar; - dispatchParameters.cameraNear = *globals::game::cameraNear; - dispatchParameters.enableSharpening = true; - dispatchParameters.sharpness = a_sharpness; - dispatchParameters.cameraFovAngleVertical = Util::GetVerticalFOVRad(); - dispatchParameters.viewSpaceToMetersFactor = 0.01428222656f; - dispatchParameters.reset = false; - dispatchParameters.preExposure = 1.0f; - dispatchParameters.flags = 0; - - __try { - if (ffxFsr3ContextDispatchUpscale(&fsrContext[contextIndex], &dispatchParameters) != FFX_OK) - logger::critical("[FidelityFX] Failed to dispatch upscaling for eye {}!", contextIndex); - } __except (EXCEPTION_EXECUTE_HANDLER) { - if (!fsrDispatchCrashLogged) { - logger::critical("[FidelityFX] FSR3 dispatch crashed for eye {} - this may be caused by RenderDoc capture interfering with FSR operations. Try disabling RenderDoc capture.", contextIndex); - fsrDispatchCrashLogged = true; - } - } - - if (state->frameAnnotations) - state->EndPerfEvent(); - }; - - if (globals::game::isVR) { - // Prepare per-eye inputs and clear mask - upscaling.PreparePerEyeInputs(a_upscalingTexture); - - uint32_t numViews = 2; - uint32_t eyeWidth = (uint32_t)(renderSize.x / 2); - for (uint32_t i = 0; i < numViews; ++i) { - DispatchFSR(i, - upscaling.vrIntermediateColorIn[i]->resource.get(), - upscaling.vrIntermediateLinearDepth[i]->resource.get(), - upscaling.vrIntermediateMotionVectors[i]->resource.get(), - upscaling.vrIntermediateReactiveMask[i]->resource.get(), - upscaling.vrIntermediateTransparencyMask[i]->resource.get(), - upscaling.vrIntermediateColorOut[i]->resource.get(), - eyeWidth, - renderSize.x / 2.0f); - } - - // Merge outputs back to kMAIN - upscaling.FinalizePerEyeOutputs(a_upscalingTexture); - } else { - DispatchFSR(0, - a_upscalingTexture, - depthTexture.texture, - a_motionVectors, - a_reactiveMask, - a_transparencyCompositionMask, - a_upscalingTexture, // Output to same texture - (uint)renderSize.x, - renderSize.x); } + + if (state->frameAnnotations) + state->EndPerfEvent(); } \ No newline at end of file diff --git a/src/Features/Upscaling/Streamline.cpp b/src/Features/Upscaling/Streamline.cpp index d7517c679f..bd457956a2 100644 --- a/src/Features/Upscaling/Streamline.cpp +++ b/src/Features/Upscaling/Streamline.cpp @@ -319,7 +319,7 @@ bool Streamline::EnsureFrameToken() return frameToken != nullptr; } -bool Streamline::CheckFrameConstants(sl::ViewportHandle p_viewport, uint32_t eyeIndex) +bool Streamline::CheckFrameConstants(sl::ViewportHandle p_viewport) { if (!globals::features::upscaling.streamline.initialized) return false; @@ -327,50 +327,29 @@ bool Streamline::CheckFrameConstants(sl::ViewportHandle p_viewport, uint32_t eye if (!EnsureFrameToken()) return false; - // In VR, we need to set constants for each viewport/eye separately - // In non-VR, this is called once per frame auto state = globals::state; sl::Constants slConstants = {}; - // Calculate aspect ratio for the SINGLE EYE - float eyeWidth = state->screenSize.x * (globals::game::isVR ? 0.5f : 1.0f); - slConstants.cameraAspectRatio = eyeWidth / state->screenSize.y; + slConstants.cameraAspectRatio = state->screenSize.x / state->screenSize.y; slConstants.cameraFOV = Util::GetVerticalFOVRad(); slConstants.cameraNear = *globals::game::cameraNear; slConstants.cameraFar = *globals::game::cameraFar; - auto viewMatrix = globals::game::frameBufferCached.GetCameraViewInverse(eyeIndex).Transpose(); - auto cameraViewToClip = globals::game::frameBufferCached.GetCameraProjUnjittered(eyeIndex).Transpose(); + auto viewMatrix = globals::game::frameBufferCached.GetCameraViewInverse().Transpose(); + auto cameraViewToClip = globals::game::frameBufferCached.GetCameraProjUnjittered().Transpose(); slConstants.cameraMotionIncluded = sl::Boolean::eTrue; slConstants.cameraPinholeOffset = { 0.f, 0.f }; slConstants.cameraRight = { viewMatrix._11, viewMatrix._12, viewMatrix._13 }; slConstants.cameraUp = { viewMatrix._21, viewMatrix._22, viewMatrix._23 }; slConstants.cameraFwd = { viewMatrix._31, viewMatrix._32, viewMatrix._33 }; - slConstants.cameraPos = *(sl::float3*)&globals::game::frameBufferCached.GetCameraPosAdjust(eyeIndex); + slConstants.cameraPos = *(sl::float3*)&globals::game::frameBufferCached.GetCameraPosAdjust(); slConstants.cameraViewToClip = *(sl::float4x4*)&cameraViewToClip; slConstants.depthInverted = sl::Boolean::eFalse; - if (globals::game::isVR) { - // VR: compute clipToCameraView / clipToPrevClip / prevClipToClip from Skyrim's per-eye matrices. - // recalculateCameraMatrices() uses a single static prev-frame slot -- unusable for two viewports. - sl::matrixFullInvert(slConstants.clipToCameraView, slConstants.cameraViewToClip); - - auto currViewProj = globals::game::frameBufferCached.GetCameraViewProjUnjittered(eyeIndex).Transpose(); - auto prevViewProj = globals::game::frameBufferCached.GetCameraPreviousViewProjUnjittered(eyeIndex).Transpose(); - - sl::float4x4 currViewProjSL = *(sl::float4x4*)&currViewProj; - sl::float4x4 prevViewProjSL = *(sl::float4x4*)&prevViewProj; - - sl::float4x4 invCurrViewProj; - sl::matrixFullInvert(invCurrViewProj, currViewProjSL); - sl::matrixMul(slConstants.clipToPrevClip, invCurrViewProj, prevViewProjSL); - sl::matrixFullInvert(slConstants.prevClipToClip, slConstants.clipToPrevClip); - } else { - recalculateCameraMatrices(slConstants); - } + recalculateCameraMatrices(slConstants); auto& upscaling = globals::features::upscaling; auto jitter = upscaling.jitter; @@ -385,7 +364,7 @@ bool Streamline::CheckFrameConstants(sl::ViewportHandle p_viewport, uint32_t eye slConstants.motionVectorsJittered = sl::Boolean::eFalse; if (SL_FAILED(res, slSetConstants(slConstants, *frameToken, p_viewport))) { - logger::error("[Streamline] Could not set constants for eye {}", eyeIndex); + logger::error("[Streamline] Could not set constants"); return false; } @@ -445,7 +424,7 @@ void Streamline::SetDLSSOptions(sl::ViewportHandle p_viewport, uint32_t width) dlssOptions.outputWidth = width; dlssOptions.outputHeight = (uint)state->screenSize.y; - // Detect HDR from kMAIN format at runtime -- VR kMAIN may be 8-bit while SE is FP16 + // Detect HDR from kMAIN format at runtime { auto renderer = globals::game::renderer; auto& main = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN]; @@ -503,7 +482,7 @@ void Streamline::SetDLSSOptions(sl::ViewportHandle p_viewport, uint32_t width) } } -void Streamline::EvaluateDLSS(sl::ViewportHandle vp, uint32_t eyeIndex, +void Streamline::EvaluateDLSS(sl::ViewportHandle vp, ID3D11Resource* colorIn, ID3D11Resource* colorOut, ID3D11Resource* depth, ID3D11Resource* mvec, ID3D11Resource* reactiveMask, ID3D11Resource* transparencyMask, const sl::Extent& extentIn, const sl::Extent& extentOut, uint32_t outputWidth) @@ -517,7 +496,7 @@ void Streamline::EvaluateDLSS(sl::ViewportHandle vp, uint32_t eyeIndex, sl::Resource reactiveMaskRes = { sl::ResourceType::eTex2d, reactiveMask, 0 }; sl::Resource transparencyMaskRes = { sl::ResourceType::eTex2d, transparencyMask, 0 }; - if (!CheckFrameConstants(vp, eyeIndex)) + if (!CheckFrameConstants(vp)) return; const bool emitPCLMarkers = @@ -529,16 +508,14 @@ void Streamline::EvaluateDLSS(sl::ViewportHandle vp, uint32_t eyeIndex, return; const sl::Result markerResult = slPCLSetMarker(marker, *frameToken); if (markerResult != sl::Result::eOk) { - static bool markerErrorLogged[2][2] = { { false, false }, { false, false } }; - const uint32_t logIdx = globals::game::isVR ? std::min(eyeIndex, 1u) : 0u; + static bool markerErrorLogged[2] = { false, false }; const uint32_t boundedStageIndex = std::min(stageIndex, 1u); - if (markerErrorLogged[logIdx][boundedStageIndex]) + if (markerErrorLogged[boundedStageIndex]) return; - markerErrorLogged[logIdx][boundedStageIndex] = true; + markerErrorLogged[boundedStageIndex] = true; logger::warn( - "[Streamline] slPCLSetMarker({}) failed{}: {}", + "[Streamline] slPCLSetMarker({}) failed: {}", stageName, - globals::game::isVR ? std::format(" for eye {}", eyeIndex) : "", magic_enum::enum_name(markerResult)); } }; @@ -560,15 +537,8 @@ void Streamline::EvaluateDLSS(sl::ViewportHandle vp, uint32_t eyeIndex, const sl::BaseStructure* inputs[] = { &view }; auto state = globals::state; - if (state->frameAnnotations) { - if (globals::game::isVR) { - char buf[32]; - snprintf(buf, sizeof(buf), "DLSS Evaluate Eye %u", eyeIndex); - state->BeginPerfEvent(buf); - } else { - state->BeginPerfEvent("DLSS Evaluate"); - } - } + if (state->frameAnnotations) + state->BeginPerfEvent("DLSS Evaluate"); emitPCLMarker(sl::PCLMarker::eRenderSubmitStart, "DLSS-EvaluateStart", 0); sl::Result evalResult = slEvaluateFeature(sl::kFeatureDLSS, *frameToken, inputs, _countof(inputs), context); @@ -578,11 +548,10 @@ void Streamline::EvaluateDLSS(sl::ViewportHandle vp, uint32_t eyeIndex, state->EndPerfEvent(); if (evalResult != sl::Result::eOk) { - static bool evalErrorLogged[2] = { false, false }; - uint32_t logIdx = globals::game::isVR ? eyeIndex : 0; - if (!evalErrorLogged[logIdx]) { - evalErrorLogged[logIdx] = true; - logger::error("[Streamline] slEvaluateFeature failed{} result={}", globals::game::isVR ? std::format(" for eye {}", eyeIndex) : "", (int)evalResult); + static bool evalErrorLogged = false; + if (!evalErrorLogged) { + evalErrorLogged = true; + logger::error("[Streamline] slEvaluateFeature failed result={}", (int)evalResult); } } } @@ -603,86 +572,13 @@ void Streamline::Upscale(ID3D11Resource* a_upscalingTexture, ID3D11Resource* a_r ID3D11Resource* colorOut = (upscaling.settings.sharpnessDLSS > 0.0f && upscaling.sharpenerTexture) ? upscaling.sharpenerTexture->resource.get() : a_upscalingTexture; - // VR stereo DLSS: NGX D3D11 only accepts zero-offset subrects. Non-zero offsets return - // FAIL_InvalidParameter because Streamline's dlssEntry.cpp never sets - // NVSDK_NGX_Parameter_DLSS_Enable_Output_Subrects during context creation. - // - // Both eyes copy their color slice into per-eye intermediates so ClearHMDMask can zero - // outside-mask regions before DLSS sees them (prevents temporal bleed into visible pixels). - // Eye 0 outputs directly to colorOut (zero-offset) — no intermediate output buffer needed. - // Eye 1 outputs to vrIntermediateColorOut[1] then copies back to kMAIN at eyeWidthOut. - // - // Eye 1 is pre-copied before eye 0 runs: at non-DLAA scales eye 0's upscaled output - // extends past eyeWidthIn into eye 1's input region of kMAIN. - if (globals::game::isVR) { - auto context = globals::d3d::context; - - uint32_t eyeWidthOut = (uint32_t)(screenSize.x / 2); - uint32_t eyeHeightOut = (uint32_t)screenSize.y; - uint32_t eyeWidthIn = (uint32_t)(renderSize.x / 2); - uint32_t eyeHeightIn = (uint32_t)renderSize.y; - - sl::Extent perEyeIn{ 0, 0, eyeWidthIn, eyeHeightIn }; - sl::Extent perEyeOut{ 0, 0, eyeWidthOut, eyeHeightOut }; - - // Both flags track the same creation pool (EnsureVRIntermediateTextures creates all - // intermediates atomically), so in practice eye0Ready == eye1Ready. The separate checks - // are kept for null-safety and to document which resources each eye path actually uses. - bool eye0Ready = upscaling.vrIntermediateColorIn[0] && - upscaling.vrIntermediateMotionVectors[0] && upscaling.vrIntermediateReactiveMask[0] && upscaling.vrIntermediateTransparencyMask[0]; - bool eye1Ready = upscaling.vrIntermediateColorIn[1] && upscaling.vrIntermediateColorOut[1] && - upscaling.vrIntermediateDepth && upscaling.vrIntermediateMotionVectors[1] && - upscaling.vrIntermediateReactiveMask[1] && upscaling.vrIntermediateTransparencyMask[1]; - - // Pre-copy eye 1 before eye 0 runs (overlap hazard), then clear HMD mask. - if (eye1Ready) { - D3D11_BOX rightIn = { eyeWidthIn, 0, 0, eyeWidthIn * 2, eyeHeightIn, 1 }; - context->CopySubresourceRegion(upscaling.vrIntermediateColorIn[1]->resource.get(), 0, 0, 0, 0, a_upscalingTexture, 0, &rightIn); - context->CopySubresourceRegion(upscaling.vrIntermediateDepth->resource.get(), 0, 0, 0, 0, depthTexture.texture, 0, &rightIn); - upscaling.ClearHMDMask(upscaling.vrIntermediateColorIn[1]->uav.get(), depthTexture.depthSRV, - eyeWidthIn, eyeHeightIn, eyeWidthIn, 0); - } - - // Eye 0: copy left-eye slice, clear HMD mask, output directly to colorOut at offset 0. - if (eye0Ready) { - D3D11_BOX leftIn = { 0, 0, 0, eyeWidthIn, eyeHeightIn, 1 }; - context->CopySubresourceRegion(upscaling.vrIntermediateColorIn[0]->resource.get(), 0, 0, 0, 0, a_upscalingTexture, 0, &leftIn); - upscaling.ClearHMDMask(upscaling.vrIntermediateColorIn[0]->uav.get(), depthTexture.depthSRV, - eyeWidthIn, eyeHeightIn, 0, 0); - - EvaluateDLSS(viewport, 0, - upscaling.vrIntermediateColorIn[0]->resource.get(), colorOut, - depthTexture.texture, - upscaling.vrIntermediateMotionVectors[0]->resource.get(), - upscaling.vrIntermediateReactiveMask[0]->resource.get(), - upscaling.vrIntermediateTransparencyMask[0]->resource.get(), - perEyeIn, perEyeOut, eyeWidthOut); - } + sl::Extent extentIn{ 0, 0, (uint)renderSize.x, (uint)renderSize.y }; + sl::Extent extentOut{ 0, 0, (uint)screenSize.x, (uint)screenSize.y }; - // Eye 1: evaluate into intermediate, then copy upscaled result to kMAIN right-eye position. - if (eye1Ready) { - EvaluateDLSS(viewportRight, 1, - upscaling.vrIntermediateColorIn[1]->resource.get(), - upscaling.vrIntermediateColorOut[1]->resource.get(), - upscaling.vrIntermediateDepth->resource.get(), - upscaling.vrIntermediateMotionVectors[1]->resource.get(), - upscaling.vrIntermediateReactiveMask[1]->resource.get(), - upscaling.vrIntermediateTransparencyMask[1]->resource.get(), - perEyeIn, perEyeOut, eyeWidthOut); - - D3D11_BOX rightOut = { 0, 0, 0, eyeWidthOut, eyeHeightOut, 1 }; - context->CopySubresourceRegion(colorOut, 0, eyeWidthOut, 0, 0, upscaling.vrIntermediateColorOut[1]->resource.get(), 0, &rightOut); - } - } else { - // Non-VR: Simple full-texture upscale. - sl::Extent extentIn{ 0, 0, (uint)renderSize.x, (uint)renderSize.y }; - sl::Extent extentOut{ 0, 0, (uint)screenSize.x, (uint)screenSize.y }; - - EvaluateDLSS(viewport, 0, - a_upscalingTexture, colorOut, - depthTexture.texture, a_motionVectors, a_reactiveMask, a_transparencyCompositionMask, - extentIn, extentOut, (uint)screenSize.x); - } + EvaluateDLSS(viewport, + a_upscalingTexture, colorOut, + depthTexture.texture, a_motionVectors, a_reactiveMask, a_transparencyCompositionMask, + extentIn, extentOut, (uint)screenSize.x); } void Streamline::UpdateReflex() @@ -774,9 +670,4 @@ void Streamline::DestroyDLSSResources() slDLSSSetOptions(viewport, dlssOptions); slFreeResources(sl::kFeatureDLSS, viewport); - - if (globals::game::isVR) { - slDLSSSetOptions(viewportRight, dlssOptions); - slFreeResources(sl::kFeatureDLSS, viewportRight); - } } diff --git a/src/Features/Upscaling/Streamline.h b/src/Features/Upscaling/Streamline.h index f173dd1bde..2d2abbf6cf 100644 --- a/src/Features/Upscaling/Streamline.h +++ b/src/Features/Upscaling/Streamline.h @@ -38,7 +38,6 @@ class Streamline bool reflexSupportedOnCurrentAdapter = false; sl::ViewportHandle viewport{ 0 }; - sl::ViewportHandle viewportRight{ 1 }; static constexpr uint32_t MAX_RESOLUTION = 8192; HMODULE interposer = NULL; @@ -88,7 +87,7 @@ class Streamline uint32_t lastReflexSleepFrame = UINT32_MAX; // Helper: Execute DLSS for a single viewport with given resources - void EvaluateDLSS(sl::ViewportHandle vp, uint32_t eyeIndex, + void EvaluateDLSS(sl::ViewportHandle vp, ID3D11Resource* colorIn, ID3D11Resource* colorOut, ID3D11Resource* depth, ID3D11Resource* mvec, ID3D11Resource* reactiveMask, ID3D11Resource* transparencyMask, const sl::Extent& extentIn, const sl::Extent& extentOut, uint32_t outputWidth); @@ -103,7 +102,7 @@ class Streamline void PostDevice(); bool EnsureFrameToken(); - bool CheckFrameConstants(sl::ViewportHandle p_viewport, uint32_t eyeIndex = 0); + bool CheckFrameConstants(sl::ViewportHandle p_viewport); bool IsRTXAndBelow40Series(IDXGIAdapter* a_adapter); diff --git a/src/Features/VR.cpp b/src/Features/VR.cpp deleted file mode 100644 index 6f0b676a5d..0000000000 --- a/src/Features/VR.cpp +++ /dev/null @@ -1,294 +0,0 @@ -#include "VR.h" -#include "Menu.h" -#include "RE/B/BSOpenVR.h" -#include "RE/P/PlayerCharacter.h" -#include "Upscaling.h" -#include "VR/OpenVRDetection.h" - -#include "State.h" -#include "Utils/D3D.h" -#include "Utils/VRUtils.h" - -#include -#include -#include - -using AttachMode = VR::Settings::OverlayAttachMode; - -NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( - VR::Settings, - EnableDepthBufferCullingInterior, - EnableDepthBufferCullingExterior, - MinOccludeeBoxExtent, - VRMenuScale, - VRMenuPositioningMethod, - attachMode, - VRMenuAttachController, - VRMenuOffsetX, - VRMenuOffsetY, - VRMenuOffsetZ, - VRMenuControllerOffsetX, - VRMenuControllerOffsetY, - VRMenuControllerOffsetZ, - mouseDeadzone, - mouseSpeed, - dragHighlightColor, - VRMenuOpenKeys, - VRMenuCloseKeys, - VROverlayOpenKeys, - VROverlayCloseKeys, - comboTimeout, - EnableDragToReposition, - kAutoHideSeconds, - VRMenuAutoResetDistance, - EnableWandPointing, - EnableStereoBlend, - StereoBlendDepthSigma, - StereoBlendMaxFactor, - StereoBlendColorThreshold, - StereoBlendDebugMode) - -//============================================================================= -// FEATURE BASE CLASS OVERRIDES -//============================================================================= - -void VR::LoadSettings(json& o_json) -{ - settings = o_json.get(); - settings.ClampToValidRanges(); - if (o_json.contains("StereoOptimizations")) { - json stereoOptJson = o_json["StereoOptimizations"]; - stereoOpt.LoadSettings(stereoOptJson); - } -} - -void VR::SaveSettings(json& o_json) -{ - o_json = settings; - { - json stereoOptJson; - stereoOpt.SaveSettings(stereoOptJson); - o_json["StereoOptimizations"] = stereoOptJson; - } -} - -void VR::RestoreDefaultSettings() -{ - settings = {}; - stereoOpt.RestoreDefaultSettings(); -} - -void VR::SetupResources() -{ - CompileStereoBlendShaders(); - - auto renderer = globals::game::renderer; - auto mainTex = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN]; - D3D11_TEXTURE2D_DESC mainDesc; - mainTex.texture->GetDesc(&mainDesc); - mainDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - mainDesc.MiscFlags = 0; - stereoBlendCopyTex = eastl::make_unique(mainDesc, "VR::StereoBlendCopyTex"); - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = { - .Format = mainDesc.Format, - .ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D, - .Texture2D = { .MostDetailedMip = 0, .MipLevels = 1 } - }; - stereoBlendCopyTex->CreateSRV(srvDesc); - stereoBlendCB = eastl::make_unique(ConstantBufferDesc(), "VR::StereoBlendCB"); - - if (globals::game::isVR && stereoOpt.settings.stereoMode != VRStereoOptimizations::StereoMode::Off) { - stereoOpt.SetupResources(); - stereoOpt.loaded = - stereoOpt.GetModeTextureSRV() != nullptr && - stereoOpt.GetPomOffsetSRV() != nullptr && - stereoOpt.GetPomOffsetUAV() != nullptr; - } else { - stereoOpt.loaded = false; - } - - DetectOpenVRInfo(); - - if (openVRInfo.isAvailable) { - logger::info("OpenVR DLL detected:"); - logger::info(" Path: {}", openVRInfo.dllPath); - logger::info(" Version: {}", openVRInfo.version); - logger::info(" Size: {} bytes", openVRInfo.fileSize); - logger::info(" Modified: {}", openVRInfo.modificationTime); - logger::info(" Runtime: {}", VRDetection::RuntimeTypeToString(openVRInfo.runtimeType)); - logger::info(" Interface probing: {}", openVRInfo.probingSucceeded ? "Passed" : "Failed"); - logger::info(" Overlay (IVROverlay_016): {}", openVRInfo.hasOverlayInterface ? "Yes" : "No"); - logger::info(" System (IVRSystem_017): {}", openVRInfo.hasSystemInterface ? "Yes" : "No"); - logger::info(" Compositor (IVRCompositor_021): {}", openVRInfo.hasCompositorInterface ? "Yes" : "No"); - logger::info(" Compatible: {}", openVRInfo.isCompatible ? "Yes" : "No"); - - if (!openVRInfo.isCompatible) { - if (globals::state->IsDeveloperMode()) { - logger::info("OpenVR not natively compatible, but developer mode is active - VR menus enabled"); - } else { - logger::info("OpenVR version is incompatible. Community Shaders VR menus will be disabled for stability"); - } - } - } else { - logger::info("OpenVR DLL not available in current process"); - } -} - -void VR::PostPostLoad() -{ - gDepthBufferCulling = reinterpret_cast(REL::Offset(0x1EC6B88).address()); - if (!gDepthBufferCulling) { - static bool s_defaultDepthBufferCulling = false; - gDepthBufferCulling = &s_defaultDepthBufferCulling; - logger::warn("VR: gDepthBufferCulling address not found - using fallback default (false)"); - } - - gMinOccludeeBoxExtent = reinterpret_cast(REL::Offset(0x1ED64E8).address()); - if (!gMinOccludeeBoxExtent) { - static float s_defaultMinOccludeeBoxExtent = 10.0f; - gMinOccludeeBoxExtent = &s_defaultMinOccludeeBoxExtent; - logger::warn("VR: gMinOccludeeBoxExtent address not found - using fallback default (10.0)"); - } - - // Migration: Fix legacy overlay keybinds - if (settings.VROverlayCloseKeys.size() == 1) { - auto& closeKey = settings.VROverlayCloseKeys[0]; - if (closeKey.GetDevice() == ControllerDevice::Keyboard && closeKey.GetKey() == 32) { - settings.VROverlayCloseKeys[0] = InputCombo::Primary(32); - logger::info("VR: Migrated VROverlayCloseKeys from Keyboard(32) to Primary(32)"); - } - } - if (settings.VROverlayOpenKeys.size() == 1) { - auto& openKey = settings.VROverlayOpenKeys[0]; - if (openKey.GetDevice() == ControllerDevice::Keyboard && openKey.GetKey() == 32) { - settings.VROverlayOpenKeys[0] = InputCombo::Secondary(32); - logger::info("VR: Migrated VROverlayOpenKeys from Keyboard(32) to Secondary(32)"); - } - } - - REL::safe_write(REL::RelocationID(0, 0, 69528).address() + REL::Relocate(0, 0, 0xD9) + 0x2, 0x148); - REL::safe_write(REL::RelocationID(0, 0, 69528).address() + REL::Relocate(0, 0, 0xE5) + 0x2, 0x14C); - REL::safe_write(REL::RelocationID(0, 0, 69528).address() + REL::Relocate(0, 0, 0xF1) + 0x2, 0x150); -} - -void VR::DataLoaded() -{ - // Initialize occlusion culling based on user settings and current interior/exterior state. - UpdateDepthBufferCulling(); - - if (gMinOccludeeBoxExtent) { - *gMinOccludeeBoxExtent = settings.MinOccludeeBoxExtent; - } else { - logger::warn("VR::DataLoaded: gMinOccludeeBoxExtent is null, skipping assignment"); - } -} - -void VR::EarlyPrepass() -{ - // Apply culling setting each prepass based on current interior/exterior state. - UpdateDepthBufferCulling(); -} - -//============================================================================= -// OVERLAY SUBMIT AND DEPTH BUFFER CULLING -//============================================================================= - -void VR::RecreateOverlayTexturesIfNeeded() -{ - Util::CreateOverlayTextureAndRTV(globals::d3d::device, Config::kOverlayWidth, Config::kOverlayHeight, menuTexture.put(), menuRTV.put()); -} - -bool VR::IsWelcomeOverlayVisible() const -{ - return settings.kAutoHideSeconds > 0 && - globals::game::ui && - globals::game::ui->IsMenuOpen(RE::MainMenu::MENU_NAME) && - globals::menu && - !globals::menu->IsEnabled; -} - -void VR::SubmitOverlayFrame() -{ - InstallSubmitHook(); - - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - if (!openvr || !openvr->vrSystem) { - return; - } - - auto& enabled = globals::menu->IsEnabled; - auto& overlayVisible = globals::menu->overlayVisible; - - if ((enabled || overlayVisible || IsWelcomeOverlayVisible()) && menuTexture.get() && menuRTV.get()) { - UpdateFixedWorldPositioning(); - UpdateOverlayDrag(); - - ID3D11RenderTargetView* oldRTV = nullptr; - globals::d3d::context->OMGetRenderTargets(1, &oldRTV, nullptr); - ID3D11RenderTargetView* menuRTVPtr = menuRTV.get(); - globals::d3d::context->OMSetRenderTargets(1, &menuRTVPtr, nullptr); - float clearColor[4] = { 0, 0, 0, 0 }; - globals::d3d::context->ClearRenderTargetView(menuRTV.get(), clearColor); - ImGui::Render(); - ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - globals::d3d::context->OMSetRenderTargets(1, &oldRTV, nullptr); - - bool beingDragged = settings.EnableDragToReposition && overlayDragState.dragging; - Util::ApplyHighlightTintToTexture(menuTexture.get(), beingDragged, settings.dragHighlightColor); - - if (oldRTV) - oldRTV->Release(); - } -} - -// Helper to centralize VR depth buffer culling logic, reducing duplication between DataLoaded, EarlyPrepass, and Settings UI. -void VR::UpdateDepthBufferCulling() -{ - if (!gDepthBufferCulling) { - return; - } - - const auto* tes = globals::game::tes; - const bool inInterior = tes && tes->interiorCell != nullptr; - const bool desired = inInterior ? settings.EnableDepthBufferCullingInterior : settings.EnableDepthBufferCullingExterior; - - const bool previous = *gDepthBufferCulling; - *gDepthBufferCulling = desired; - - if (previous != desired) { - logger::info("VR depth buffer culling set to {}", desired); - } -} - -//============================================================================= -// OPENVR VERSION DETECTION AND COMPATIBILITY -//============================================================================= - -void VR::DetectOpenVRInfo() -{ - openVRInfo = {}; - - auto result = VRDetection::Detect(); - - openVRInfo.isAvailable = result.isAvailable; - openVRInfo.isCompatible = result.isCompatible; - openVRInfo.dllPath = result.dllPath; - openVRInfo.version = result.version; - openVRInfo.fileSize = result.fileSize; - openVRInfo.modificationTime = result.modificationTime; - openVRInfo.hasOverlayInterface = result.hasOverlayInterface; - openVRInfo.hasSystemInterface = result.hasSystemInterface; - openVRInfo.hasCompositorInterface = result.hasCompositorInterface; - openVRInfo.runtimeType = result.runtimeType; - openVRInfo.probingSucceeded = result.probingSucceeded; -} - -bool VR::IsOpenVRCompatible() const -{ - return globals::game::isVR && openVRInfo.isCompatible; -} - -void VR::Reset() -{ - stereoOpt.Reset(); -} diff --git a/src/Features/VR.h b/src/Features/VR.h deleted file mode 100644 index 1c63d30fff..0000000000 --- a/src/Features/VR.h +++ /dev/null @@ -1,558 +0,0 @@ -#pragma once -#include "Menu.h" -#include "OverlayFeature.h" -#include "Utils/Input.h" -#include "VR/OpenVRDetection.h" // In Features/VR/ -#include "VRStereoOptimizations.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DirectX::SimpleMath; - -// Backwards compatibility aliases -using ControllerDevice = InputDeviceType; -using ButtonCombo = InputCombo; - -/** - * @brief Main VR feature class providing VR-specific optimizations and overlay UI system - * - * This class extends OverlayFeature to provide comprehensive VR support including: - * - Performance optimizations (depth buffer culling, occlusion culling) - * - VR overlay system for in-game UI interaction - * - Controller input processing and button combo mapping - * - Overlay positioning and manipulation (HMD-relative, controller-relative, fixed world) - * - Drag-and-drop overlay repositioning - * - * The VR class follows the singleton pattern and integrates with the OpenVR API - * to provide seamless VR experience within the Community Shaders framework. - * - * @example - * ```cpp - * // Get the VR singleton instance - * VR* vr = VR::GetSingleton(); - * - * // Check if VR is supported - * if (vr->SupportsVR()) { - * // Configure VR settings - * vr->settings.EnableDepthBufferCulling = true; - * vr->settings.VRMenuScale = 1.2f; - * } - * ``` - */ -struct VR : OverlayFeature -{ -public: - //============================================================================= - // NESTED TYPES AND CONSTANTS - //============================================================================= - - /** - * @brief Configuration constants for VR feature defaults and limits - * - * These constants define the default values and valid ranges for various - * VR settings to ensure consistent behavior and prevent invalid configurations. - */ - struct Config - { - // Overlay texture dimensions - static constexpr int kOverlayWidth = 1920; ///< Overlay texture width in pixels - static constexpr int kOverlayHeight = 1080; ///< Overlay texture height in pixels - static constexpr float kOverlayAspect = static_cast(kOverlayHeight) / static_cast(kOverlayWidth); ///< Aspect ratio (height/width) - - static inline Matrix CreateOverlayScaleMatrix(float scale) - { - return Matrix::CreateScale(scale, scale * kOverlayAspect, scale); - } - - static constexpr float kDefaultMenuScale = 1.0f; ///< Default overlay scale factor - static constexpr float kMinMenuScale = 0.1f; ///< Minimum allowed overlay scale - static constexpr float kMaxMenuScale = 5.0f; ///< Maximum allowed overlay scale - static constexpr float kDefaultComboTimeout = 3.0f; ///< Default timeout for button combos (seconds) - static constexpr float kDefaultMouseDeadzone = 0.1f; ///< Default thumbstick deadzone for mouse input - static constexpr float kDefaultMouseSpeed = 10.0f; ///< Default mouse speed multiplier - static constexpr int kDefaultAutoHideSeconds = 30; ///< Default auto-hide timeout for overlay messages - static constexpr int kMaxAutoHideSeconds = 300; ///< Maximum auto-hide timeout (5 minutes) - - // Default HMD overlay offset values (in meters, relative to HMD) - static constexpr float kDefaultHMDOffsetX = 0.195f; ///< Default horizontal offset from HMD - static constexpr float kDefaultHMDOffsetY = -0.375f; ///< Default vertical offset from HMD - static constexpr float kDefaultHMDOffsetZ = -1.355f; ///< Default depth offset from HMD - - // Default controller overlay offset values (in meters, relative to controller) - static constexpr float kDefaultControllerOffsetX = 0.295f; ///< Default horizontal offset from controller - static constexpr float kDefaultControllerOffsetY = 0.211f; ///< Default vertical offset from controller - static constexpr float kDefaultControllerOffsetZ = 0.063f; ///< Default depth offset from controller - }; - - //============================================================================= - // FEATURE BASE CLASS OVERRIDES - //============================================================================= - - virtual inline std::string GetName() override { return "VR"; } - virtual std::string GetDisplayName() override { return T("feature.vr.name", "VR"); } - virtual inline std::string GetShortName() override { return "VR"; } - virtual std::pair> GetFeatureSummary() override - { - return { T("feature.vr.description", "Provides VR-specific optimizations and enhancements for Community Shaders, improving performance and visual quality in virtual reality environments."), - { T("feature.vr.key_feature_1", "Depth buffer culling optimization for VR performance"), - T("feature.vr.key_feature_2", "In-scene overlay menu with HMD/Controller/Fixed World attach modes"), - T("feature.vr.key_feature_3", "VR controller input with customizable button mappings"), - T("feature.vr.key_feature_4", "Grip-to-drag overlay positioning with depth control"), - T("feature.vr.key_feature_5", "Configurable occlusion culling parameters"), - T("feature.vr.key_feature_6", "Enhanced VR compatibility with SteamVR and OpenComposite") } }; - }; - - virtual inline std::string_view GetShaderDefineName() override { return "VR_STEREO_OPT"; } - virtual inline bool HasShaderDefine(RE::BSShader::Type t) override { return stereoOpt.CanDispatchStencil() && (t == RE::BSShader::Type::Utility || t == RE::BSShader::Type::Lighting); } - virtual void Reset() override; - virtual void SetupResources() override; - virtual void ClearShaderCache() override; - virtual bool SupportsVR() override { return true; } - virtual bool IsCore() const override { return true; } - - virtual void PostPostLoad() override; - virtual void DataLoaded() override; - virtual void EarlyPrepass() override; - - void UpdateDepthBufferCulling(); - - // Stereo bilateral blend pass - called from Deferred::DeferredPasses after composite - void DrawStereoBlend(); - void CompileStereoBlendShaders(); - bool IsStereoOptimizationCullingReady() const - { - return REL::Module::IsVR() && - stereoOpt.CanDispatchStencil() && - stereoBlendOverwriteCS && - stereoBlendCopyTex && - stereoBlendCB; - } - static bool AnyScreenSpaceEffectLoaded(); - - virtual void LoadSettings(json& o_json) override; - virtual void SaveSettings(json& o_json) override; - virtual void RestoreDefaultSettings() override; - - virtual void DrawSettings() override; - - virtual std::string_view GetCategory() const override { return FeatureCategories::kUtility; } - - //============================================================================= - // OVERLAY FEATURE OVERRIDES - //============================================================================= - - virtual void DrawOverlay() override; - virtual bool IsOverlayVisible() const override { return IsOpenVRCompatible() && settings.kAutoHideSeconds > 0 && globals::menu && !globals::menu->IsEnabled; } - - //============================================================================= - // SETTINGS STRUCTURE - //============================================================================= - - /** - * @brief Configuration settings for the VR feature - * - * This structure contains all user-configurable settings for VR functionality, - * including performance optimizations, overlay positioning, input mapping, and - * visual customization options. Settings are automatically validated and clamped - * to valid ranges when loaded or modified. - */ - struct Settings - { - // Performance optimization settings - bool EnableDepthBufferCullingExterior = true; ///< Enable depth buffer culling for VR performance - bool EnableDepthBufferCullingInterior = true; - float MinOccludeeBoxExtent = 10.0f; ///< Minimum bounding box size for occlusion culling - - // Stereo consistency blend pass (post-composite safety net) - bool EnableStereoBlend = false; ///< Enable depth-aware bilateral blend between eyes - float StereoBlendDepthSigma = 0.01f; ///< Depth sensitivity for bilateral weight (lower = stricter) - float StereoBlendMaxFactor = 0.1f; ///< Maximum blend factor; keep low to preserve stereo parallax - float StereoBlendColorThreshold = 0.02f; ///< Minimum color difference to trigger blending (luminance) - int StereoBlendDebugMode = 0; ///< 0=off, 1=back-check, 2=blend weight, 3=edge detection, 4=overwrite, 5=overwrite Eye1 - - // VR Menu Overlay positioning settings - float VRMenuScale = Config::kDefaultMenuScale; ///< Scale factor for overlay UI (0.5-2.0) - int VRMenuPositioningMethod = 1; ///< 0 = HMD relative, 1 = Fixed world position - - /** - * @brief Defines how overlays are attached and positioned in VR space - */ - enum class OverlayAttachMode - { - HMDOnly = 0, ///< Overlay attached to HMD only - ControllerOnly = 1, ///< Overlay attached to controller only - Both = 2, ///< Overlay can be attached to both HMD and controller - None = 3 ///< Overlay display disabled - }; - OverlayAttachMode attachMode = OverlayAttachMode::HMDOnly; ///< Current overlay attachment mode - ControllerDevice VRMenuAttachController = ControllerDevice::Secondary; ///< Which controller to attach overlay to - - // HMD overlay offset settings (in meters) - float VRMenuOffsetX = Config::kDefaultHMDOffsetX; ///< Horizontal offset from HMD - float VRMenuOffsetY = Config::kDefaultHMDOffsetY; ///< Vertical offset from HMD - float VRMenuOffsetZ = Config::kDefaultHMDOffsetZ; ///< Depth offset from HMD - - // Controller overlay offset settings (in meters) - float VRMenuControllerOffsetX = Config::kDefaultControllerOffsetX; ///< Horizontal offset from controller - float VRMenuControllerOffsetY = Config::kDefaultControllerOffsetY; ///< Vertical offset from controller - float VRMenuControllerOffsetZ = Config::kDefaultControllerOffsetZ; ///< Depth offset from controller - - // Input and interaction settings - bool VRMenuControllerDiagnosticsTestMode = false; ///< Enable controller diagnostics mode - float mouseDeadzone = Config::kDefaultMouseDeadzone; ///< Thumbstick deadzone for mouse input (0.0-1.0) - float mouseSpeed = Config::kDefaultMouseSpeed; ///< Mouse speed multiplier (0.1-50.0) - - // Wand pointing settings - bool EnableWandPointing = true; ///< Enable controller wand/ray-cast pointing (modern VR input) - - // Visual customization - std::array dragHighlightColor = { 1.0f, 1.0f, 0.0f, 0.3f }; ///< RGBA color for drag highlight - - // Key binding configurations - std::vector VRMenuOpenKeys = { ///< Button combos to open VR menu - ButtonCombo::Secondary(static_cast(RE::BSOpenVRControllerDevice::Keys::kXA)), - ButtonCombo::Secondary(static_cast(RE::BSOpenVRControllerDevice::Keys::kBY)) - }; - std::vector VRMenuCloseKeys = { ///< Button combos to close VR menu - ButtonCombo::Both(static_cast(RE::BSOpenVRControllerDevice::Keys::kGrip)) - }; - std::vector VROverlayOpenKeys = { ///< Button combos to open VR overlay - ButtonCombo::Secondary(static_cast(RE::BSOpenVRControllerDevice::Keys::kJoystickTrigger)) - }; - std::vector VROverlayCloseKeys = { ///< Button combos to close VR overlay - ButtonCombo::Primary(static_cast(RE::BSOpenVRControllerDevice::Keys::kJoystickTrigger)) - }; - - // General interaction settings - float comboTimeout = Config::kDefaultComboTimeout; ///< Timeout for button combo sequences (1.0-10.0 seconds) - int kAutoHideSeconds = Config::kDefaultAutoHideSeconds; ///< Auto-hide timeout for overlay messages (>0 shows overlay, <=0 hides it) - bool EnableDragToReposition = false; ///< Allow drag-and-drop overlay repositioning - - float VRMenuAutoResetDistance = 1000.0f; // Default: 1000 units ≈ 14.3 meters - - /** - * @brief Validates if the current menu scale is within acceptable range - * @return true if scale is between kMinMenuScale and kMaxMenuScale - */ - bool IsMenuScaleValid() const - { - return VRMenuScale >= Config::kMinMenuScale && VRMenuScale <= Config::kMaxMenuScale; - } - - /** - * @brief Validates if the current attach mode is valid - * @return true if attach mode is within valid enum range - */ - bool IsAttachModeValid() const - { - return attachMode >= OverlayAttachMode::HMDOnly && attachMode <= OverlayAttachMode::None; - } - - /** - * @brief Clamps all settings to their valid ranges - * - * This method ensures all numeric settings are within acceptable bounds, - * automatically correcting any out-of-range values that might have been - * loaded from configuration files or set programmatically. - */ - void ClampToValidRanges() - { - VRMenuScale = std::clamp(VRMenuScale, Config::kMinMenuScale, Config::kMaxMenuScale); - mouseDeadzone = std::clamp(mouseDeadzone, 0.0f, 1.0f); - mouseSpeed = std::clamp(mouseSpeed, 0.1f, 50.0f); - comboTimeout = std::clamp(comboTimeout, 1.0f, 10.0f); - kAutoHideSeconds = std::clamp(kAutoHideSeconds, 0, Config::kMaxAutoHideSeconds); - StereoBlendDepthSigma = std::clamp(StereoBlendDepthSigma, 0.001f, 0.1f); - StereoBlendMaxFactor = std::clamp(StereoBlendMaxFactor, 0.0f, 0.5f); - StereoBlendColorThreshold = std::clamp(StereoBlendColorThreshold, 0.0f, 0.2f); - StereoBlendDebugMode = std::clamp(StereoBlendDebugMode, 0, 5); - } - }; - - Settings settings; ///< Current VR configuration settings - - //============================================================================= - // VR-SPECIFIC PUBLIC API - //============================================================================= - - void ProcessVREvents(std::vector& vrEvents); - - // Wand pointing methods - enum class OverlayType - { - HMD, - Controller - }; - bool ComputeWandIntersection(vr::TrackedDeviceIndex_t controllerIndex, ImVec2& outUV); - bool ComputeWandIntersectionForOverlayType(OverlayType type, vr::TrackedDeviceIndex_t controllerIndex, ImVec2& outUV); - void UpdateCursorFromWandPointing(); - void UpdateOverlayMenuStateFromInput(); - void ProcessVRButtonEvent(const Menu::KeyEvent& event); - void UpdateControllerState(const Menu::KeyEvent& event); - void ProcessThumbstickScroll(RE::VRControllerState& controllerState, size_t thumbstickIndex, float deadzone, ImGuiIO& io); - void ProcessControllerInputForImGui(); - - void RecreateOverlayTexturesIfNeeded(); - void SubmitOverlayFrame(); - bool IsWelcomeOverlayVisible() const; - - /** - * @brief Context for rendering VR overlays with render target management - */ - struct OverlayRenderContext - { - vr::IVROverlay* gameOverlay; - vr::IVROverlay* cleanOverlay; - RE::BSOpenVR* openvr; - ID3D11RenderTargetView* oldRTV = nullptr; - float clearColor[4] = { 0, 0, 0, 0 }; - - bool IsValid() const - { - return gameOverlay && cleanOverlay && openvr && openvr->vrSystem; - } - - void SaveRenderTarget() - { - globals::d3d::context->OMGetRenderTargets(1, &oldRTV, nullptr); - } - - void RestoreRenderTarget() - { - globals::d3d::context->OMSetRenderTargets(1, &oldRTV, nullptr); - if (oldRTV) { - oldRTV->Release(); - oldRTV = nullptr; - } - } - - void RenderToTexture(ID3D11RenderTargetView* targetRTV) - { - globals::d3d::context->OMSetRenderTargets(1, &targetRTV, nullptr); - globals::d3d::context->ClearRenderTargetView(targetRTV, clearColor); - ImGui::Render(); - ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - } - }; - - void SubmitHMDOverlay(OverlayRenderContext& context); - void SubmitControllerOverlay(OverlayRenderContext& context); - void HideAllOverlays(vr::IVROverlay* gameOverlay); - - void UpdateOverlayDrag(); - bool CanPerformDrag(); - void UpdateActiveDrag(); - void TryStartNewDrag(); - void SetFixedOverlayToCurrentHMD(); - void UpdateFixedWorldPositioning(); - bool ShouldHighlightOverlayWindow() const { return overlayDragState.dragging; } - - //============================================================================= - // PUBLIC MEMBER VARIABLES - //============================================================================= - - // OpenVR overlay handles and DirectX 11 rendering resources - vr::VROverlayHandle_t menuOverlayHandle = vr::k_ulOverlayHandleInvalid; - vr::VROverlayHandle_t menuControllerOverlayHandle = vr::k_ulOverlayHandleInvalid; - winrt::com_ptr menuTexture; - winrt::com_ptr menuRTV; - winrt::com_ptr menuControllerTexture; - winrt::com_ptr menuControllerRTV; - - // Stereo blend compute shader resources - winrt::com_ptr stereoBlendCS; - winrt::com_ptr stereoBlendDebugBackCheckCS; - winrt::com_ptr stereoBlendDebugBlendWeightCS; - winrt::com_ptr stereoBlendDebugEdgeDetectionCS; - winrt::com_ptr stereoBlendOverwriteCS; - eastl::unique_ptr stereoBlendCopyTex; - eastl::unique_ptr stereoBlendCB; - winrt::com_ptr stereoBlendLinearSampler; - - VRStereoOptimizations stereoOpt; - - struct alignas(16) StereoBlendCB - { - float FrameDim[2]; - float RcpFrameDim[2]; - float DepthSigma; - float MaxBlendFactor; - float ColorDiffThreshold; - float DebugEdgeTint; - uint32_t DebugMode; - float FullBlendDistance; - float POMDepthScale; - float _pad; - }; - - // Engine hook integration points - bool* gDepthBufferCulling = nullptr; - float* gMinOccludeeBoxExtent = nullptr; - - // VR Controller state and logging - struct VRControllerEventLog - { - int device; - int keyCode; - int value; - bool pressed; - double heldTime; - std::string heldSource; - float thumbstickX = 0.0f; - float thumbstickY = 0.0f; - std::string controllerRole; - }; - - std::vector vrControllerEventLog; - RE::VRControllerState primaryControllerState; - RE::VRControllerState secondaryControllerState; - bool lastKnownLeftHandedMode = false; - - struct OverlayWorldPosition - { - Matrix m = Matrix::Identity; - bool initialized = false; - } fixedWorldOverlayPosition; - - struct OverlayDragState - { - bool dragging = false; - vr::TrackedDeviceIndex_t controllerIndex = vr::k_unTrackedDeviceIndexInvalid; - bool isPrimary = false; - bool isSecondary = false; - Matrix initialControllerMatrix = Matrix::Identity; - Matrix initialOverlayMatrix = Matrix::Identity; - Matrix grabOffset = Matrix::Identity; - bool intersecting = false; - - enum class DragMode - { - None, - FixedWorld, - HMD, - Controller - } mode = DragMode::None; - - Vector3 initialHMDOffset = Vector3::Zero; - Vector3 initialControllerOffset = Vector3::Zero; - float initialHMDScale = 1.0f; - Matrix startControllerMatrix = Matrix::Identity; - } overlayDragState; - - struct ComboSequence - { - std::vector sequence; - double startTime = 0.0; - size_t currentIndex = 0; - bool active = false; - }; - ComboSequence menuOpenCombo; - ComboSequence menuCloseCombo; - - enum class ComboType - { - None, - MenuOpen, - MenuClose, - OverlayOpen, - OverlayClose - }; - - bool isCapturingCombo = false; - ComboType currentComboType = ComboType::None; - const char* currentComboName = nullptr; - std::vector recordedCombo; - double comboStartTime = 0.0; - double comboTimeout = 3.0; - - // Button controller recording state for UI settings - std::unordered_map recordingButtonControllers; - - // OpenVR version and compatibility information - struct OpenVRInfo - { - bool isAvailable = false; - bool isCompatible = false; - std::string dllPath; - std::string version; - uint64_t fileSize = 0; - std::string modificationTime; - - // Interface probing results - bool hasOverlayInterface = false; - bool hasSystemInterface = false; - bool hasCompositorInterface = false; - - // Detection metadata - VRDetection::RuntimeType runtimeType = VRDetection::RuntimeType::Unknown; - bool probingSucceeded = false; - } openVRInfo; - - RE::NiPoint3 savedPlayerWorldPos = RE::NiPoint3(); // Used for auto-reset distance check - - // Wand pointing state - struct WandIntersectionState - { - bool isIntersecting = false; - ImVec2 uvCoordinates = ImVec2(0.0f, 0.0f); - vr::TrackedDeviceIndex_t controllerIndex = vr::k_unTrackedDeviceIndexInvalid; - Vector3 rayOrigin = Vector3::Zero; - Vector3 rayDirection = Vector3::Zero; - } wandState; - - // In-Scene Overlay Rendering Resources (Fallback for incompatible runtimes) - struct InSceneResources - { - winrt::com_ptr vs; - winrt::com_ptr ps; - winrt::com_ptr vb; - winrt::com_ptr ib; - winrt::com_ptr cb; - winrt::com_ptr inputLayout; - winrt::com_ptr blendState; - winrt::com_ptr depthState; - winrt::com_ptr sampler; - winrt::com_ptr rasterizerState; - - // Cached SRV to avoid creating every frame - winrt::com_ptr menuSRV; - ID3D11Texture2D* cachedMenuTexture = nullptr; - - // Cached RTVs per eye to avoid creating every frame - struct CachedRTV - { - winrt::com_ptr rtv; - ID3D11Texture2D* texture = nullptr; - }; - CachedRTV cachedEyeRTVs[2]; - - bool initialized = false; - } inSceneResources; - - struct InSceneCB - { - Matrix wvp; - }; - - void InitInSceneResources(); - void RenderInSceneOverlay(vr::EVREye eye, ID3D11Texture2D* targetTexture, const vr::VRTextureBounds_t* bounds); - void InstallSubmitHook(); - void DetectOpenVRInfo(); - bool IsOpenVRCompatible() const; - -private: - //============================================================================= - // PRIVATE HELPERS - //============================================================================= - - bool GetGripPressed(bool isLeft, bool isRight) const; - void ResetComboRecording(); - void ApplyRecordedCombo(); -}; diff --git a/src/Features/VR/InSceneOverlay.cpp b/src/Features/VR/InSceneOverlay.cpp deleted file mode 100644 index 30f04e9367..0000000000 --- a/src/Features/VR/InSceneOverlay.cpp +++ /dev/null @@ -1,612 +0,0 @@ -#include "Features/VR.h" -#include "Globals.h" -#include "Hooks.h" -#include "Menu.h" -#include "Util.h" -#include "Utils/VRUtils.h" -#include -#include -#include -#include -#include -#include - -using namespace DirectX; -using namespace DirectX::SimpleMath; - -using AttachMode = VR::Settings::OverlayAttachMode; - -//============================================================================= -// IN-SCENE OVERLAY RENDERING VIA SUBMIT HOOK -//============================================================================= - -namespace -{ - struct IVRCompositor_Submit - { - static vr::EVRCompositorError thunk(vr::IVRCompositor* _this, vr::EVREye eEye, const vr::Texture_t* pTexture, const vr::VRTextureBounds_t* pBounds, vr::EVRSubmitFlags nSubmitFlags) - { - auto& vr = globals::features::vr; - // Only process DirectX textures - skip OpenGL/Vulkan to avoid undefined behavior - if (pTexture && pTexture->handle && pTexture->eType == vr::TextureType_DirectX) { - vr.RenderInSceneOverlay(eEye, (ID3D11Texture2D*)pTexture->handle, pBounds); - } - return func(_this, eEye, pTexture, pBounds, nSubmitFlags); - } - static inline REL::Relocation func; - }; -} - -void VR::InitInSceneResources() -{ - if (inSceneResources.initialized) - return; - - InSceneResources temp = {}; - - auto device = globals::d3d::device; - - // 1. Compile shaders - compile VS to get bytecode for input layout, PS separately - ID3DBlob* vsBlob = nullptr; - ID3DBlob* psBlob = nullptr; - ID3DBlob* errorBlob = nullptr; - - // Compile vertex shader - if (FAILED(D3DCompileFromFile(L"Data\\Shaders\\VR\\InSceneOverlay.vs.hlsl", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, - "main", "vs_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &vsBlob, &errorBlob))) { - if (errorBlob) { - logger::error("VR InScene VS compile error: {}", (char*)errorBlob->GetBufferPointer()); - errorBlob->Release(); - } - return; - } - if (errorBlob) { - errorBlob->Release(); - errorBlob = nullptr; - } - - // Compile pixel shader - if (FAILED(D3DCompileFromFile(L"Data\\Shaders\\VR\\InSceneOverlay.ps.hlsl", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, - "main", "ps_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &psBlob, &errorBlob))) { - if (errorBlob) { - logger::error("VR InScene PS compile error: {}", (char*)errorBlob->GetBufferPointer()); - errorBlob->Release(); - } - if (vsBlob) - vsBlob->Release(); - return; - } - if (errorBlob) { - errorBlob->Release(); - errorBlob = nullptr; - } - - // Create shader objects from bytecode - ID3D11VertexShader* vs = nullptr; - ID3D11PixelShader* ps = nullptr; - if (FAILED(device->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), nullptr, &vs)) || - FAILED(device->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), nullptr, &ps))) { - logger::error("VR: Failed to create shader objects"); - if (vs) - vs->Release(); - if (ps) - ps->Release(); - if (vsBlob) - vsBlob->Release(); - if (psBlob) - psBlob->Release(); - return; - } - - temp.vs.attach(vs); - temp.ps.attach(ps); - if (psBlob) - psBlob->Release(); // Don't need PS blob anymore - - // 2. Input Layout - D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; - polygonLayout[0].SemanticName = "POSITION"; - polygonLayout[0].SemanticIndex = 0; - polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; - polygonLayout[0].InputSlot = 0; - polygonLayout[0].AlignedByteOffset = 0; - polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - polygonLayout[0].InstanceDataStepRate = 0; - - polygonLayout[1].SemanticName = "TEXCOORD"; - polygonLayout[1].SemanticIndex = 0; - polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; - polygonLayout[1].InputSlot = 0; - polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; - polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - polygonLayout[1].InstanceDataStepRate = 0; - - if (FAILED(device->CreateInputLayout(polygonLayout, 2, vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), temp.inputLayout.put()))) { - logger::error("VR: Failed to create input layout"); - vsBlob->Release(); - return; - } - - vsBlob->Release(); - - // 3. Buffers - // Quad Vertices (XY plane, z=0, size=1) - struct VertexType - { - XMFLOAT3 position; - XMFLOAT2 texture; - }; - VertexType vertices[4] = { - { XMFLOAT3(-0.5f, -0.5f, 0.0f), XMFLOAT2(0.0f, 1.0f) }, // Bottom Left - { XMFLOAT3(-0.5f, 0.5f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, // Top Left - { XMFLOAT3(0.5f, 0.5f, 0.0f), XMFLOAT2(1.0f, 0.0f) }, // Top Right - { XMFLOAT3(0.5f, -0.5f, 0.0f), XMFLOAT2(1.0f, 1.0f) } // Bottom Right - }; - - D3D11_BUFFER_DESC vertexBufferDesc = {}; - vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT; - vertexBufferDesc.ByteWidth = sizeof(VertexType) * 4; - vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - D3D11_SUBRESOURCE_DATA vertexData = {}; - vertexData.pSysMem = vertices; - if (FAILED(device->CreateBuffer(&vertexBufferDesc, &vertexData, temp.vb.put()))) { - logger::error("VR: Failed to create vertex buffer"); - return; - } - - unsigned long indices[6] = { 0, 1, 2, 0, 2, 3 }; - D3D11_BUFFER_DESC indexBufferDesc = {}; - indexBufferDesc.Usage = D3D11_USAGE_DEFAULT; - indexBufferDesc.ByteWidth = sizeof(unsigned long) * 6; - indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; - D3D11_SUBRESOURCE_DATA indexData = {}; - indexData.pSysMem = indices; - if (FAILED(device->CreateBuffer(&indexBufferDesc, &indexData, temp.ib.put()))) { - logger::error("VR: Failed to create index buffer"); - return; - } - - D3D11_BUFFER_DESC matrixBufferDesc = {}; - matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; - matrixBufferDesc.ByteWidth = sizeof(InSceneCB); - matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - if (FAILED(device->CreateBuffer(&matrixBufferDesc, nullptr, temp.cb.put()))) { - logger::error("VR: Failed to create constant buffer"); - return; - } - - // 4. States - D3D11_BLEND_DESC blendDesc = {}; - blendDesc.RenderTarget[0].BlendEnable = TRUE; - blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; - blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - blendDesc.RenderTarget[0].RenderTargetWriteMask = 0x0F; - if (FAILED(device->CreateBlendState(&blendDesc, temp.blendState.put()))) { - logger::error("VR: Failed to create blend state"); - return; - } - - D3D11_DEPTH_STENCIL_DESC depthDesc = {}; - depthDesc.DepthEnable = FALSE; // Always on top - depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - depthDesc.DepthFunc = D3D11_COMPARISON_ALWAYS; - if (FAILED(device->CreateDepthStencilState(&depthDesc, temp.depthState.put()))) { - logger::error("VR: Failed to create depth stencil state"); - return; - } - - D3D11_RASTERIZER_DESC rasterDesc = {}; - rasterDesc.FillMode = D3D11_FILL_SOLID; - rasterDesc.CullMode = D3D11_CULL_NONE; - rasterDesc.FrontCounterClockwise = FALSE; - rasterDesc.DepthClipEnable = TRUE; - if (FAILED(device->CreateRasterizerState(&rasterDesc, temp.rasterizerState.put()))) { - logger::error("VR: Failed to create rasterizer state"); - return; - } - - D3D11_SAMPLER_DESC samplerDesc = {}; - samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - samplerDesc.MinLOD = 0; - samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; - if (FAILED(device->CreateSamplerState(&samplerDesc, temp.sampler.put()))) { - logger::error("VR: Failed to create sampler state"); - return; - } - Util::SetResourceName(temp.sampler.get(), "VR::InSceneOverlaySampler"); - - inSceneResources = std::move(temp); - inSceneResources.initialized = true; - logger::debug("VR: In-Scene Overlay resources initialized."); -} - -void VR::RenderInSceneOverlay(vr::EVREye eye, ID3D11Texture2D* targetTexture, const vr::VRTextureBounds_t* bounds) -{ - if (!globals::menu || !(globals::menu->IsEnabled || globals::menu->overlayVisible || IsWelcomeOverlayVisible()) || settings.attachMode == AttachMode::None || !menuTexture) { - return; - } - - auto context = globals::d3d::context; - winrt::com_ptr perf; - context->QueryInterface(__uuidof(ID3DUserDefinedAnnotation), perf.put_void()); - - static const wchar_t* eventNames[] = { L"VR In-Scene Overlay (Eye 0)", L"VR In-Scene Overlay (Eye 1)" }; - if (perf) - perf->BeginEvent(eventNames[(int)eye]); - - if (!inSceneResources.initialized) - InitInSceneResources(); - if (!inSceneResources.initialized) { - if (perf) - perf->EndEvent(); - return; - } - - // We can't render if we don't have HMD pose - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - if (!openvr || !openvr->vrSystem) { - if (perf) - perf->EndEvent(); - return; - } - - // Get HMD Pose and Eye matrices - vr::TrackedDevicePose_t hmdPose; - vr::TrackedDevicePose_t renderPose[vr::k_unMaxTrackedDeviceCount]; - - RE::BSOpenVR::GetIVRCompositor()->GetLastPoses(renderPose, vr::k_unMaxTrackedDeviceCount, nullptr, 0); - hmdPose = renderPose[vr::k_unTrackedDeviceIndex_Hmd]; - if (!hmdPose.bPoseIsValid) { - if (perf) - perf->EndEvent(); - return; - } - - Matrix hmdWorld = Matrix::Identity; - Matrix eyeToHead = Matrix::Identity; - Matrix proj = Matrix::Identity; - Matrix vpHeadSpace = Matrix::Identity; // For HMD-relative rendering (head space) - Matrix vpWorldSpace = Matrix::Identity; // For world/controller rendering (world space) - - // Always get Eye and Projection matrices - eyeToHead = Util::HmdMatrix34ToMatrix(openvr->vrSystem->GetEyeToHeadTransform(eye)); - - // Use GetProjectionRaw to build a DirectX-compatible projection matrix (Depth [0, 1]) - // IMPORTANT: OpenVR GetProjectionRaw has a known bug (Valve issue #110, open since 2016): - // The 3rd parameter (named "pTop") actually returns the BOTTOM tangent, and - // the 4th parameter (named "pBottom") actually returns the TOP tangent. - // We name our variables to match the ACTUAL values, not the misleading parameter names. - float left, right, bottom, top; - openvr->vrSystem->GetProjectionRaw(eye, &left, &right, &bottom, &top); - float nearZ = 0.1f; - float farZ = 1000.0f; - - proj = DirectX::XMMatrixPerspectiveOffCenterRH(left * nearZ, right * nearZ, bottom * nearZ, top * nearZ, nearZ, farZ); - - // Log projection values once per eye - static bool projLogged[2] = { false, false }; - if (!projLogged[(int)eye]) { - logger::debug("VR Projection Eye {}: L={:.4f} R={:.4f} B={:.4f} T={:.4f}, EyeX={:.4f}", - (int)eye, left, right, bottom, top, eyeToHead._41); - projLogged[(int)eye] = true; - } - - // Head-space VP (for HMD-relative mode) - vpHeadSpace = eyeToHead.Invert() * proj; - - // World-space VP (for controller attach and fixed world position modes) - if (hmdPose.bPoseIsValid) { - hmdWorld = Util::HmdMatrix34ToMatrix(hmdPose.mDeviceToAbsoluteTracking); - // Transform chain: eye → head → world (row-vector: left-to-right composition) - Matrix eyeToWorld = eyeToHead * hmdWorld; - vpWorldSpace = eyeToWorld.Invert() * proj; - } - - // Get or create cached RTV for the target texture - D3D11_TEXTURE2D_DESC texDesc; - targetTexture->GetDesc(&texDesc); - - int eyeIdx = (int)eye; - auto& cachedRTV = inSceneResources.cachedEyeRTVs[eyeIdx]; - if (cachedRTV.texture != targetTexture) { - cachedRTV.rtv = nullptr; - cachedRTV.texture = nullptr; - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc = {}; - rtvDesc.Format = texDesc.Format; - - if (texDesc.ArraySize > 1) { - if (texDesc.SampleDesc.Count > 1) { - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY; - rtvDesc.Texture2DMSArray.FirstArraySlice = (UINT)eye; - rtvDesc.Texture2DMSArray.ArraySize = 1; - } else { - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - rtvDesc.Texture2DArray.FirstArraySlice = (UINT)eye; - rtvDesc.Texture2DArray.ArraySize = 1; - rtvDesc.Texture2DArray.MipSlice = 0; - } - } else if (texDesc.SampleDesc.Count > 1) { - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS; - } else { - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtvDesc.Texture2D.MipSlice = 0; - } - - HRESULT hr = globals::d3d::device->CreateRenderTargetView(targetTexture, &rtvDesc, cachedRTV.rtv.put()); - if (FAILED(hr)) { - logger::error("VR: Failed to create RTV for eye texture (Format: {}, Samples: {}). HRESULT: {:x}", - (uint32_t)texDesc.Format, texDesc.SampleDesc.Count, (uint32_t)hr); - if (perf) - perf->EndEvent(); - return; - } - cachedRTV.texture = targetTexture; - } - - auto& rtv = cachedRTV.rtv; - - // Save State - ID3D11RenderTargetView* oldRTVs[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT]; - ID3D11DepthStencilView* oldDSV; - context->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, oldRTVs, &oldDSV); - - D3D11_VIEWPORT oldViewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; - UINT numViewports = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; - context->RSGetViewports(&numViewports, oldViewports); - - ID3D11RasterizerState* oldRS = nullptr; - context->RSGetState(&oldRS); - - ID3D11BlendState* oldBlend = nullptr; - FLOAT oldBlendFactor[4]; - UINT oldSampleMask; - context->OMGetBlendState(&oldBlend, oldBlendFactor, &oldSampleMask); - - ID3D11DepthStencilState* oldDepth = nullptr; - UINT oldStencilRef; - context->OMGetDepthStencilState(&oldDepth, &oldStencilRef); - - // Setup Render - ID3D11RenderTargetView* rtvPtr = rtv.get(); - context->OMSetRenderTargets(1, &rtvPtr, nullptr); // No DSV - - // Viewport: Use bounds if provided (for SBS textures), otherwise use full texture - D3D11_VIEWPORT vpDesc = {}; - if (bounds) { - vpDesc.TopLeftX = bounds->uMin * texDesc.Width; - vpDesc.TopLeftY = bounds->vMin * texDesc.Height; - vpDesc.Width = (bounds->uMax - bounds->uMin) * texDesc.Width; - vpDesc.Height = (bounds->vMax - bounds->vMin) * texDesc.Height; - } else { - vpDesc.TopLeftX = 0.0f; - vpDesc.TopLeftY = 0.0f; - vpDesc.Width = (float)texDesc.Width; - vpDesc.Height = (float)texDesc.Height; - } - vpDesc.MinDepth = 0.0f; - vpDesc.MaxDepth = 1.0f; - context->RSSetViewports(1, &vpDesc); - - // Log texture and viewport details once per eye per session - static bool textureInfoLogged[2] = { false, false }; - if (!textureInfoLogged[eyeIdx]) { - logger::debug("VR Submit Texture Info (Eye {}):", eyeIdx); - logger::debug(" Texture Size: {}x{}, Format: {}, ArraySize: {}, SampleCount: {}", - texDesc.Width, texDesc.Height, (uint32_t)texDesc.Format, texDesc.ArraySize, texDesc.SampleDesc.Count); - if (bounds) { - logger::debug(" Bounds: uMin={:.3f}, vMin={:.3f}, uMax={:.3f}, vMax={:.3f}", - bounds->uMin, bounds->vMin, bounds->uMax, bounds->vMax); - logger::debug(" Viewport: X={:.0f}, Y={:.0f}, W={:.0f}, H={:.0f}", - vpDesc.TopLeftX, vpDesc.TopLeftY, vpDesc.Width, vpDesc.Height); - } else { - logger::debug(" No bounds provided (full texture per eye, or texture array)"); - logger::debug(" Viewport: X={:.0f}, Y={:.0f}, W={:.0f}, H={:.0f}", - vpDesc.TopLeftX, vpDesc.TopLeftY, vpDesc.Width, vpDesc.Height); - } - logger::debug(" RTV Dimension: {}", - (texDesc.ArraySize > 1 && texDesc.SampleDesc.Count > 1) ? "Texture2DMSArray" : - (texDesc.ArraySize > 1) ? "Texture2DArray (per-eye slice)" : - (texDesc.SampleDesc.Count > 1) ? "Texture2DMS" : - "Texture2D (single)"); - textureInfoLogged[eyeIdx] = true; - } - - // Helper to draw the overlay quad with a given WVP matrix - auto drawOverlayQuad = [&](ID3D11DeviceContext* ctx, const InSceneCB& cbData) { - D3D11_MAPPED_SUBRESOURCE mappedResource; - if (SUCCEEDED(ctx->Map(inSceneResources.cb.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource))) { - memcpy(mappedResource.pData, &cbData, sizeof(InSceneCB)); - ctx->Unmap(inSceneResources.cb.get(), 0); - } - - ctx->VSSetShader(inSceneResources.vs.get(), nullptr, 0); - ctx->PSSetShader(inSceneResources.ps.get(), nullptr, 0); - ID3D11Buffer* cb = inSceneResources.cb.get(); - ctx->VSSetConstantBuffers(0, 1, &cb); - - struct VT - { - XMFLOAT3 p; - XMFLOAT2 t; - }; - UINT stride = sizeof(VT); - UINT offset = 0; - ID3D11Buffer* vb = inSceneResources.vb.get(); - ctx->IASetVertexBuffers(0, 1, &vb, &stride, &offset); - ctx->IASetIndexBuffer(inSceneResources.ib.get(), DXGI_FORMAT_R32_UINT, 0); - ctx->IASetInputLayout(inSceneResources.inputLayout.get()); - ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - ctx->OMSetBlendState(inSceneResources.blendState.get(), nullptr, 0xFFFFFFFF); - ctx->OMSetDepthStencilState(inSceneResources.depthState.get(), 0); - ctx->RSSetState(inSceneResources.rasterizerState.get()); - - // Cache SRV to avoid creating every frame - if (menuTexture.get() != inSceneResources.cachedMenuTexture) { - inSceneResources.menuSRV = nullptr; - if (FAILED(globals::d3d::device->CreateShaderResourceView(menuTexture.get(), nullptr, inSceneResources.menuSRV.put()))) { - logger::error("VR: Failed to create menu texture SRV"); - return; - } - inSceneResources.cachedMenuTexture = menuTexture.get(); - } - ID3D11ShaderResourceView* srvPtr = inSceneResources.menuSRV.get(); - ctx->PSSetShaderResources(0, 1, &srvPtr); - - ID3D11SamplerState* sampler = inSceneResources.sampler.get(); - ctx->PSSetSamplers(0, 1, &sampler); - - ctx->DrawIndexed(6, 0, 0); - }; - - // --- Render HMD Overlay --- - if ((settings.attachMode == AttachMode::HMDOnly || settings.attachMode == AttachMode::Both) && menuTexture) { - InSceneCB cbData; - - Matrix modelMatrix; - Matrix vp; - if (settings.VRMenuPositioningMethod == 1) { // Fixed World Position - modelMatrix = VR::Config::CreateOverlayScaleMatrix(settings.VRMenuScale) * fixedWorldOverlayPosition.m; - vp = vpWorldSpace; - } else { // HMD Relative - Matrix offset = Matrix::CreateTranslation(settings.VRMenuOffsetX, settings.VRMenuOffsetY, settings.VRMenuOffsetZ); - modelMatrix = VR::Config::CreateOverlayScaleMatrix(settings.VRMenuScale) * offset; - vp = vpHeadSpace; - } - cbData.wvp = (modelMatrix * vp).Transpose(); - - drawOverlayQuad(context, cbData); - } - - // --- Render Controller Overlay --- - if ((settings.attachMode == AttachMode::ControllerOnly || settings.attachMode == AttachMode::Both) && menuTexture) { - vr::TrackedDeviceIndex_t attachIndex = Util::GetControllerIndexForDevice(settings.VRMenuAttachController, lastKnownLeftHandedMode); - if (attachIndex != vr::k_unTrackedDeviceIndexInvalid && attachIndex < vr::k_unMaxTrackedDeviceCount) { - vr::TrackedDevicePose_t controllerPose = renderPose[attachIndex]; - if (controllerPose.bPoseIsValid) { - Matrix controllerWorld = Util::HmdMatrix34ToMatrix(controllerPose.mDeviceToAbsoluteTracking); - Matrix offset = Matrix::CreateTranslation(settings.VRMenuControllerOffsetX, settings.VRMenuControllerOffsetY, settings.VRMenuControllerOffsetZ); - Matrix modelMatrix = VR::Config::CreateOverlayScaleMatrix(settings.VRMenuScale) * offset * controllerWorld; - - // Backface culling: hide overlay when viewed from behind - // Use the unscaled controller+offset transform for correct normal direction - Matrix overlayTransform = offset * controllerWorld; - Vector3 overlayNormal(overlayTransform._31, overlayTransform._32, overlayTransform._33); - overlayNormal.Normalize(); - Matrix eyeWorld = eyeToHead * hmdWorld; - Vector3 eyePos = eyeWorld.Translation(); - Vector3 overlayPos = overlayTransform.Translation(); - Vector3 toEye = eyePos - overlayPos; - toEye.Normalize(); - // Quad front face is +Z in local space (D3D default CW winding). - // Render when eye is on the +Z side of the overlay (dot > 0). - float dot = overlayNormal.Dot(toEye); - if (dot > 0.0f) { - InSceneCB cbData; - cbData.wvp = (modelMatrix * vpWorldSpace).Transpose(); - drawOverlayQuad(context, cbData); - } - } - } - } - - // Restore State - context->OMSetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, oldRTVs, oldDSV); - context->RSSetViewports(numViewports, oldViewports); - context->OMSetBlendState(oldBlend, oldBlendFactor, oldSampleMask); - context->OMSetDepthStencilState(oldDepth, oldStencilRef); - if (oldRS) { - context->RSSetState(oldRS); - oldRS->Release(); - } - if (oldBlend) - oldBlend->Release(); - if (oldDepth) - oldDepth->Release(); - for (int i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) - if (oldRTVs[i]) - oldRTVs[i]->Release(); - if (oldDSV) - oldDSV->Release(); - - if (perf) - perf->EndEvent(); -} - -void VR::InstallSubmitHook() -{ - static bool installed = false; - if (installed) - return; - - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - if (openvr && RE::BSOpenVR::GetIVRCompositor()) { - logger::info("VR: Installing IVRCompositor::Submit hook for in-scene overlay rendering"); - - // Log comprehensive VR system parameters (debug only) - logger::debug("=== VR System Configuration ==="); - - // Get and log IPD - float ipd = Util::GetIPDFromHMD(); - logger::debug("IPD: {:.4f} meters ({:.2f} mm)", ipd, ipd * 1000.0f); - - // Get and log eye transforms - if (openvr->vrSystem) { - vr::HmdMatrix34_t leftEye = openvr->vrSystem->GetEyeToHeadTransform(vr::Eye_Left); - vr::HmdMatrix34_t rightEye = openvr->vrSystem->GetEyeToHeadTransform(vr::Eye_Right); - - logger::debug("Left Eye Transform:"); - logger::debug(" Translation: X={:.4f}, Y={:.4f}, Z={:.4f}", - leftEye.m[0][3], leftEye.m[1][3], leftEye.m[2][3]); - logger::debug("Right Eye Transform:"); - logger::debug(" Translation: X={:.4f}, Y={:.4f}, Z={:.4f}", - rightEye.m[0][3], rightEye.m[1][3], rightEye.m[2][3]); - logger::debug("Calculated Eye Separation: {:.4f} meters ({:.2f} mm)", - std::abs(leftEye.m[0][3] - rightEye.m[0][3]), - std::abs(leftEye.m[0][3] - rightEye.m[0][3]) * 1000.0f); - - // Get projection matrices - vr::HmdMatrix44_t leftProj = openvr->vrSystem->GetProjectionMatrix(vr::Eye_Left, 0.1f, 1000.0f); - vr::HmdMatrix44_t rightProj = openvr->vrSystem->GetProjectionMatrix(vr::Eye_Right, 0.1f, 1000.0f); - - logger::debug("Projection Matrices (near=0.1, far=1000.0):"); - logger::debug(" Left [0][0]={:.4f}, [1][1]={:.4f}, [0][2]={:.4f}", - leftProj.m[0][0], leftProj.m[1][1], leftProj.m[0][2]); - logger::debug(" Right [0][0]={:.4f}, [1][1]={:.4f}, [0][2]={:.4f}", - rightProj.m[0][0], rightProj.m[1][1], rightProj.m[0][2]); - } - - logger::debug("Convergence Formula Info:"); - logger::debug(" Formula: stereoShift = (IPD/2) / (depth * tan(hFOV/2))"); - logger::debug(" - Shift is independent of scale (scale only controls size)"); - logger::debug(" - Depth is controlled by OffsetZ (negative = in front)"); - float halfIPD = ipd / 2.0f; - if (openvr->vrSystem) { - vr::HmdMatrix44_t proj = openvr->vrSystem->GetProjectionMatrix(vr::Eye_Left, 0.1f, 1000.0f); - float tanHFOV = 1.0f / proj.m[0][0]; - logger::debug(" tan(hFOV/2) = {:.4f}", tanHFOV); - logger::debug(" Example: At depth 1.0m, shift={:.6f}", halfIPD / (1.0f * tanHFOV)); - logger::debug(" Example: At depth 2.0m, shift={:.6f}", halfIPD / (2.0f * tanHFOV)); - logger::debug(" Example: At depth 5.0m, shift={:.6f}", halfIPD / (5.0f * tanHFOV)); - } - logger::debug("================================"); - - // IVRCompositor::Submit is index 5 - stl::detour_vfunc<5, IVRCompositor_Submit>(RE::BSOpenVR::GetIVRCompositor()); - installed = true; - - logger::info("VR: In-scene overlay initialized"); - } else { - logger::warn("VR: Failed to install IVRCompositor::Submit hook - Interface not available"); - } -} diff --git a/src/Features/VR/Input.cpp b/src/Features/VR/Input.cpp deleted file mode 100644 index b4c2278115..0000000000 --- a/src/Features/VR/Input.cpp +++ /dev/null @@ -1,383 +0,0 @@ -#include "Features/VR.h" -#include "Menu.h" -#include "State.h" -#include "Utils/PerfUtils.h" -#include "Utils/VRUtils.h" - -#include - -using AttachMode = VR::Settings::OverlayAttachMode; - -void VR::UpdateOverlayMenuStateFromInput() -{ - if (this->isCapturingCombo) { - return; - } - - if (globals::menu == nullptr) - return; - - bool& isEnabled = globals::menu->IsEnabled; - bool& overlayEnabled = globals::menu->overlayVisible; - bool& testMode = settings.VRMenuControllerDiagnosticsTestMode; - - if (testMode) { - if (!isEnabled) { - settings.VRMenuControllerDiagnosticsTestMode = false; - return; - } - return; - } - - bool uiMenusOpen = globals::state->isMainMenuOpen || - (globals::game::ui && globals::game::ui->IsMenuOpen(RE::TweenMenu::MENU_NAME)); - - bool inValidMenuState = uiMenusOpen || (globals::game::ui && (isEnabled || overlayEnabled)); - - if (!inValidMenuState) - return; - - struct MenuStateMapping - { - std::function condition; - std::function action; - bool allowWhenUIMenusClosed = false; - }; - - auto CheckCombo = [&](const std::vector& combos) -> bool { - if (combos.empty()) - return false; - - for (size_t i = 0; i < combos.size(); ++i) { - const auto& combo = combos[i]; - bool buttonPressed = false; - - switch (combo.GetDevice()) { - case ControllerDevice::Both: - buttonPressed = primaryControllerState[combo.GetKey()].isPressed && - secondaryControllerState[combo.GetKey()].isPressed; - break; - case ControllerDevice::Primary: - buttonPressed = primaryControllerState[combo.GetKey()].isPressed; - break; - case ControllerDevice::Secondary: - buttonPressed = secondaryControllerState[combo.GetKey()].isPressed; - break; - } - - if (!buttonPressed) { - return false; - } - } - - return true; - }; - - std::vector mappings = { - // Open Community Shaders menu when closed - { [&]() { - return CheckCombo(settings.VRMenuOpenKeys) && !isEnabled; - }, - [&]() { isEnabled = true; } }, - - // Close Community Shaders menu when open - { [&]() { - return CheckCombo(settings.VRMenuCloseKeys) && isEnabled; - }, - [&]() { - isEnabled = false; - overlayDragState.dragging = false; - }, - true }, - - // Open VR overlay when closed (only when CS menu is open) - { [&]() { - return CheckCombo(settings.VROverlayOpenKeys) && !overlayEnabled && isEnabled; - }, - [&]() { overlayEnabled = true; } }, - - // Close VR overlay when open (only when CS menu is open) - { [&]() { - return CheckCombo(settings.VROverlayCloseKeys) && overlayEnabled && isEnabled; - }, - [&]() { overlayEnabled = false; } } - }; - - bool onlyAllowClose = isEnabled && !uiMenusOpen; - - for (const auto& mapping : mappings) { - if (onlyAllowClose && !mapping.allowWhenUIMenusClosed) - continue; - - if (mapping.condition()) { - mapping.action(); - break; - } - } -} - -void VR::ProcessVREvents(std::vector& vrEvents) -{ - bool currentLeftHandedMode = RE::BSOpenVRControllerDevice::IsLeftHandedMode(); - static bool firstCall = true; - if (firstCall || currentLeftHandedMode != lastKnownLeftHandedMode) { - if (!firstCall) { - logger::debug("VR handedness changed: {} -> {}", lastKnownLeftHandedMode ? "Left" : "Right", currentLeftHandedMode ? "Left" : "Right"); - } - firstCall = false; - lastKnownLeftHandedMode = currentLeftHandedMode; - primaryControllerState = {}; - secondaryControllerState = {}; - } - - double nowSecs = Util::GetNowSecs(); - for (auto& event : vrEvents) { - bool isPrimary = RE::BSOpenVRControllerDevice::IsPrimaryController(event.device); - bool isSecondary = RE::BSOpenVRControllerDevice::IsSecondaryController(event.device); - struct VRButtonDescriptor - { - const char* name; - bool (*isButton)(std::uint32_t); - std::uint32_t keyCode; - }; - static const VRButtonDescriptor kVRButtons[] = { - { "Grip", RE::BSOpenVRControllerDevice::IsGripButton, RE::BSOpenVRControllerDevice::Keys::kGrip }, - { "GripAlt", RE::BSOpenVRControllerDevice::IsGripButton, RE::BSOpenVRControllerDevice::Keys::kGripAlt }, - { "Trigger", RE::BSOpenVRControllerDevice::IsTriggerButton, RE::BSOpenVRControllerDevice::Keys::kTrigger }, - { "Stick Click", RE::BSOpenVRControllerDevice::IsStickClick, RE::BSOpenVRControllerDevice::Keys::kJoystickTrigger }, - { "Touchpad Click", RE::BSOpenVRControllerDevice::IsTouchpadClick, RE::BSOpenVRControllerDevice::Keys::kTouchpadClick }, - { "Touchpad Alt", RE::BSOpenVRControllerDevice::IsTouchpadClick, RE::BSOpenVRControllerDevice::Keys::kTouchpadAlt }, - { "A/X", RE::BSOpenVRControllerDevice::IsAButton, RE::BSOpenVRControllerDevice::Keys::kXA }, - { "B/Y", RE::BSOpenVRControllerDevice::IsBButton, RE::BSOpenVRControllerDevice::Keys::kBY }, - }; - for (const auto& desc : kVRButtons) { - if (event.keyCode == desc.keyCode) { - RE::ButtonState* state = isPrimary ? &primaryControllerState[desc.keyCode] : isSecondary ? &secondaryControllerState[desc.keyCode] : - nullptr; - if (state) { - state->OnEvent(event.IsPressed(), nowSecs); - } - break; - } - } - switch (event.eventType) { - case RE::INPUT_EVENT_TYPE::kButton: - ProcessVRButtonEvent(event); - break; - case RE::INPUT_EVENT_TYPE::kThumbstick: - UpdateControllerState(event); - break; - default: - break; - } - } -} - -void VR::ProcessVRButtonEvent(const Menu::KeyEvent& event) -{ - if (this->isCapturingCombo) { - return; - } - - ImGuiIO& io = ImGui::GetIO(); - bool isPrimary = RE::BSOpenVRControllerDevice::IsPrimaryController(event.device); - bool isSecondary = RE::BSOpenVRControllerDevice::IsSecondaryController(event.device); - bool& testMode = settings.VRMenuControllerDiagnosticsTestMode; - constexpr size_t kNumTriggerMappings = 1; - - if (isPrimary || isSecondary) { - constexpr size_t kNumMappings = 6; - RE::ButtonMapping mappings[kNumMappings] = { - { RE::BSOpenVRControllerDevice::Keys::kTrigger, ImGuiMouseButton_Left, false, ImGuiKey_None, false }, - { RE::BSOpenVRControllerDevice::Keys::kGrip, ImGuiMouseButton_Right, false, ImGuiKey_None, false }, - { RE::BSOpenVRControllerDevice::Keys::kTouchpadClick, ImGuiMouseButton_Middle, false, ImGuiKey_None, false }, - { RE::BSOpenVRControllerDevice::Keys::kJoystickTrigger, ImGuiMouseButton_Middle, false, ImGuiKey_None, false }, - { RE::BSOpenVRControllerDevice::Keys::kBY, -1, true, Util::Input::VirtualKeyToImGuiKey(VK_TAB), isSecondary }, - { RE::BSOpenVRControllerDevice::Keys::kXA, -1, true, Util::Input::VirtualKeyToImGuiKey(VK_RETURN), false }, - }; - - static bool prevPrimaryStates[kNumMappings] = {}; - static bool prevSecondaryStates[kNumMappings] = {}; - static bool lastHandedness = false; - if (lastHandedness != lastKnownLeftHandedMode) { - memset(prevPrimaryStates, 0, sizeof(prevPrimaryStates)); - memset(prevSecondaryStates, 0, sizeof(prevSecondaryStates)); - lastHandedness = lastKnownLeftHandedMode; - } - bool* prevStates = isPrimary ? prevPrimaryStates : prevSecondaryStates; - - RE::InputDeviceState& controllerState = isPrimary ? primaryControllerState : secondaryControllerState; - - size_t limit = testMode ? kNumTriggerMappings : kNumMappings; - - for (size_t i = 0; i < limit; ++i) { - RE::ButtonState* state = &controllerState[mappings[i].keyCode]; - bool curr = state ? state->isPressed : false; - if (curr != prevStates[i]) { - if (mappings[i].isKeyEvent) { - if (mappings[i].isShift) - io.AddKeyEvent(ImGuiMod_Shift, curr); - io.AddKeyEvent(static_cast(mappings[i].key), curr); - } else { - io.AddMouseButtonEvent(mappings[i].logicalButton, curr); - } - prevStates[i] = curr; - } - } - } - - VRControllerEventLog logEntry; - logEntry.device = static_cast(event.device); - logEntry.keyCode = event.keyCode; - logEntry.value = static_cast(event.value); - logEntry.pressed = event.IsPressed(); - logEntry.heldTime = 0.0; - logEntry.heldSource = "button"; - logEntry.thumbstickX = 0.0f; - logEntry.thumbstickY = 0.0f; - logEntry.controllerRole = isPrimary ? "Primary" : isSecondary ? "Secondary" : - "Unknown"; - vrControllerEventLog.push_back(logEntry); - if (vrControllerEventLog.size() > 32) { - vrControllerEventLog.erase(vrControllerEventLog.begin()); - } -} - -void VR::UpdateControllerState(const Menu::KeyEvent& event) -{ - bool isPrimary = RE::BSOpenVRControllerDevice::IsPrimaryController(event.device); - bool isSecondary = RE::BSOpenVRControllerDevice::IsSecondaryController(event.device); - - if (isPrimary) { - primaryControllerState.thumbsticks[static_cast(RE::ControllerRole::Primary)].x = event.thumbstickX; - primaryControllerState.thumbsticks[static_cast(RE::ControllerRole::Primary)].y = event.thumbstickY; - } else if (isSecondary) { - secondaryControllerState.thumbsticks[static_cast(RE::ControllerRole::Secondary)].x = event.thumbstickX; - secondaryControllerState.thumbsticks[static_cast(RE::ControllerRole::Secondary)].y = event.thumbstickY; - } - - VRControllerEventLog logEntry; - logEntry.device = static_cast(event.device); - logEntry.keyCode = event.keyCode; - logEntry.value = static_cast(event.value); - logEntry.pressed = event.IsPressed(); - logEntry.heldTime = 0.0; - logEntry.heldSource = "thumbstick"; - logEntry.thumbstickX = event.thumbstickX; - logEntry.thumbstickY = event.thumbstickY; - logEntry.controllerRole = isPrimary ? "Primary" : "Secondary"; - vrControllerEventLog.push_back(logEntry); - if (vrControllerEventLog.size() > 32) { - vrControllerEventLog.erase(vrControllerEventLog.begin()); - } -} - -void VR::ProcessThumbstickScroll(RE::VRControllerState& controllerState, size_t thumbstickIndex, float deadzone, ImGuiIO& io) -{ - bool usingScrollStickX = (std::abs(controllerState.thumbsticks[thumbstickIndex].x) > deadzone); - bool usingScrollStickY = (std::abs(controllerState.thumbsticks[thumbstickIndex].y) > deadzone); - - if (usingScrollStickX || usingScrollStickY) { - struct ScrollAccum - { - float x = 0.0f; - float y = 0.0f; - }; - static std::unordered_map scrollAccums; - ScrollAccum& accum = scrollAccums[thumbstickIndex]; - - accum.x += controllerState.thumbsticks[thumbstickIndex].x * 0.1f; - accum.y += controllerState.thumbsticks[thumbstickIndex].y * 0.1f; - - float scrollEventX = 0.0f; - float scrollEventY = 0.0f; - - if (std::abs(accum.x) > 0.3f) { - scrollEventX = accum.x > 0 ? 1.0f : -1.0f; - accum.x = 0.0f; - } - if (std::abs(accum.y) > 0.3f) { - scrollEventY = accum.y > 0 ? 1.0f : -1.0f; - accum.y = 0.0f; - } - - if (scrollEventX != 0.0f || scrollEventY != 0.0f) { - io.AddMouseWheelEvent(-scrollEventX, scrollEventY); - } - } -} - -void VR::ProcessControllerInputForImGui() -{ - if (!globals::menu || !globals::menu->IsEnabled) - return; - bool testMode = settings.VRMenuControllerDiagnosticsTestMode; - float mouseDeadzone = settings.mouseDeadzone; - float mouseSpeed = settings.mouseSpeed; - ImGuiIO& io = ImGui::GetIO(); - io.ConfigFlags &= ~ImGuiConfigFlags_NoMouseCursorChange; - io.WantSetMousePos = false; - - bool wandHandledCursor = false; - if (!testMode && settings.EnableWandPointing) { - UpdateCursorFromWandPointing(); - wandHandledCursor = wandState.isIntersecting; - } - - if (!testMode) { - bool isDragging = overlayDragState.dragging; - - if (wandHandledCursor && !isDragging) { - ProcessThumbstickScroll(primaryControllerState, static_cast(RE::ControllerRole::Primary), mouseDeadzone, io); - ProcessThumbstickScroll(secondaryControllerState, static_cast(RE::ControllerRole::Secondary), mouseDeadzone, io); - } else if (!isDragging) { - bool useAttachedControllerForCursor = (settings.attachMode == VR::Settings::OverlayAttachMode::ControllerOnly || - settings.attachMode == VR::Settings::OverlayAttachMode::Both); - - RE::VRControllerState* cursorController = nullptr; - RE::VRControllerState* scrollController = nullptr; - - if (useAttachedControllerForCursor) { - if (settings.VRMenuAttachController == ControllerDevice::Primary) { - cursorController = &primaryControllerState; - scrollController = &secondaryControllerState; - } else { - cursorController = &secondaryControllerState; - scrollController = &primaryControllerState; - } - } else { - cursorController = &primaryControllerState; - scrollController = &secondaryControllerState; - } - - if (cursorController) { - size_t thumbstickIndex = (cursorController == &primaryControllerState) ? - static_cast(RE::ControllerRole::Primary) : - static_cast(RE::ControllerRole::Secondary); - - float thumbstickX = cursorController->thumbsticks[thumbstickIndex].x; - float thumbstickY = cursorController->thumbsticks[thumbstickIndex].y; - bool usingCursorStick = (std::abs(thumbstickX) > mouseDeadzone || std::abs(thumbstickY) > mouseDeadzone); - - if (usingCursorStick) { - ImVec2 mousePos = io.MousePos; - mousePos.x += thumbstickX * mouseSpeed; - mousePos.y -= thumbstickY * mouseSpeed; - mousePos.x = std::clamp(mousePos.x, 0.0f, io.DisplaySize.x); - mousePos.y = std::clamp(mousePos.y, 0.0f, io.DisplaySize.y); - io.MousePos = mousePos; - io.AddMousePosEvent(mousePos.x, mousePos.y); - io.MouseDrawCursor = true; - io.WantSetMousePos = true; - } - } - - if (scrollController) { - size_t thumbstickIndex = (scrollController == &primaryControllerState) ? - static_cast(RE::ControllerRole::Primary) : - static_cast(RE::ControllerRole::Secondary); - ProcessThumbstickScroll(*scrollController, thumbstickIndex, mouseDeadzone, io); - } - } - } -} diff --git a/src/Features/VR/OpenVRDetection.cpp b/src/Features/VR/OpenVRDetection.cpp deleted file mode 100644 index 78223d28b9..0000000000 --- a/src/Features/VR/OpenVRDetection.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "OpenVRDetection.h" -#include -#include -#include -#include -#include -#pragma comment(lib, "version.lib") - -namespace VRDetection -{ - const char* RuntimeTypeToString(RuntimeType type) - { - switch (type) { - case RuntimeType::SteamVR: - return "SteamVR"; - case RuntimeType::OpenComposite: - return "OpenComposite"; - default: - return "Unknown"; - } - } - - bool ProbeRuntimeInterfaces(OpenVRDetectionResult& result) - { - HMODULE hModule = GetModuleHandleA("openvr_api.dll"); - if (!hModule) - return false; - - using pfnIsValid = bool(__cdecl*)(const char*); - auto IsValid = reinterpret_cast(GetProcAddress(hModule, "VR_IsInterfaceVersionValid")); - if (!IsValid) - return false; - - result.hasOverlayInterface = IsValid(vr::IVROverlay_Version); - result.hasSystemInterface = IsValid(vr::IVRSystem_Version); - result.hasCompositorInterface = IsValid(vr::IVRCompositor_Version); - - result.probingSucceeded = result.hasOverlayInterface && result.hasSystemInterface && result.hasCompositorInterface; - return result.probingSucceeded; - } - - void GatherDLLInfo(OpenVRDetectionResult& result) - { - HMODULE hModule = GetModuleHandleA("openvr_api.dll"); - if (!hModule) { - result.isAvailable = false; - return; - } - - result.isAvailable = true; - - char dllPath[MAX_PATH]; - DWORD fileLength = GetModuleFileNameA(hModule, dllPath, MAX_PATH); - if (fileLength == 0 || (fileLength == MAX_PATH && GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { - result.isAvailable = false; - return; - } - - result.dllPath = dllPath; - - DWORD dwSize = GetFileVersionInfoSizeA(dllPath, nullptr); - if (dwSize > 0) { - std::vector buffer(dwSize); - if (GetFileVersionInfoA(dllPath, 0, dwSize, buffer.data())) { - VS_FIXEDFILEINFO* pFileInfo = nullptr; - UINT len = 0; - if (VerQueryValueA(buffer.data(), "\\", reinterpret_cast(&pFileInfo), &len)) { - DWORD major = HIWORD(pFileInfo->dwFileVersionMS); - DWORD minor = LOWORD(pFileInfo->dwFileVersionMS); - DWORD build = HIWORD(pFileInfo->dwFileVersionLS); - DWORD revision = LOWORD(pFileInfo->dwFileVersionLS); - result.version = std::format("{}.{}.{}.{}", major, minor, build, revision); - } - } - } - - if (result.version.empty()) - result.version = "Unknown"; - - WIN32_FIND_DATAA findData; - HANDLE hFind = FindFirstFileA(dllPath, &findData); - if (hFind != INVALID_HANDLE_VALUE) { - FindClose(hFind); - ULARGE_INTEGER fileSize; - fileSize.LowPart = findData.nFileSizeLow; - fileSize.HighPart = findData.nFileSizeHigh; - result.fileSize = fileSize.QuadPart; - - SYSTEMTIME st; - FileTimeToSystemTime(&findData.ftLastWriteTime, &st); - result.modificationTime = std::format("{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}", - st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); - } - } - - RuntimeType DetectRuntimeType(const std::string& dllPath, const std::string& version, uint64_t fileSize) - { - // OpenComposite DLLs are typically small (~600KB) with version 1.0.10.0 - if (version == "1.0.10.0" && fileSize < 700000) - return RuntimeType::OpenComposite; - - // Check path for OpenComposite indicators - std::string lowerPath = dllPath; - for (auto& c : lowerPath) - c = static_cast(std::tolower(static_cast(c))); - - if (lowerPath.find("opencomposite") != std::string::npos) - return RuntimeType::OpenComposite; - - // SteamVR DLLs are typically larger and have higher version numbers - if (lowerPath.find("steamvr") != std::string::npos || lowerPath.find("steam") != std::string::npos) - return RuntimeType::SteamVR; - - // Higher version numbers suggest SteamVR - if (!version.empty() && version != "Unknown" && version != "1.0.10.0") - return RuntimeType::SteamVR; - - return RuntimeType::Unknown; - } - - OpenVRDetectionResult Detect() - { - OpenVRDetectionResult result; - - GatherDLLInfo(result); - if (!result.isAvailable) - return result; - - result.runtimeType = DetectRuntimeType(result.dllPath, result.version, result.fileSize); - - // Detect compatibility via runtime interface probing - result.isCompatible = ProbeRuntimeInterfaces(result); - - return result; - } -} diff --git a/src/Features/VR/OpenVRDetection.h b/src/Features/VR/OpenVRDetection.h deleted file mode 100644 index 1eaa411272..0000000000 --- a/src/Features/VR/OpenVRDetection.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include -#include - -namespace VRDetection -{ - enum class RuntimeType - { - Unknown, - SteamVR, - OpenComposite - }; - - struct OpenVRDetectionResult - { - bool isAvailable = false; - bool isCompatible = false; - - // Interface probing results - bool hasOverlayInterface = false; - bool hasSystemInterface = false; - bool hasCompositorInterface = false; - - // File-based info - std::string dllPath; - std::string version; - uint64_t fileSize = 0; - std::string modificationTime; - - // Detection metadata - RuntimeType runtimeType = RuntimeType::Unknown; - bool probingSucceeded = false; - }; - - // Runtime interface probing via VR_IsInterfaceVersionValid - bool ProbeRuntimeInterfaces(OpenVRDetectionResult& result); - - // Gather DLL metadata (path, version, size, timestamp) - void GatherDLLInfo(OpenVRDetectionResult& result); - - // Detect runtime type (SteamVR vs OpenComposite) - RuntimeType DetectRuntimeType(const std::string& dllPath, const std::string& version, uint64_t fileSize); - - // Full detection via interface probing - OpenVRDetectionResult Detect(); - - const char* RuntimeTypeToString(RuntimeType type); -} diff --git a/src/Features/VR/OverlayDrag.cpp b/src/Features/VR/OverlayDrag.cpp deleted file mode 100644 index bd0180b33c..0000000000 --- a/src/Features/VR/OverlayDrag.cpp +++ /dev/null @@ -1,405 +0,0 @@ -#include "Features/VR.h" -#include "RE/B/BSOpenVR.h" -#include "RE/P/PlayerCharacter.h" -#include "Utils/VRUtils.h" - -#include -#include -#include -#include -#include - -using namespace DirectX::SimpleMath; -using AttachMode = VR::Settings::OverlayAttachMode; - -bool VR::GetGripPressed(bool isLeft, bool isRight) const -{ - bool isLeftHanded = lastKnownLeftHandedMode; - - if (isLeft) { - if (isLeftHanded) { - return primaryControllerState[RE::BSOpenVRControllerDevice::Keys::kGrip].isPressed; - } else { - return secondaryControllerState[RE::BSOpenVRControllerDevice::Keys::kGrip].isPressed; - } - } - if (isRight) { - if (isLeftHanded) { - return secondaryControllerState[RE::BSOpenVRControllerDevice::Keys::kGrip].isPressed; - } else { - return primaryControllerState[RE::BSOpenVRControllerDevice::Keys::kGrip].isPressed; - } - } - return false; -} - -static bool CanStartAny(vr::ETrackedControllerRole role) -{ - return role != vr::TrackedControllerRole_Invalid; -} - -void VR::UpdateOverlayDrag() -{ - if (!CanPerformDrag()) { - return; - } - - if (overlayDragState.dragging) { - UpdateActiveDrag(); - } else { - TryStartNewDrag(); - } -} - -bool VR::CanPerformDrag() -{ - if (!settings.EnableDragToReposition) - return false; - - if (!globals::menu || !globals::menu->IsEnabled) - return false; - - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - auto* system = openvr ? openvr->vrSystem : nullptr; - if (!system) - return false; - - if (settings.VRMenuControllerDiagnosticsTestMode) { - return false; - } - - return true; -} - -void VR::UpdateActiveDrag() -{ - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - auto* system = openvr ? openvr->vrSystem : nullptr; - if (!system) - return; - - auto resetDragState = [&]() { - overlayDragState.dragging = false; - overlayDragState.controllerIndex = vr::k_unTrackedDeviceIndexInvalid; - overlayDragState.isPrimary = false; - overlayDragState.isSecondary = false; - }; - - float rawMatrix[3][4]; - if (Util::GetControllerWorldMatrix(overlayDragState.controllerIndex, rawMatrix)) { - vr::HmdMatrix34_t mat = Util::Float3x4ToHmdMatrix34(rawMatrix); - Matrix controllerMatrix = Util::HmdMatrix34ToMatrix(mat); - - switch (overlayDragState.mode) { - case OverlayDragState::DragMode::Controller: - { - vr::TrackedDeviceIndex_t attachedControllerIndex = Util::GetControllerIndexForDevice(settings.VRMenuAttachController, lastKnownLeftHandedMode); - - if (attachedControllerIndex != vr::k_unTrackedDeviceIndexInvalid) { - float attachedM[3][4]; - if (!Util::GetControllerWorldMatrix(attachedControllerIndex, attachedM)) - break; - { - Matrix attachedControllerMatrix = Util::HmdMatrix34ToMatrix(Util::Float3x4ToHmdMatrix34(attachedM)); - - Vector3 worldDelta( - controllerMatrix._41 - overlayDragState.initialControllerMatrix._41, - controllerMatrix._42 - overlayDragState.initialControllerMatrix._42, - controllerMatrix._43 - overlayDragState.initialControllerMatrix._43); - - Matrix worldToLocal = attachedControllerMatrix.Invert(); - Vector3 localDelta = Vector3::TransformNormal(worldDelta, worldToLocal); - - settings.VRMenuControllerOffsetX = overlayDragState.initialControllerOffset.x + localDelta.x; - settings.VRMenuControllerOffsetY = overlayDragState.initialControllerOffset.y + localDelta.y; - settings.VRMenuControllerOffsetZ = overlayDragState.initialControllerOffset.z + localDelta.z; - } - } - break; - } - case OverlayDragState::DragMode::FixedWorld: - { - Vector3 worldDelta( - controllerMatrix._41 - overlayDragState.initialControllerMatrix._41, - controllerMatrix._42 - overlayDragState.initialControllerMatrix._42, - controllerMatrix._43 - overlayDragState.initialControllerMatrix._43); - Matrix translated = overlayDragState.initialOverlayMatrix; - translated._41 += worldDelta.x; - translated._42 += worldDelta.y; - translated._43 += worldDelta.z; - fixedWorldOverlayPosition.m = translated; - break; - } - case OverlayDragState::DragMode::HMD: - { - vr::TrackedDevicePose_t hmdPose; - if (!Util::GetDeviceToAbsoluteTrackingPoseCompatible(vr::TrackingUniverseStanding, 0, &hmdPose, 1)) - break; - if (hmdPose.bPoseIsValid) { - Matrix hmdMatrix = Util::HmdMatrix34ToMatrix(hmdPose.mDeviceToAbsoluteTracking); - - Vector3 worldDelta( - controllerMatrix._41 - overlayDragState.initialControllerMatrix._41, - controllerMatrix._42 - overlayDragState.initialControllerMatrix._42, - controllerMatrix._43 - overlayDragState.initialControllerMatrix._43); - - Matrix worldToLocal = hmdMatrix.Invert(); - Vector3 localDelta = Vector3::TransformNormal(worldDelta, worldToLocal); - - static auto lastDeltaLog = std::chrono::steady_clock::now(); - auto nowDelta = std::chrono::steady_clock::now(); - if (std::chrono::duration_cast(nowDelta - lastDeltaLog).count() > 500) { - logger::debug("VR Drag Delta - Local: ({:.3f}, {:.3f}, {:.3f})", localDelta.x, localDelta.y, localDelta.z); - lastDeltaLog = nowDelta; - } - - settings.VRMenuOffsetX = overlayDragState.initialHMDOffset.x + localDelta.x; - settings.VRMenuOffsetY = overlayDragState.initialHMDOffset.y + localDelta.y; - settings.VRMenuOffsetZ = overlayDragState.initialHMDOffset.z + localDelta.z; - settings.VRMenuScale = overlayDragState.initialHMDScale; - - static std::chrono::steady_clock::time_point lastLog = std::chrono::steady_clock::now(); - auto now = std::chrono::steady_clock::now(); - if (std::chrono::duration_cast(now - lastLog).count() > 500) { - logger::debug("VR Dragging (3D Mode): Offset ({:.2f}, {:.2f}, {:.2f}), Scale {:.2f}", - settings.VRMenuOffsetX, settings.VRMenuOffsetY, settings.VRMenuOffsetZ, settings.VRMenuScale); - lastLog = now; - } - } - break; - } - default: - break; - } - } - - // Joystick depth control during grip - if (overlayDragState.dragging) { - RE::VRControllerState* gripController = nullptr; - size_t thumbIdx = 0; - if (overlayDragState.isPrimary) { - if (lastKnownLeftHandedMode) { - gripController = &primaryControllerState; - thumbIdx = static_cast(RE::ControllerRole::Primary); - } else { - gripController = &secondaryControllerState; - thumbIdx = static_cast(RE::ControllerRole::Secondary); - } - } else if (overlayDragState.isSecondary) { - if (lastKnownLeftHandedMode) { - gripController = &secondaryControllerState; - thumbIdx = static_cast(RE::ControllerRole::Secondary); - } else { - gripController = &primaryControllerState; - thumbIdx = static_cast(RE::ControllerRole::Primary); - } - } - - if (gripController) { - float thumbY = gripController->thumbsticks[thumbIdx].y; - const float deadzone = settings.mouseDeadzone; - const float depthSpeed = 0.02f; - if (std::abs(thumbY) > deadzone) { - float depthDelta = -thumbY * depthSpeed; - if (overlayDragState.mode == OverlayDragState::DragMode::HMD) { - overlayDragState.initialHMDOffset.z += depthDelta; - overlayDragState.initialHMDOffset.z = std::clamp(overlayDragState.initialHMDOffset.z, -10.0f, 10.0f); - } else if (overlayDragState.mode == OverlayDragState::DragMode::Controller) { - overlayDragState.initialControllerOffset.z += depthDelta; - overlayDragState.initialControllerOffset.z = std::clamp(overlayDragState.initialControllerOffset.z, -10.0f, 10.0f); - } - } - } - } - - bool gripPressed = GetGripPressed(overlayDragState.isPrimary, overlayDragState.isSecondary); - if (!gripPressed) { - resetDragState(); - } -} - -void VR::TryStartNewDrag() -{ - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - auto* system = openvr ? openvr->vrSystem : nullptr; - if (!system) - return; - - struct DragMode - { - OverlayDragState::DragMode mode; - bool isActive; - std::function canStart; - std::function onInit; - }; - - std::vector dragModes; - - // Controller mode - only for opposite hand (highest priority) - if (settings.attachMode == AttachMode::ControllerOnly || settings.attachMode == AttachMode::Both) { - dragModes.push_back({ OverlayDragState::DragMode::Controller, - true, - [&](vr::ETrackedControllerRole role) { - vr::TrackedDeviceIndex_t attachedControllerIndex = Util::GetControllerIndexForDevice(settings.VRMenuAttachController, lastKnownLeftHandedMode); - if (attachedControllerIndex == vr::k_unTrackedDeviceIndexInvalid) - return false; - - ControllerDevice oppositeDevice = (settings.VRMenuAttachController == ControllerDevice::Primary) ? - ControllerDevice::Secondary : - ControllerDevice::Primary; - vr::TrackedDeviceIndex_t oppositeControllerIndex = Util::GetControllerIndexForDevice(oppositeDevice, lastKnownLeftHandedMode); - if (oppositeControllerIndex == vr::k_unTrackedDeviceIndexInvalid) - return false; - - for (vr::TrackedDeviceIndex_t i = 0; i < vr::k_unMaxTrackedDeviceCount; ++i) { - if (system->GetTrackedDeviceClass(i) == vr::TrackedDeviceClass_Controller) { - vr::ETrackedControllerRole deviceRole = system->GetControllerRoleForTrackedDeviceIndex(i); - if (deviceRole == role && i == oppositeControllerIndex) - return true; - } - } - return false; - }, - [&]() { - overlayDragState.initialControllerOffset.x = settings.VRMenuControllerOffsetX; - overlayDragState.initialControllerOffset.y = settings.VRMenuControllerOffsetY; - overlayDragState.initialControllerOffset.z = settings.VRMenuControllerOffsetZ; - overlayDragState.initialControllerMatrix = overlayDragState.startControllerMatrix; - } }); - } - - // Fixed world mode - if (settings.VRMenuPositioningMethod == 1) { - std::function fixedWorldCanStart; - if (settings.attachMode == AttachMode::Both) { - fixedWorldCanStart = [&](vr::ETrackedControllerRole role) { - vr::TrackedDeviceIndex_t attachedControllerIndex = Util::GetControllerIndexForDevice(settings.VRMenuAttachController, lastKnownLeftHandedMode); - if (attachedControllerIndex != vr::k_unTrackedDeviceIndexInvalid) { - vr::ETrackedControllerRole actualAttachedRole = system->GetControllerRoleForTrackedDeviceIndex(attachedControllerIndex); - return role == actualAttachedRole; - } - return false; - }; - } else { - fixedWorldCanStart = CanStartAny; - } - - dragModes.push_back({ OverlayDragState::DragMode::FixedWorld, - true, - fixedWorldCanStart, - [&]() { - overlayDragState.initialControllerMatrix = overlayDragState.startControllerMatrix; - overlayDragState.initialOverlayMatrix = fixedWorldOverlayPosition.m; - } }); - } - - // HMD mode - if (settings.attachMode == AttachMode::HMDOnly || settings.attachMode == AttachMode::Both) { - std::function hmdCanStart; - if (settings.attachMode == AttachMode::Both) { - hmdCanStart = [&](vr::ETrackedControllerRole role) { - vr::TrackedDeviceIndex_t attachedControllerIndex = Util::GetControllerIndexForDevice(settings.VRMenuAttachController, lastKnownLeftHandedMode); - if (attachedControllerIndex != vr::k_unTrackedDeviceIndexInvalid) { - vr::ETrackedControllerRole actualAttachedRole = system->GetControllerRoleForTrackedDeviceIndex(attachedControllerIndex); - return role == actualAttachedRole; - } - return false; - }; - } else { - hmdCanStart = CanStartAny; - } - - dragModes.push_back({ OverlayDragState::DragMode::HMD, - true, - hmdCanStart, - [&]() { - overlayDragState.initialHMDOffset.x = settings.VRMenuOffsetX; - overlayDragState.initialHMDOffset.y = settings.VRMenuOffsetY; - overlayDragState.initialHMDOffset.z = settings.VRMenuOffsetZ; - overlayDragState.initialHMDScale = settings.VRMenuScale; - overlayDragState.initialControllerMatrix = overlayDragState.startControllerMatrix; - } }); - } - - for (const auto& mode : dragModes) { - if (!mode.isActive) - continue; - for (vr::TrackedDeviceIndex_t i = 0; i < vr::k_unMaxTrackedDeviceCount; ++i) { - if (system->GetTrackedDeviceClass(i) != vr::TrackedDeviceClass_Controller) - continue; - vr::ETrackedControllerRole role = system->GetControllerRoleForTrackedDeviceIndex(i); - bool isLeft = (role == vr::ETrackedControllerRole::TrackedControllerRole_LeftHand); - bool isRight = (role == vr::ETrackedControllerRole::TrackedControllerRole_RightHand); - if (!mode.canStart(role)) - continue; - bool gripPressed = GetGripPressed(isLeft, isRight); - if (!gripPressed) - continue; - float rawMatrix[3][4]; - if (!Util::GetControllerWorldMatrix(i, rawMatrix)) - continue; - vr::HmdMatrix34_t mat = Util::Float3x4ToHmdMatrix34(rawMatrix); - Matrix controllerMatrix = Util::HmdMatrix34ToMatrix(mat); - overlayDragState.dragging = true; - overlayDragState.mode = mode.mode; - overlayDragState.controllerIndex = i; - overlayDragState.isPrimary = isLeft; - overlayDragState.isSecondary = isRight; - overlayDragState.startControllerMatrix = controllerMatrix; - mode.onInit(); - - if (system && globals::menu->IsEnabled) { - for (vr::TrackedDeviceIndex_t deviceIdx = 0; deviceIdx < vr::k_unMaxTrackedDeviceCount; ++deviceIdx) { - if (system->GetTrackedDeviceClass(deviceIdx) == vr::TrackedDeviceClass_Controller) { - vr::ETrackedControllerRole deviceRole = system->GetControllerRoleForTrackedDeviceIndex(deviceIdx); - bool isRightController = (deviceRole == vr::ETrackedControllerRole::TrackedControllerRole_RightHand); - if (isRightController == isRight) { - openvr->TriggerHapticPulse(isRightController, 25.0f); - break; - } - } - } - } - - return; - } - } -} - -void VR::SetFixedOverlayToCurrentHMD() -{ - vr::HmdMatrix34_t transform = Util::ComputeOverlayTransformFromHMD( - settings.VRMenuOffsetX, - settings.VRMenuOffsetY, - settings.VRMenuOffsetZ); - fixedWorldOverlayPosition.m = Util::HmdMatrix34ToMatrix(transform); -} - -void VR::UpdateFixedWorldPositioning() -{ - if (settings.VRMenuPositioningMethod != 1) - return; - - if (!fixedWorldOverlayPosition.initialized) { - fixedWorldOverlayPosition.initialized = true; - SetFixedOverlayToCurrentHMD(); - auto player = RE::PlayerCharacter::GetSingleton(); - if (player) { - savedPlayerWorldPos = player->GetPosition(); - } - return; - } - - if (settings.VRMenuAutoResetDistance > 0.0f) { - auto player = RE::PlayerCharacter::GetSingleton(); - if (player) { - RE::NiPoint3 playerPos = player->GetPosition(); - float sqDist = playerPos.GetSquaredDistance(savedPlayerWorldPos); - float thresholdSq = settings.VRMenuAutoResetDistance * settings.VRMenuAutoResetDistance; - if (sqDist > thresholdSq) { - SetFixedOverlayToCurrentHMD(); - savedPlayerWorldPos = playerPos; - } - } - } -} diff --git a/src/Features/VR/SettingsUI.cpp b/src/Features/VR/SettingsUI.cpp deleted file mode 100644 index 08819d2084..0000000000 --- a/src/Features/VR/SettingsUI.cpp +++ /dev/null @@ -1,1139 +0,0 @@ -#include "FeatureConstraints.h" -#include "Features/DynamicCubemaps.h" -#include "Features/ScreenSpaceGI.h" -#include "Features/ScreenSpaceShadows.h" -#include "Features/VR.h" -#include "Menu.h" -#include "Menu/Fonts.h" -#include "RE/B/BSOpenVR.h" -#include "RE/P/PlayerCharacter.h" -#include "State.h" -#include "Utils/PerfUtils.h" -#include "Utils/UI.h" -#include "Utils/VRUtils.h" - -#include - -using AttachMode = VR::Settings::OverlayAttachMode; - -namespace -{ - bool BeginTabItemWithFont(const char* label, Menu::FontRole role, ImGuiTabItemFlags flags = ImGuiTabItemFlags_None) - { - return MenuFonts::BeginTabItemWithFont(label, role, flags); - } -} - -//============================================================================= -// COMBO RECORDING HELPERS -//============================================================================= - -void VR::ResetComboRecording() -{ - isCapturingCombo = false; - currentComboType = ComboType::None; - currentComboName = nullptr; - recordedCombo.clear(); - comboStartTime = 0.0; - recordingButtonControllers.clear(); -} - -void VR::ApplyRecordedCombo() -{ - if (recordedCombo.empty()) - return; - - switch (currentComboType) { - case ComboType::MenuOpen: - settings.VRMenuOpenKeys = recordedCombo; - break; - case ComboType::MenuClose: - settings.VRMenuCloseKeys = recordedCombo; - break; - case ComboType::OverlayOpen: - settings.VROverlayOpenKeys = recordedCombo; - break; - case ComboType::OverlayClose: - settings.VROverlayCloseKeys = recordedCombo; - break; - default: - break; - } -} - -//============================================================================= -// OVERLAY (WELCOME MESSAGE) -//============================================================================= - -void VR::DrawOverlay() -{ - auto& vr = globals::features::vr; - if (!vr.IsOpenVRCompatible()) - return; - static LARGE_INTEGER overlayShowStart = { 0 }; - static LARGE_INTEGER freq = { 0 }; - - bool shouldShow = IsWelcomeOverlayVisible(); - - if (!shouldShow) { - overlayShowStart.QuadPart = 0; - return; - } - - if (freq.QuadPart == 0) { - QueryPerformanceFrequency(&freq); - } - - LARGE_INTEGER now; - QueryPerformanceCounter(&now); - - if (overlayShowStart.QuadPart == 0) { - overlayShowStart = now; - } - - double elapsed = double(now.QuadPart - overlayShowStart.QuadPart) / double(freq.QuadPart); - const double autoHideSeconds = static_cast(settings.kAutoHideSeconds); - if (elapsed >= autoHideSeconds) { - return; - } - int secondsLeft = int(std::ceil(autoHideSeconds - elapsed)); - - ImGuiIO& io = ImGui::GetIO(); - const float scale = Util::GetUIScale(); - ImVec2 overlaySize(520 * scale, 0); - ImVec2 overlayPos = ImVec2((io.DisplaySize.x - overlaySize.x) * 0.5f, (io.DisplaySize.y * 0.35f)); - ImGui::SetNextWindowPos(overlayPos, ImGuiCond_Always); - ImGui::SetNextWindowSize(overlaySize, ImGuiCond_Always); - ImGui::SetNextWindowBgAlpha(0.95f); - - ImGui::Begin("HowToUseOverlay", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav); - - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 500.0f * scale); - ImGui::TextWrapped("How to Use VR Community Shaders Menu:"); - ImGui::Separator(); - ImGui::TextWrapped("You must open the Main Menu or Tween Menu before VR controls work."); - ImGui::Spacing(); - ImGui::PopTextWrapPos(); - - ImGui::Text("Open Menu: "); - ImGui::SameLine(); - Util::DrawButtonCombo(settings.VRMenuOpenKeys, true); - - ImGui::Text("Close Menu: "); - ImGui::SameLine(); - Util::DrawButtonCombo(settings.VRMenuCloseKeys, true); - - ImGui::Spacing(); - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 500.0f * scale); - ImGui::TextWrapped("Grip + Thumbstick: Adjust overlay depth (closer/farther)"); - ImGui::Spacing(); - ImGui::TextWrapped("Tip: Disable this VR overlay by setting Attach Mode to 'None' in VR settings."); - ImGui::Spacing(); - ImGui::TextWrapped("(This welcome message will auto-hide in %d seconds)", secondsLeft); - ImGui::TextWrapped("(Disable in: VR settings > Controller Input Instructions)"); - ImGui::PopTextWrapPos(); - - ImGui::End(); -} - -//============================================================================= -// ANONYMOUS NAMESPACE: SETTINGS PANEL DRAW FUNCTIONS -//============================================================================= - -namespace -{ - void DrawControllerInputInstructions() - { - auto& vr = globals::features::vr; - auto& settings = vr.settings; - if (!vr.IsOpenVRCompatible()) - return; - if (ImGui::CollapsingHeader("Controller Input Instructions", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::SliderInt("Auto-hide Welcome overlay timeout", &settings.kAutoHideSeconds, 0, VR::Config::kMaxAutoHideSeconds, - settings.kAutoHideSeconds <= 0 ? "Hidden" : "%d seconds"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Set to 0 to hide the overlay, or a positive value to show it for that many seconds"); - } - ImGui::TextWrapped("Menu (while in the main menu or tween menu):"); - if (ImGui::BeginTable("MenuInstructionsTable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Open Community Shaders Menu:"); - ImGui::TableSetColumnIndex(1); - Util::DrawButtonCombo(settings.VRMenuOpenKeys, true); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Close Community Shaders Menu:"); - ImGui::TableSetColumnIndex(1); - Util::DrawButtonCombo(settings.VRMenuCloseKeys, true); - ImGui::EndTable(); - } - ImGui::TextWrapped("Overlay (while in the main menu or tween menu):"); - if (ImGui::BeginTable("OverlayInstructionsTable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Open Overlay:"); - ImGui::TableSetColumnIndex(1); - Util::DrawButtonCombo(settings.VROverlayOpenKeys, true); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Close Overlay:"); - ImGui::TableSetColumnIndex(1); - Util::DrawButtonCombo(settings.VROverlayCloseKeys, true); - ImGui::EndTable(); - } - ImGui::TextWrapped("Menu Controller Input:"); - if (ImGui::BeginTable("ControllerInputTable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerBothColor(), "Trigger (Both Controllers)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Left mouse button"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerBothColor(), "Grip (Both Controllers)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Right mouse button"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerBothColor(), "Touchpad Click (Both Controllers)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Middle mouse button"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerBothColor(), "Stick Click (Both Controllers)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Middle mouse button"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerBothColor(), "A/X (Both Controllers)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Enter"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerPrimaryColor(), "B/Y (Primary Controller)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Tab"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerSecondaryColor(), "B/Y (Secondary Controller)"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Shift+Tab"); - ImGui::EndTable(); - } - bool useAttachedControllerForCursor = (settings.attachMode == AttachMode::ControllerOnly || settings.attachMode == AttachMode::Both); - if (ImGui::BeginTable("ThumbstickInstructionsTable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - if (useAttachedControllerForCursor) { - if (settings.VRMenuAttachController == ControllerDevice::Primary) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerPrimaryColor(), "Primary Controller Thumbstick"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Mouse movement (attached controller)"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerSecondaryColor(), "Secondary Controller Thumbstick"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Scroll"); - } else { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerPrimaryColor(), "Primary Controller Thumbstick"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Scroll"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerSecondaryColor(), "Secondary Controller Thumbstick"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Mouse movement (attached controller)"); - } - } else { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerPrimaryColor(), "Primary Controller Thumbstick"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Mouse movement (HMD mode)"); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextColored(Util::GetControllerSecondaryColor(), "Secondary Controller Thumbstick"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("Scroll"); - } - ImGui::EndTable(); - } - } - } - - void DrawStereoSettings() - { - auto& vr = globals::features::vr; - VR::Settings& settings = vr.settings; - - if (ImGui::CollapsingHeader("Stereo Reprojection", ImGuiTreeNodeFlags_DefaultOpen)) - vr.stereoOpt.DrawSettings(); - - bool hasEffects = VR::AnyScreenSpaceEffectLoaded(); - bool isDev = globals::state && globals::state->IsDeveloperMode(); - - if (ImGui::CollapsingHeader("Stereo Blend", ImGuiTreeNodeFlags_DefaultOpen)) { - if (!hasEffects && !isDev) { - ImGui::TextColored(ImVec4(1.0f, 0.7f, 0.3f, 1.0f), "Requires an active screen-space effect (SSGI, SS Shadows, SSR)."); - } else { - if (!hasEffects) - ImGui::TextColored(ImVec4(0.6f, 0.6f, 1.0f, 1.0f), "Developer mode: no screen-space effects active."); - - ImGui::Checkbox("Enable Stereo Blend", &settings.EnableStereoBlend); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text( - "Post-composite depth-aware bilateral blend between eyes.\n" - "Reduces stereo inconsistencies from screen-space effects (SSGI, SSR, etc.).\n" - "Each pixel is reprojected to the other eye; blending is applied only where\n" - "depth agrees (same surface). Full-screen pass in VR."); - } - - ImGui::BeginDisabled(!settings.EnableStereoBlend); - - ImGui::SliderFloat("Depth Sigma", &settings.StereoBlendDepthSigma, 0.001f, 0.1f, "%.4f"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text( - "Depth sensitivity for the bilateral weight.\n" - "Lower values are stricter -- only blend when depths match very closely.\n" - "Higher values allow blending across slight depth differences.\n" - "Default: 0.01"); - } - - ImGui::SliderFloat("Max Blend Factor", &settings.StereoBlendMaxFactor, 0.0f, 0.5f, "%.2f"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text( - "Maximum blend strength between the two eyes.\n" - "Higher values reduce screen-space effect flicker but destroy stereo depth.\n" - "Keep below ~0.15 to preserve 3D parallax.\n" - "Default: 0.1"); - } - - ImGui::SliderFloat("Color Difference Threshold", &settings.StereoBlendColorThreshold, 0.0f, 0.2f, "%.3f"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text( - "Minimum luminance difference between eyes to trigger blending.\n" - "Set to 0 to blend everywhere. Higher = more selective.\n" - "Default: 0.02"); - } - - ImGui::EndDisabled(); - } - } - - if (hasEffects || isDev) { - ImGui::Separator(); - - // Auto-enable required feature when a debug mode is selected; restore on Off. - // Tracks what we toggled so user-initiated changes aren't clobbered. - static bool s_weEnabledStereoBlend = false; - static bool s_weEnabledReproj = false; - - const char* debugModes[] = { "Off", "Back-Check", "Blend Weight", "Edge Detection", "Overwrite", "Overwrite Eye1" }; - if (ImGui::Combo("Debug View", &settings.StereoBlendDebugMode, debugModes, IM_ARRAYSIZE(debugModes))) { - int newMode = settings.StereoBlendDebugMode; - bool needsBlend = (newMode >= 1 && newMode <= 3); - bool needsReproj = (newMode == 4 || newMode == 5); - - // Auto-enable Stereo Blend for modes 1-3 (runtime-toggleable) - if (needsBlend && !settings.EnableStereoBlend) { - settings.EnableStereoBlend = true; - s_weEnabledStereoBlend = true; - } else if (!needsBlend && s_weEnabledStereoBlend) { - settings.EnableStereoBlend = false; - s_weEnabledStereoBlend = false; - } - - // Auto-enable Reprojection for modes 4-5 (note: takes effect after restart) - auto& sm = vr.stereoOpt.settings.stereoMode; - if (needsReproj && sm == VRStereoOptimizations::StereoMode::Off) { - sm = VRStereoOptimizations::StereoMode::Enable; - s_weEnabledReproj = true; - } else if (!needsReproj && s_weEnabledReproj) { - sm = VRStereoOptimizations::StereoMode::Off; - s_weEnabledReproj = false; - } - } - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text( - "Selecting a debug mode auto-enables the required feature; setting back to Off restores it.\n\n" - "Off: Normal rendering\n" - "Back-Check: Round-trip reprojection validation (auto-enables Stereo Blend)\n" - "Blend Weight: Heatmap of bilateral blend intensity (auto-enables Stereo Blend)\n" - "Edge Detection: Highlights depth discontinuities (auto-enables Stereo Blend)\n" - "Overwrite: Mode texture classification (auto-enables Reprojection -- restart required)\n" - " Green=edge Pink=edge neighbour Blue=disoccluded Orange=full blend\n" - "Overwrite Eye1: POM depth heatmap for Eye 1 (auto-enables Reprojection -- restart required)"); - } - } - } - - void DrawGeneralVRSettings() - { - auto& vr = globals::features::vr; - VR::Settings& settings = vr.settings; - if (ImGui::CollapsingHeader("General Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - bool exteriorChanged = ImGui::Checkbox("Enable Depth Buffer Culling in Exteriors", &settings.EnableDepthBufferCullingExterior); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Improves performance in exteriors, recommended ON."); - } - - bool interiorChanged = ImGui::Checkbox("Enable Depth Buffer Culling in Interiors", &settings.EnableDepthBufferCullingInterior); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Improves performance in interiors, recommended ON."); - } - - if (exteriorChanged || interiorChanged) { - vr.UpdateDepthBufferCulling(); - } - - if (ImGui::SliderFloat("Min Occludee Box Extent", &settings.MinOccludeeBoxExtent, 0.0f, 1000.0f, "%.1f")) { - if (vr.gMinOccludeeBoxExtent) { - *vr.gMinOccludeeBoxExtent = settings.MinOccludeeBoxExtent; - } - } - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Minimum bounding box dimensions for object occlusion culling. Lower values improve performance but may result in visual artifacts."); - } - } - } - - void DrawMenuSettings() - { - auto& vr = globals::features::vr; - auto& settings = vr.settings; - if (!vr.IsOpenVRCompatible()) - return; - if (ImGui::CollapsingHeader("Menu Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - float maxScale = VR::Config::kMaxMenuScale; - ImGui::SliderFloat("Menu Scale", &settings.VRMenuScale, VR::Config::kMinMenuScale, maxScale, "%.2f"); - const char* positioningMethods[] = { "HMD Relative", "Fixed World Position" }; - int prevMethod = settings.VRMenuPositioningMethod; - if (ImGui::Combo("Menu Positioning Method", &settings.VRMenuPositioningMethod, positioningMethods, IM_ARRAYSIZE(positioningMethods))) { - if (prevMethod != 1 && settings.VRMenuPositioningMethod == 1) { - vr.SetFixedOverlayToCurrentHMD(); - auto player = RE::PlayerCharacter::GetSingleton(); - if (player) - vr.savedPlayerWorldPos = player->GetPosition(); - } - } - const char* attachModes[] = { "HMD Only", "Controller Only", "Both", "None (Disabled)" }; - int attachModeInt = static_cast(settings.attachMode); - if (ImGui::Combo("Attach Mode", &attachModeInt, attachModes, IM_ARRAYSIZE(attachModes))) { - settings.attachMode = static_cast(attachModeInt); - } - - if (settings.attachMode == AttachMode::ControllerOnly || - settings.attachMode == AttachMode::Both) { - const char* attachControllers[] = { "Primary Controller", "Secondary Controller" }; - int attachControllerInt = static_cast(settings.VRMenuAttachController); - if (ImGui::Combo("Attach to Controller", &attachControllerInt, attachControllers, IM_ARRAYSIZE(attachControllers))) { - settings.VRMenuAttachController = static_cast(attachControllerInt); - } - - ImGui::Separator(); - ImGui::Text("Controller Offset Settings"); - ImGui::SliderFloat("Controller Offset X", &settings.VRMenuControllerOffsetX, -2.0f, 2.0f, "%.2f"); - ImGui::SliderFloat("Controller Offset Y", &settings.VRMenuControllerOffsetY, -2.0f, 2.0f, "%.2f"); - ImGui::SliderFloat("Controller Offset Z", &settings.VRMenuControllerOffsetZ, -2.0f, 2.0f, "%.2f"); - } - - if (settings.attachMode == AttachMode::HMDOnly || - settings.attachMode == AttachMode::Both) { - ImGui::Separator(); - ImGui::Text("HMD Offset Settings"); - ImGui::SliderFloat("HMD Offset X", &settings.VRMenuOffsetX, -2.0f, 2.0f, "%.2f"); - ImGui::SliderFloat("HMD Offset Y", &settings.VRMenuOffsetY, -2.0f, 2.0f, "%.2f"); - ImGui::SliderFloat("HMD Offset Z", &settings.VRMenuOffsetZ, -4.0f, 1.0f, "%.2f"); - } - - if (settings.VRMenuPositioningMethod == 1) { - ImGui::Separator(); - ImGui::Text("Fixed World Position Settings"); - ImGui::SliderFloat("Auto Reset Distance (game units)", &settings.VRMenuAutoResetDistance, 100.0f, 5000.0f, "%.0f"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("If you move farther than this distance from the menu, it will automatically reset to your HMD position. %s", Util::Units::FormatDistance(settings.VRMenuAutoResetDistance).c_str()); - } - if (ImGui::Button("Reset Menu to HMD Position")) { - vr.SetFixedOverlayToCurrentHMD(); - } - } - } - } - - void DrawMouseSettings() - { - auto& vr = globals::features::vr; - if (!vr.IsOpenVRCompatible()) - return; - VR::Settings& settings = vr.settings; - if (ImGui::CollapsingHeader("Input Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - if (ImGui::Checkbox("Enable Wand Pointing", &settings.EnableWandPointing)) { - vr.wandState.isIntersecting = false; - } - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Use controller ray-casting to point at UI elements"); - } - ImGui::Separator(); - ImGui::Text("Joystick Settings"); - ImGui::SliderFloat("Mouse Deadzone", &settings.mouseDeadzone, 0.0f, 1.0f, "%.2f"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Thumbstick deadzone for joystick cursor movement"); - } - ImGui::SliderFloat("Mouse Speed", &settings.mouseSpeed, 0.1f, 50.0f, "%.2f"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Speed multiplier for joystick cursor movement"); - } - } - } - - void DrawDragSettings() - { - auto& vr = globals::features::vr; - if (!vr.IsOpenVRCompatible()) - return; - VR::Settings& settings = vr.settings; - if (ImGui::CollapsingHeader("Drag Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - if (ImGui::CollapsingHeader("Drag Instructions", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::TextWrapped("Overlay Positioning (Grip + Drag):"); - ImGui::BulletText("Fixed World Position: Any controller can drag (HMD-only mode) or attached controller only (Both modes)"); - ImGui::BulletText("HMD Relative: Any controller can drag (HMD-only mode) or attached controller only (Both modes)"); - ImGui::BulletText("Controller Attached: Only the opposite hand can drag the controller overlay"); - ImGui::Spacing(); - ImGui::TextWrapped("Depth Adjustment (Grip + Thumbstick):"); - ImGui::BulletText("While gripping to drag, use the thumbstick on the same hand to adjust depth"); - ImGui::BulletText("Thumbstick forward: Push overlay farther away"); - ImGui::BulletText("Thumbstick back: Pull overlay closer"); - } - ImGui::Checkbox("Enable drag to reposition overlays", &settings.EnableDragToReposition); - ImGui::BeginDisabled(!settings.EnableDragToReposition); - ImGui::ColorEdit4("Drag Highlight Color", settings.dragHighlightColor.data()); - ImGui::EndDisabled(); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Color used to highlight draggable overlays in VR."); - } - } - } - - void DrawKeyBindings() - { - auto& vr = globals::features::vr; - auto& settings = vr.settings; - - if (ImGui::CollapsingHeader("Combo Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::SliderFloat("Combo Timeout", &settings.comboTimeout, 1.0f, 10.0f, "%.1f seconds"); - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Time limit for recording button combinations."); - } - } - ImGui::Separator(); - const char* comboTypes[] = { - "Open Community Shaders Menu", - "Close Community Shaders Menu", - "Open VR Overlay", - "Close VR Overlay" - }; - static int selectedComboIndex = 0; - ImGui::Text("Select Combo to Record:"); - ImGui::SameLine(); - if (ImGui::Combo("##ComboSelector", &selectedComboIndex, comboTypes, IM_ARRAYSIZE(comboTypes))) { - vr.isCapturingCombo = false; - vr.currentComboType = VR::ComboType::None; - vr.recordedCombo.clear(); - } - if (ImGui::Button("Record Selected Combo")) { - vr.isCapturingCombo = true; - vr.currentComboType = static_cast(selectedComboIndex + 1); - vr.currentComboName = comboTypes[selectedComboIndex]; - vr.recordedCombo.clear(); - vr.comboStartTime = Util::GetNowSecs(); - vr.recordingButtonControllers.clear(); - } - ImGui::SameLine(); - if (ImGui::SmallButton("Clear")) { - switch (selectedComboIndex) { - case 0: - settings.VRMenuOpenKeys.clear(); - break; - case 1: - settings.VRMenuCloseKeys.clear(); - break; - case 2: - settings.VROverlayOpenKeys.clear(); - break; - case 3: - settings.VROverlayCloseKeys.clear(); - break; - } - } - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Click to start recording a new button combination for the selected action."); - } - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - if (ImGui::BeginTable("##VRBindingsTable", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) { - ImGui::TableSetupColumn("Action"); - ImGui::TableSetupColumn("Current Binding"); - ImGui::TableSetupColumn("Description"); - ImGui::TableHeadersRow(); - struct VRKeyBindingConfig - { - const char* label; - std::vector& combos; - const char* description; - const char* controllerRequirement; - }; - std::vector keyBindingConfigs = { - { "Open Community Shaders Menu", settings.VRMenuOpenKeys, "Button combination to open the Community Shaders menu", "Primary" }, - { "Close Community Shaders Menu", settings.VRMenuCloseKeys, "Button combination to close the Community Shaders menu", "Both" }, - { "Open VR Overlay", settings.VROverlayOpenKeys, "Button combination to open the VR overlay", "Primary" }, - { "Close VR Overlay", settings.VROverlayCloseKeys, "Button combination to close the VR overlay", "Secondary" } - }; - for (size_t row = 0; row < keyBindingConfigs.size(); ++row) { - const auto& config = keyBindingConfigs[row]; - ImGui::TableNextRow(); - if (row == static_cast(selectedComboIndex)) { - ImU32 highlight = ImGui::GetColorU32(ImVec4(1.0f, 1.0f, 0.0f, 0.15f)); - ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, highlight); - } - ImGui::TableSetColumnIndex(0); - char selectableId[64]; - snprintf(selectableId, sizeof(selectableId), "##combo_row_%zu", row); - bool rowSelected = (row == static_cast(selectedComboIndex)); - if (ImGui::Selectable(selectableId, rowSelected, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap, ImVec2(0, 0))) { - selectedComboIndex = static_cast(row); - } - ImGui::SameLine(0, 0); - ImGui::Text("%s", config.label); - ImGui::TableSetColumnIndex(1); - Util::DrawButtonCombo(config.combos, false); - ImGui::TableSetColumnIndex(2); - ImGui::Text("%s", config.description); - } - ImGui::EndTable(); - } - ImGui::Spacing(); - if (ImGui::Button("Reset to Defaults")) { - VR::Settings defaults; - settings.VRMenuOpenKeys = defaults.VRMenuOpenKeys; - settings.VRMenuCloseKeys = defaults.VRMenuCloseKeys; - settings.VROverlayOpenKeys = defaults.VROverlayOpenKeys; - settings.VROverlayCloseKeys = defaults.VROverlayCloseKeys; - } - if (auto _tt = Util::HoverTooltipWrapper()) { - ImGui::Text("Reset all VR key bindings to their default values."); - } - } - - void DrawThumbstickColumn(VR& vr, bool showPrimary, ImU32 highlightCol) - { - auto& state = showPrimary ? vr.primaryControllerState : vr.secondaryControllerState; - auto role = showPrimary ? RE::ControllerRole::Primary : RE::ControllerRole::Secondary; - float x = state.thumbsticks[static_cast(role)].x; - float y = state.thumbsticks[static_cast(role)].y; - - ImVec2 padSize = ImVec2(80, 80); - ImVec2 cursor = ImGui::GetCursorScreenPos(); - ImDrawList* drawList = ImGui::GetWindowDrawList(); - ImVec2 center = ImVec2(cursor.x + padSize.x / 2, cursor.y + padSize.y / 2); - float radius = padSize.x / 2 - 4; - ImU32 borderCol = ImGui::GetColorU32(ImGuiCol_Border); - ImU32 axisCol = ImGui::GetColorU32(ImGuiCol_TextDisabled); - ImU32 dotCol = ImGui::GetColorU32(ImGuiCol_Text); - - drawList->AddRectFilled(cursor, ImVec2(cursor.x + padSize.x, cursor.y + padSize.y), ImGui::GetColorU32(ImGuiCol_FrameBg)); - drawList->AddRect(cursor, ImVec2(cursor.x + padSize.x, cursor.y + padSize.y), borderCol, 4.0f, 0, 2.0f); - drawList->AddLine(ImVec2(center.x, cursor.y + 4), ImVec2(center.x, cursor.y + padSize.y - 4), axisCol, 1.0f); - drawList->AddLine(ImVec2(cursor.x + 4, center.y), ImVec2(cursor.x + padSize.x - 4, center.y), axisCol, 1.0f); - - int quad = 0; - if (x > 0 && y > 0) - quad = 1; - else if (x < 0 && y > 0) - quad = 2; - else if (x < 0 && y < 0) - quad = 3; - else if (x > 0 && y < 0) - quad = 4; - - if (quad != 0) { - ImVec2 q0 = center, q1 = center, q2 = center, q3 = center; - if (quad == 1) { - q1 = { center.x + radius, center.y - radius }; - q2 = { center.x + radius, center.y }; - q3 = { center.x, center.y - radius }; - } else if (quad == 2) { - q1 = { center.x - radius, center.y - radius }; - q2 = { center.x - radius, center.y }; - q3 = { center.x, center.y - radius }; - } else if (quad == 3) { - q1 = { center.x - radius, center.y + radius }; - q2 = { center.x - radius, center.y }; - q3 = { center.x, center.y + radius }; - } else if (quad == 4) { - q1 = { center.x + radius, center.y + radius }; - q2 = { center.x + radius, center.y }; - q3 = { center.x, center.y + radius }; - } - ImVec2 poly[4] = { center, q1, q2, q3 }; - drawList->AddConvexPolyFilled(poly, 4, highlightCol); - } - - ImVec2 dot = ImVec2(center.x + x * radius, center.y - y * radius); - drawList->AddCircleFilled(dot, 5.0f, dotCol); - - ImGui::Dummy(padSize); - ImGui::SetNextItemWidth(160.0f); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() - ImGui::GetTextLineHeight()); - ImGui::Text("X: %+1.3f Y: %+1.3f [%s]", x, y, RE::GetQuadrantName(x, y)); - } - - void DrawDebugSection() - { - auto& vr = globals::features::vr; - auto& settings = vr.settings; - auto menu = globals::menu; - - if (ImGui::CollapsingHeader("OpenVR Information", ImGuiTreeNodeFlags_DefaultOpen)) { - auto& info = vr.openVRInfo; - if (info.isAvailable) { - if (vr.IsOpenVRCompatible()) { - ImGui::Text("OpenVR System: Active & Compatible"); - } else { - ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.5f, 1.0f), "OpenVR System: Active but INCOMPATIBLE"); - ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.5f, 1.0f), "VR overlay menus disabled."); - } - - ImGui::Text("Runtime: %s", VRDetection::RuntimeTypeToString(info.runtimeType)); - ImGui::Text("DLL Path: %s", info.dllPath.c_str()); - ImGui::Text("DLL Version: %s", info.version.c_str()); - ImGui::Text("DLL Size: %llu bytes", info.fileSize); - ImGui::Text("Modified: %s", info.modificationTime.c_str()); - - ImGui::Separator(); - ImGui::Text("Detection Method:"); - ImGui::Text(" Interface Probing: %s", info.probingSucceeded ? "Passed" : "Failed"); - ImGui::Text(" IVROverlay_016: %s", info.hasOverlayInterface ? "OK" : "Missing"); - ImGui::Text(" IVRSystem_017: %s", info.hasSystemInterface ? "OK" : "Missing"); - ImGui::Text(" IVRCompositor_021: %s", info.hasCompositorInterface ? "OK" : "Missing"); - ImGui::TextColored(ImVec4(0.3f, 1.0f, 0.3f, 1.0f), " Rendering: In-scene overlay (submit hook)"); - - } else { - ImGui::Text("OpenVR system not available"); - } - } - - if (ImGui::CollapsingHeader("Controller Diagnostics", ImGuiTreeNodeFlags_DefaultOpen)) { - if (ImGui::Checkbox("Test Mode: Disable controller menu input (except scroll controller and triggers)", &settings.VRMenuControllerDiagnosticsTestMode)) { - ImGui::SetScrollHereY(0.0f); - } - ImGui::SeparatorText("Button State"); - double nowSecs = Util::GetNowSecs(); - ImVec4 highlightColor = menu->GetTheme().StatusPalette.InfoColor; - ImU32 highlightColorU32 = ImGui::ColorConvertFloat4ToU32(highlightColor); - - bool isLeftHanded = vr.lastKnownLeftHandedMode; - - if (ImGui::BeginTable("vr_input_state_table", 7, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Button"); - if (isLeftHanded) { - ImGui::TableSetupColumn("Primary State"); - ImGui::TableSetupColumn("Primary Held (s)"); - ImGui::TableSetupColumn("Primary Type"); - ImGui::TableSetupColumn("Secondary State"); - ImGui::TableSetupColumn("Secondary Held (s)"); - ImGui::TableSetupColumn("Secondary Type"); - } else { - ImGui::TableSetupColumn("Secondary State"); - ImGui::TableSetupColumn("Secondary Held (s)"); - ImGui::TableSetupColumn("Secondary Type"); - ImGui::TableSetupColumn("Primary State"); - ImGui::TableSetupColumn("Primary Held (s)"); - ImGui::TableSetupColumn("Primary Type"); - } - ImGui::TableHeadersRow(); - - auto DrawButtonType = [](const RE::ButtonState& state) { - if (!state.isPressed) { - if (state.IsClick()) - ImGui::TextUnformatted("Click"); - else if (state.IsHold()) - ImGui::TextUnformatted("Hold"); - else - ImGui::TextUnformatted("-"); - } else { - ImGui::TextUnformatted("Held"); - } - }; - - auto printRow = [&](const char* label, const RE::ButtonState& left, const RE::ButtonState& right) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::TextUnformatted(label); - ImGui::TableSetColumnIndex(1); - if (left.isPressed) - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, highlightColorU32); - ImGui::TextUnformatted(left.isPressed ? "Pressed" : "Released"); - ImGui::TableSetColumnIndex(2); - if (left.isPressed) - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, highlightColorU32); - ImGui::Text("%.2f", left.GetCurrentHeldTime(nowSecs)); - ImGui::TableSetColumnIndex(3); - if (left.isPressed) - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, highlightColorU32); - DrawButtonType(left); - ImGui::TableSetColumnIndex(4); - if (right.isPressed) - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, highlightColorU32); - ImGui::TextUnformatted(right.isPressed ? "Pressed" : "Released"); - ImGui::TableSetColumnIndex(5); - if (right.isPressed) - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, highlightColorU32); - ImGui::Text("%.2f", right.GetCurrentHeldTime(nowSecs)); - ImGui::TableSetColumnIndex(6); - if (right.isPressed) - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, highlightColorU32); - DrawButtonType(right); - }; - - auto printRowWithHandedness = [&](const char* label, auto key) { - auto& primary = vr.primaryControllerState[key]; - auto& secondary = vr.secondaryControllerState[key]; - if (isLeftHanded) { - printRow(label, primary, secondary); - } else { - printRow(label, secondary, primary); - } - }; - - printRowWithHandedness("Trigger", RE::BSOpenVRControllerDevice::Keys::kTrigger); - printRowWithHandedness("Grip", RE::BSOpenVRControllerDevice::Keys::kGrip); - printRowWithHandedness("GripAlt", RE::BSOpenVRControllerDevice::Keys::kGripAlt); - printRowWithHandedness("Stick Click", RE::BSOpenVRControllerDevice::Keys::kJoystickTrigger); - printRowWithHandedness("Touchpad Click", RE::BSOpenVRControllerDevice::Keys::kTouchpadClick); - printRowWithHandedness("Touchpad Alt", RE::BSOpenVRControllerDevice::Keys::kTouchpadAlt); - printRowWithHandedness("B/Y", RE::BSOpenVRControllerDevice::Keys::kBY); - printRowWithHandedness("A/X", RE::BSOpenVRControllerDevice::Keys::kXA); - ImGui::EndTable(); - } - - ImGui::SeparatorText("VR Thumbstick State"); - ImU32 highlightCol = ImGui::ColorConvertFloat4ToU32(menu->GetTheme().StatusPalette.InfoColor); - if (ImGui::BeginTable("##VRThumbstickTable", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) { - if (isLeftHanded) { - ImGui::TableSetupColumn("Primary Controller", ImGuiTableColumnFlags_WidthFixed, 200.0f); - ImGui::TableSetupColumn("Secondary Controller", ImGuiTableColumnFlags_WidthFixed, 200.0f); - } else { - ImGui::TableSetupColumn("Secondary Controller", ImGuiTableColumnFlags_WidthFixed, 200.0f); - ImGui::TableSetupColumn("Primary Controller", ImGuiTableColumnFlags_WidthFixed, 200.0f); - } - ImGui::TableHeadersRow(); - - // Left column - ImGui::TableSetColumnIndex(0); - ImGui::BeginGroup(); - DrawThumbstickColumn(vr, isLeftHanded, highlightCol); - ImGui::EndGroup(); - - // Right column - ImGui::TableSetColumnIndex(1); - ImGui::BeginGroup(); - DrawThumbstickColumn(vr, !isLeftHanded, highlightCol); - ImGui::EndGroup(); - ImGui::EndTable(); - } - - ImGui::SeparatorText("Recent VR Controller Events"); - ImGui::TextDisabled("Note: For thumbstick events, KeyCode/Value columns show X/Y floats."); - if (ImGui::BeginTable("eventlog", 6, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) { - ImGui::TableSetupColumn("Device", ImGuiTableColumnFlags_WidthFixed, 60.0f); - ImGui::TableSetupColumn("KeyCode/X", ImGuiTableColumnFlags_WidthFixed, 80.0f); - ImGui::TableSetupColumn("Value/Y", ImGuiTableColumnFlags_WidthFixed, 80.0f); - ImGui::TableSetupColumn("Pressed", ImGuiTableColumnFlags_WidthFixed, 70.0f); - ImGui::TableSetupColumn("Known Mapping", ImGuiTableColumnFlags_WidthFixed, 120.0f); - ImGui::TableSetupColumn("Event Type", ImGuiTableColumnFlags_WidthFixed, 120.0f); - ImGui::TableHeadersRow(); - for (const auto& e : vr.vrControllerEventLog) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("%d", e.device); - ImGui::TableSetColumnIndex(1); - if (e.heldSource == "thumbstick") { - ImGui::Text("%.3f", e.thumbstickX); - } else { - ImGui::Text("%d", e.keyCode); - } - ImGui::TableSetColumnIndex(2); - if (e.heldSource == "thumbstick") { - ImGui::Text("%.3f", e.thumbstickY); - } else { - ImGui::Text("%d", e.value); - } - ImGui::TableSetColumnIndex(3); - ImGui::Text("%s", e.pressed ? "Pressed" : "Released"); - ImGui::TableSetColumnIndex(4); - if (e.heldSource == "thumbstick") { - ImGui::TextUnformatted(e.controllerRole.c_str()); - } else { - ImGui::TextUnformatted(RE::GetOpenVRButtonName(e.keyCode)); - } - ImGui::TableSetColumnIndex(5); - if (e.heldSource == "thumbstick") { - ImGui::TextUnformatted("-"); - } else { - if (!e.pressed) { - if (e.heldTime > 0.0) { - if (e.heldTime < 0.5) { - ImGui::Text("Click (%.2fs)", e.heldTime); - } else { - ImGui::Text("Hold (%.2fs)", e.heldTime); - } - } else { - ImGui::Text("Release"); - } - } else if (e.pressed) { - if (e.heldTime > 0.0) { - ImGui::Text("Held for %.2fs", e.heldTime); - } else { - ImGui::Text("Press"); - } - } - } - } - ImGui::EndTable(); - } - - ImGui::SeparatorText("Wand Pointing State"); - if (ImGui::BeginTable("##WandPointingState", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Property", ImGuiTableColumnFlags_WidthFixed, 200.0f); - ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableHeadersRow(); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Wand Pointing Enabled"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", settings.EnableWandPointing ? "Yes" : "No"); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Intersecting Overlay"); - ImGui::TableSetColumnIndex(1); - if (vr.wandState.isIntersecting) { - ImGui::TextColored(menu->GetTheme().StatusPalette.InfoColor, "YES"); - } else { - ImGui::Text("No"); - } - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("UV Coordinates"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("(%.3f, %.3f)", vr.wandState.uvCoordinates.x, vr.wandState.uvCoordinates.y); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Controller Index"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%u", vr.wandState.controllerIndex); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Ray Origin"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("(%.2f, %.2f, %.2f)", vr.wandState.rayOrigin.x, vr.wandState.rayOrigin.y, vr.wandState.rayOrigin.z); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Ray Direction"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("(%.2f, %.2f, %.2f)", vr.wandState.rayDirection.x, vr.wandState.rayDirection.y, vr.wandState.rayDirection.z); - - ImGui::EndTable(); - } - } - - if (ImGui::CollapsingHeader("OpenVR Addresses")) { - auto openvr = RE::BSOpenVR::GetSingleton(); - auto overlay = openvr ? RE::BSOpenVR::GetIVROverlayFromContext(&openvr->vrContext) : nullptr; - auto vrSystem = openvr ? openvr->vrSystem : nullptr; - ADDRESS_NODE(openvr) - ADDRESS_NODE(overlay) - ADDRESS_NODE(vrSystem) - } - } -} // namespace - -//============================================================================= -// DRAW SETTINGS (main entry point) -//============================================================================= - -void VR::DrawSettings() -{ - auto menu = globals::menu; - if (!menu) - return; - if (ImGui::BeginTabBar("##VRTabs", ImGuiTabBarFlags_None)) { - if (BeginTabItemWithFont("General", Menu::FontRole::Subheading)) { - if (ImGui::BeginChild("##VRGeneralFrame", { 0, 0 }, true)) { - DrawGeneralVRSettings(); - DrawControllerInputInstructions(); - DrawMenuSettings(); - DrawMouseSettings(); - DrawDragSettings(); - } - ImGui::EndChild(); - ImGui::EndTabItem(); - } - - if (BeginTabItemWithFont("Stereo", Menu::FontRole::Subheading)) { - if (ImGui::BeginChild("##VRStereoFrame", { 0, 0 }, true)) { - DrawStereoSettings(); - } - ImGui::EndChild(); - ImGui::EndTabItem(); - } - - if (IsOpenVRCompatible()) { - if (BeginTabItemWithFont("Bindings", Menu::FontRole::Subheading)) { - if (ImGui::BeginChild("##VRBindingsFrame", { 0, 0 }, true)) { - DrawKeyBindings(); - } - ImGui::EndChild(); - ImGui::EndTabItem(); - } - } - - if (BeginTabItemWithFont("Debug", Menu::FontRole::Subheading)) { - if (ImGui::BeginChild("##VRDebugFrame", { 0, 0 }, true)) { - DrawDebugSection(); - } - ImGui::EndChild(); - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } - - // Combo recording popup - if (this->isCapturingCombo) { - ImGui::OpenPopup("Record Combo"); - if (auto popup = Util::CenteredPopupModal("Record Combo")) { - auto GetButtonName = [](uint32_t key) -> const char* { - switch (key) { - case static_cast(RE::BSOpenVRControllerDevice::Keys::kTrigger): - return "Trigger"; - case static_cast(RE::BSOpenVRControllerDevice::Keys::kGrip): - return "Grip"; - case static_cast(RE::BSOpenVRControllerDevice::Keys::kTouchpadClick): - return "Touchpad"; - case static_cast(RE::BSOpenVRControllerDevice::Keys::kJoystickTrigger): - return "Stick Click"; - case static_cast(RE::BSOpenVRControllerDevice::Keys::kXA): - return "A/X"; - case static_cast(RE::BSOpenVRControllerDevice::Keys::kBY): - return "B/Y"; - default: - return "Unknown"; - } - }; - - ImGui::Text("Recording combo for: %s", this->currentComboName ? this->currentComboName : "Unknown"); - ImGui::Spacing(); - - ImGui::TextDisabled("(During recording, any controller's buttons can be used. Requirement is only enforced during use.)"); - - ImGui::Spacing(); - - double remainingTime = settings.comboTimeout - (Util::GetNowSecs() - this->comboStartTime); - ImVec4 timerColor = remainingTime > 2.0 ? Util::Colors::GetTimerGood() : - remainingTime > 1.0 ? Util::Colors::GetTimerWarning() : - Util::Colors::GetTimerCritical(); - ImGui::TextColored(timerColor, "Time remaining: %.1f seconds", remainingTime); - - ImGui::Spacing(); - - if (this->recordedCombo.empty()) { - ImGui::Text("Press buttons to record combo..."); - } else { - ImGui::Text("Recorded buttons:"); - std::vector sortedRecordedCombos; - for (size_t i = 0; i < this->recordedCombo.size(); ++i) { - sortedRecordedCombos.push_back(this->recordedCombo[i]); - } - std::sort(sortedRecordedCombos.begin(), sortedRecordedCombos.end(), - [](const ButtonCombo& a, const ButtonCombo& b) { - return a.GetKey() < b.GetKey(); - }); - - Util::DrawButtonCombo(sortedRecordedCombos, false); - } - - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - - ImGui::Text("Press ENTER to accept, ESC to cancel"); - - // Handle button recording - bool buttonPressed = false; - uint32_t pressedKey = 0; - ControllerDevice pressedDevice = ControllerDevice::Both; - - for (const auto& [keyCode, buttonState] : primaryControllerState.GetActiveButtons()) { - if (buttonState->isPressed) { - pressedKey = keyCode; - buttonPressed = true; - pressedDevice = ControllerDevice::Primary; - break; - } - } - - if (!buttonPressed) { - for (const auto& [keyCode, buttonState] : secondaryControllerState.GetActiveButtons()) { - if (buttonState->isPressed) { - pressedKey = keyCode; - buttonPressed = true; - pressedDevice = ControllerDevice::Secondary; - break; - } - } - } - - if (buttonPressed) { - auto it = recordingButtonControllers.find(pressedKey); - if (it == recordingButtonControllers.end()) { - recordingButtonControllers[pressedKey] = pressedDevice; - } else { - if (it->second != pressedDevice && it->second != ControllerDevice::Both) { - it->second = ControllerDevice::Both; - } - } - this->recordedCombo.clear(); - for (const auto& [key, device] : recordingButtonControllers) { - this->recordedCombo.push_back(ButtonCombo(device, key)); - } - } - - if (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::IsKeyPressed(ImGuiKey_KeypadEnter)) { - ApplyRecordedCombo(); - ResetComboRecording(); - ImGui::CloseCurrentPopup(); - } - - if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { - ResetComboRecording(); - ImGui::CloseCurrentPopup(); - } - - if (remainingTime <= 0.0) { - ApplyRecordedCombo(); - ResetComboRecording(); - ImGui::CloseCurrentPopup(); - } - } - } -} diff --git a/src/Features/VR/StereoBlend.cpp b/src/Features/VR/StereoBlend.cpp deleted file mode 100644 index b296d80d1b..0000000000 --- a/src/Features/VR/StereoBlend.cpp +++ /dev/null @@ -1,227 +0,0 @@ -#include "Features/VR.h" - -#include "Deferred.h" -#include "Features/DynamicCubemaps.h" -#include "Features/ScreenSpaceGI.h" -#include "Features/ScreenSpaceShadows.h" -#include "State.h" -#include "Utils/D3D.h" - -void VR::CompileStereoBlendShaders() -{ - std::vector> defines = { { "VR", "" }, { "FRAMEBUFFER", "" } }; - if (auto rawPtr = reinterpret_cast(Util::CompileShader(L"Data\\Shaders\\VR\\StereoBlendCS.hlsl", defines, "cs_5_0"))) - stereoBlendCS.attach(rawPtr); - - auto backCheckDefines = defines; - backCheckDefines.push_back({ "DEBUG_BACKCHECK", "" }); - if (auto rawPtr = reinterpret_cast(Util::CompileShader(L"Data\\Shaders\\VR\\StereoBlendCS.hlsl", backCheckDefines, "cs_5_0"))) - stereoBlendDebugBackCheckCS.attach(rawPtr); - - auto blendWeightDefines = defines; - blendWeightDefines.push_back({ "DEBUG_BLEND_WEIGHT", "" }); - if (auto rawPtr = reinterpret_cast(Util::CompileShader(L"Data\\Shaders\\VR\\StereoBlendCS.hlsl", blendWeightDefines, "cs_5_0"))) - stereoBlendDebugBlendWeightCS.attach(rawPtr); - - auto edgeDetectionDefines = defines; - edgeDetectionDefines.push_back({ "DEBUG_EDGE_DETECTION", "" }); - if (auto rawPtr = reinterpret_cast(Util::CompileShader(L"Data\\Shaders\\VR\\StereoBlendCS.hlsl", edgeDetectionDefines, "cs_5_0"))) - stereoBlendDebugEdgeDetectionCS.attach(rawPtr); - - auto overwriteDefines = defines; - overwriteDefines.push_back({ "STEREO_OVERWRITE", "" }); - if (auto rawPtr = reinterpret_cast(Util::CompileShader(L"Data\\Shaders\\VR\\StereoBlendCS.hlsl", overwriteDefines, "cs_5_0"))) - stereoBlendOverwriteCS.attach(rawPtr); -} - -void VR::ClearShaderCache() -{ - stereoBlendCS = nullptr; - stereoBlendDebugBackCheckCS = nullptr; - stereoBlendDebugBlendWeightCS = nullptr; - stereoBlendDebugEdgeDetectionCS = nullptr; - stereoBlendOverwriteCS = nullptr; - stereoOpt.ClearShaderCache(); - - // Framework calls ClearShaderCache without a follow-up SetupResources for these runtime - // CS shaders, so recompile here to leave the feature in a usable state. - CompileStereoBlendShaders(); -} - -bool VR::AnyScreenSpaceEffectLoaded() -{ - return globals::features::screenSpaceGI.loaded || - globals::features::dynamicCubemaps.loaded || - globals::features::screenSpaceShadows.loaded; -} - -void VR::DrawStereoBlend() -{ - bool vrStereoOptActive = IsStereoOptimizationCullingReady(); - - if (!REL::Module::IsVR() || !stereoBlendCopyTex || !stereoBlendCB) - return; - - // Modes 4/5 visualize the overwrite path (mode classification, POM depth) without requiring - // active reprojection — useful when stereoOpt is loaded but reprojection stencil hasn't fired. - bool overwriteVisualizationActive = (settings.StereoBlendDebugMode == 4 || settings.StereoBlendDebugMode == 5) && stereoBlendOverwriteCS; - - if (!vrStereoOptActive && !overwriteVisualizationActive && (!settings.EnableStereoBlend || !stereoBlendCS)) - return; - - if (!vrStereoOptActive && !overwriteVisualizationActive && !AnyScreenSpaceEffectLoaded() && !globals::state->IsDeveloperMode()) - return; - - ZoneScoped; - TracyD3D11Zone(globals::state->tracyCtx, "VR Stereo Blend"); - - if (globals::state->frameAnnotations) - globals::state->BeginPerfEvent("VR Stereo Blend"); - - auto context = globals::d3d::context; - auto renderer = globals::game::renderer; - - auto& main = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN]; - auto* depthSRV = Util::GetCurrentSceneDepthSRV(); - - // Copy main color to read-only texture to avoid read/write race between eyes - context->CopyResource(stereoBlendCopyTex->resource.get(), main.texture); - - auto dispatchCount = Util::GetScreenDispatchCount(true); - float2 resolution = Util::ConvertToDynamic(globals::state->screenSize); - - StereoBlendCB cbData{}; - cbData.FrameDim[0] = resolution.x; - cbData.FrameDim[1] = resolution.y; - cbData.RcpFrameDim[0] = 1.0f / resolution.x; - cbData.RcpFrameDim[1] = 1.0f / resolution.y; - cbData.DepthSigma = settings.StereoBlendDepthSigma; - cbData.MaxBlendFactor = settings.StereoBlendMaxFactor; - cbData.ColorDiffThreshold = settings.StereoBlendColorThreshold; - - bool isOverwriteMode = vrStereoOptActive || overwriteVisualizationActive; - - // Edge tint from reprojection debug visualization flag - if (isOverwriteMode && globals::features::vr.stereoOpt.settings.debugVisualization) - cbData.DebugEdgeTint = 0.3f; - else - cbData.DebugEdgeTint = 0.0f; - - // Debug mode: 0=normal, 1=depth map (mode classification), 2=full blend depth, 3=POM depth heatmap - // StereoBlendDebugMode 4/5 take priority over the individual reprojection debug booleans - if (settings.StereoBlendDebugMode == 4) - cbData.DebugMode = 1u; // "Overwrite": mode texture classification heatmap - else if (settings.StereoBlendDebugMode == 5) - cbData.DebugMode = 3u; // "Overwrite Eye1": POM depth heatmap - else if (isOverwriteMode && globals::features::vr.stereoOpt.settings.debugDepthMap) - cbData.DebugMode = 1u; - else if (isOverwriteMode && globals::features::vr.stereoOpt.settings.debugFullBlendDepth) - cbData.DebugMode = 2u; - else if (isOverwriteMode && globals::features::vr.stereoOpt.settings.debugPOMDepth) - cbData.DebugMode = 3u; - else - cbData.DebugMode = 0u; - - cbData.FullBlendDistance = vrStereoOptActive ? globals::features::vr.stereoOpt.settings.fullBlendDistance : 0.0f; - cbData.POMDepthScale = vrStereoOptActive ? globals::features::vr.stereoOpt.settings.pomDepthScale : 1.0f; - - stereoBlendCB->Update(cbData); - auto cbPtr = stereoBlendCB->CB(); - - auto& motionVectors = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMOTION_VECTOR]; - - ID3D11ComputeShader* activeCS = stereoBlendCS.get(); - if (isOverwriteMode) { - activeCS = stereoBlendOverwriteCS.get(); - } else if (settings.EnableStereoBlend) { - int effectiveMode = settings.StereoBlendDebugMode; - if (effectiveMode == 1 && stereoBlendDebugBackCheckCS) - activeCS = stereoBlendDebugBackCheckCS.get(); - else if (effectiveMode == 2 && stereoBlendDebugBlendWeightCS) - activeCS = stereoBlendDebugBlendWeightCS.get(); - else if (effectiveMode == 3 && stereoBlendDebugEdgeDetectionCS) - activeCS = stereoBlendDebugEdgeDetectionCS.get(); - } - - // Save and unbind DSV to avoid SRV/DSV conflict on depth buffer in overwrite mode - ID3D11RenderTargetView* savedRTVs[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = {}; - ID3D11DepthStencilView* savedDSV = nullptr; - if (isOverwriteMode) { - context->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, savedRTVs, &savedDSV); - context->OMSetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, savedRTVs, nullptr); - for (auto& rtv : savedRTVs) { - if (rtv) - rtv->Release(); - } - } - - ID3D11ShaderResourceView* srvs[2]{ stereoBlendCopyTex->srv.get(), depthSRV }; - context->CSSetConstantBuffers(1, 1, &cbPtr); - context->CSSetShaderResources(0, 2, srvs); - - if (isOverwriteMode) { - ID3D11ShaderResourceView* modeSRV = globals::features::vr.stereoOpt.GetModeTextureSRV(); - context->CSSetShaderResources(2, 1, &modeSRV); - - // Bind dedicated POM offset SRV (R16_FLOAT, written by Lighting PS at u7) - auto* pomSRV = globals::features::vr.stereoOpt.GetPomOffsetSRV(); - context->CSSetShaderResources(3, 1, &pomSRV); - - ID3D11UnorderedAccessView* uavs[2]{ main.UAV, motionVectors.UAV }; - context->CSSetUnorderedAccessViews(0, 2, uavs, nullptr); - } else { - ID3D11UnorderedAccessView* uavs[1]{ main.UAV }; - context->CSSetUnorderedAccessViews(0, 1, uavs, nullptr); - } - - // Bind linear sampler for hardware bilinear color sampling in overwrite mode - if (isOverwriteMode) { - if (!stereoBlendLinearSampler) { - D3D11_SAMPLER_DESC sampDesc = {}; - sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - globals::d3d::device->CreateSamplerState(&sampDesc, stereoBlendLinearSampler.put()); - Util::SetResourceName(stereoBlendLinearSampler.get(), "VR::StereoBlendLinearSampler"); - } - ID3D11SamplerState* samplers[] = { stereoBlendLinearSampler.get() }; - context->CSSetSamplers(0, 1, samplers); - } - - context->CSSetShader(activeCS, nullptr, 0); - if (isOverwriteMode) { - TracyD3D11Zone(globals::state->tracyCtx, "StereoBlend - Overwrite"); - context->Dispatch(dispatchCount.x, dispatchCount.y, 1); - } else { - TracyD3D11Zone(globals::state->tracyCtx, "StereoBlend - Bilateral"); - context->Dispatch(dispatchCount.x, dispatchCount.y, 1); - } - - // Cleanup - ID3D11ShaderResourceView* nullSRVs[4] = {}; - context->CSSetShaderResources(0, isOverwriteMode ? 4 : 2, nullSRVs); - ID3D11UnorderedAccessView* nullUAVs[2] = {}; - context->CSSetUnorderedAccessViews(0, isOverwriteMode ? 2 : 1, nullUAVs, nullptr); - ID3D11Buffer* nullCB = nullptr; - context->CSSetConstantBuffers(1, 1, &nullCB); - if (isOverwriteMode) { - ID3D11SamplerState* nullSampler[] = { nullptr }; - context->CSSetSamplers(0, 1, nullSampler); - } - context->CSSetShader(nullptr, nullptr, 0); - - // Restore DSV after CS dispatch in overwrite mode - if (isOverwriteMode && savedDSV) { - context->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, savedRTVs, nullptr); - context->OMSetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, savedRTVs, savedDSV); - for (auto& rtv : savedRTVs) { - if (rtv) - rtv->Release(); - } - savedDSV->Release(); - } - - if (globals::state->frameAnnotations) - globals::state->EndPerfEvent(); -} diff --git a/src/Features/VR/WandPointing.cpp b/src/Features/VR/WandPointing.cpp deleted file mode 100644 index 2b748bba28..0000000000 --- a/src/Features/VR/WandPointing.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "Features/VR.h" -#include "RE/B/BSOpenVR.h" -#include "Utils/VRUtils.h" - -#include -#include -#include - -using namespace DirectX::SimpleMath; -using AttachMode = VR::Settings::OverlayAttachMode; - -bool VR::ComputeWandIntersectionForOverlayType(OverlayType type, vr::TrackedDeviceIndex_t controllerIndex, ImVec2& outUV) -{ - float controllerM[3][4]; - if (!Util::GetControllerWorldMatrix(controllerIndex, controllerM)) { - return false; - } - Matrix controllerWorld = Util::HmdMatrix34ToMatrix(Util::Float3x4ToHmdMatrix34(controllerM)); - Vector3 rayOrigin = controllerWorld.Translation(); - Vector3 rayDir = controllerWorld.Forward(); - - // Update debug state - wandState.rayOrigin = rayOrigin; - wandState.rayDirection = rayDir; - Matrix overlayWorld; - if (type == OverlayType::HMD) { - if (settings.VRMenuPositioningMethod == 1) { // Fixed World - overlayWorld = fixedWorldOverlayPosition.m; - } else { // HMD Relative - vr::TrackedDevicePose_t hmdPose; - if (!Util::GetDeviceToAbsoluteTrackingPoseCompatible(vr::TrackingUniverseStanding, 0, &hmdPose, 1)) - return false; - if (!hmdPose.bPoseIsValid) - return false; - Matrix hmdWorld = Util::HmdMatrix34ToMatrix(hmdPose.mDeviceToAbsoluteTracking); - Matrix offset = Matrix::CreateTranslation(settings.VRMenuOffsetX, settings.VRMenuOffsetY, settings.VRMenuOffsetZ); - overlayWorld = offset * hmdWorld; - } - } else { // Controller Relative - vr::TrackedDeviceIndex_t attachIndex = Util::GetControllerIndexForDevice(settings.VRMenuAttachController, lastKnownLeftHandedMode); - if (attachIndex == vr::k_unTrackedDeviceIndexInvalid) - return false; - - float attachM[3][4]; - if (!Util::GetControllerWorldMatrix(attachIndex, attachM)) - return false; - Matrix attachWorld = Util::HmdMatrix34ToMatrix(Util::Float3x4ToHmdMatrix34(attachM)); - - Matrix offset = Matrix::CreateTranslation(settings.VRMenuControllerOffsetX, settings.VRMenuControllerOffsetY, settings.VRMenuControllerOffsetZ); - overlayWorld = offset * attachWorld; - } - - if (settings.VRMenuScale < 1e-4f) - return false; - overlayWorld = Config::CreateOverlayScaleMatrix(settings.VRMenuScale) * overlayWorld; - - Matrix worldToOverlay = overlayWorld.Invert(); - Vector3 localOrigin = Vector3::Transform(rayOrigin, worldToOverlay); - Vector3 localDir = Vector3::TransformNormal(rayDir, worldToOverlay); - - if (std::abs(localDir.z) < 1e-6f) - return false; - - float t = -localOrigin.z / localDir.z; - if (t < 0.0f) - return false; - - Vector3 hit = localOrigin + t * localDir; - - if (hit.x < -0.5f || hit.x > 0.5f || hit.y < -0.5f || hit.y > 0.5f) - return false; - - outUV.x = hit.x + 0.5f; - outUV.y = 0.5f - hit.y; - - return true; -} - -bool VR::ComputeWandIntersection(vr::TrackedDeviceIndex_t controllerIndex, ImVec2& outUV) -{ - bool intersected = false; - if (settings.attachMode == AttachMode::HMDOnly || settings.attachMode == AttachMode::Both) { - if (ComputeWandIntersectionForOverlayType(OverlayType::HMD, controllerIndex, outUV)) { - intersected = true; - } - } - if (!intersected && (settings.attachMode == AttachMode::ControllerOnly || settings.attachMode == AttachMode::Both)) { - if (ComputeWandIntersectionForOverlayType(OverlayType::Controller, controllerIndex, outUV)) { - intersected = true; - } - } - - if (intersected) { - wandState.isIntersecting = true; - wandState.uvCoordinates = outUV; - wandState.controllerIndex = controllerIndex; - } else { - wandState.isIntersecting = false; - } - - return intersected; -} - -void VR::UpdateCursorFromWandPointing() -{ - if (!settings.EnableWandPointing || !globals::menu || !globals::menu->IsEnabled) - return; - - ImGuiIO& io = ImGui::GetIO(); - - vr::TrackedDeviceIndex_t pointingController = vr::k_unTrackedDeviceIndexInvalid; - - if (settings.attachMode == AttachMode::ControllerOnly || settings.attachMode == AttachMode::Both) { - ControllerDevice oppositeController = (settings.VRMenuAttachController == ControllerDevice::Primary) ? - ControllerDevice::Secondary : - ControllerDevice::Primary; - pointingController = Util::GetControllerIndexForDevice(oppositeController, lastKnownLeftHandedMode); - } else { - pointingController = Util::GetControllerIndexForDevice(ControllerDevice::Primary, lastKnownLeftHandedMode); - } - - if (pointingController == vr::k_unTrackedDeviceIndexInvalid) { - wandState.isIntersecting = false; - return; - } - - ImVec2 uv; - bool intersected = ComputeWandIntersection(pointingController, uv); - - if (intersected) { - float screenX = uv.x * io.DisplaySize.x; - float screenY = uv.y * io.DisplaySize.y; - - screenX = std::clamp(screenX, 0.0f, io.DisplaySize.x); - screenY = std::clamp(screenY, 0.0f, io.DisplaySize.y); - - io.MousePos = ImVec2(screenX, screenY); - io.AddMousePosEvent(screenX, screenY); - io.MouseDrawCursor = true; - io.WantSetMousePos = true; - } else { - wandState.isIntersecting = false; - io.MouseDrawCursor = false; - io.WantSetMousePos = false; - } -} diff --git a/src/Features/VRStereoOptimizations.cpp b/src/Features/VRStereoOptimizations.cpp deleted file mode 100644 index cf886a2cbf..0000000000 --- a/src/Features/VRStereoOptimizations.cpp +++ /dev/null @@ -1,622 +0,0 @@ -#include "VRStereoOptimizations.h" - -#include "ExtendedMaterials.h" -#include "Globals.h" -#include "I18n/I18n.h" -#define I18N_KEY_PREFIX "feature.vr_stereo." -#include "Menu.h" -#include "State.h" -#include "Utils/D3D.h" -#include "Utils/Game.h" -#include "Utils/UI.h" - -#include - -// JSON enum serialization for StereoMode -NLOHMANN_JSON_SERIALIZE_ENUM(VRStereoOptimizations::StereoMode, { - { VRStereoOptimizations::StereoMode::Off, "Off" }, - { VRStereoOptimizations::StereoMode::Enable, "Enable" }, - }) - -//============================================================================= -// SETTINGS MANAGEMENT -//============================================================================= - -void VRStereoOptimizations::SaveSettings(json& o_json) -{ - o_json["StereoMode"] = settings.stereoMode; - o_json["DisocclusionDepthThreshold"] = settings.disocclusionDepthThreshold; - o_json["FullBlendDistance"] = settings.fullBlendDistance; - o_json["QualityJitterOffset"] = settings.qualityJitterOffset; - o_json["FoveatedRegionRadius"] = settings.foveatedRegionRadius; - o_json["FoveatedRegionCenterX"] = settings.foveatedRegionCenterX; - o_json["FoveatedRegionCenterY"] = settings.foveatedRegionCenterY; - o_json["UseEyeTracking"] = settings.useEyeTracking; - o_json["DebugVisualization"] = settings.debugVisualization; - o_json["DebugSkipMerge"] = settings.debugSkipMerge; - o_json["DebugForceAllStencil"] = settings.debugForceAllStencil; - o_json["DebugForceAllReprojectCS"] = settings.debugForceAllReprojectCS; - o_json["DebugDepthMap"] = settings.debugDepthMap; - o_json["DebugFullBlendDepth"] = settings.debugFullBlendDepth; - o_json["DebugPOMDepth"] = settings.debugPOMDepth; - o_json["POMDepthScale"] = settings.pomDepthScale; - o_json["ForwardOcclusionScale"] = settings.forwardOcclusionScale; -} - -void VRStereoOptimizations::LoadSettings(json& o_json) -{ - auto loadClampedFloat = [&](const char* key, float& dst, float lo, float hi) { - if (auto it = o_json.find(key); it != o_json.end() && it->is_number()) - dst = std::clamp(it->get(), lo, hi); - }; - auto loadBool = [&](const char* key, bool& dst) { - if (auto it = o_json.find(key); it != o_json.end() && it->is_boolean()) - dst = it->get(); - }; - - if (o_json.contains("StereoMode")) - settings.stereoMode = o_json["StereoMode"].get(); - - loadClampedFloat("DisocclusionDepthThreshold", settings.disocclusionDepthThreshold, 0.001f, 0.1f); - loadClampedFloat("QualityJitterOffset", settings.qualityJitterOffset, 0.0f, 1.0f); - loadClampedFloat("FoveatedRegionRadius", settings.foveatedRegionRadius, 0.0f, 1.0f); - loadClampedFloat("FoveatedRegionCenterX", settings.foveatedRegionCenterX, 0.0f, 1.0f); - loadClampedFloat("FoveatedRegionCenterY", settings.foveatedRegionCenterY, 0.0f, 1.0f); - loadClampedFloat("FullBlendDistance", settings.fullBlendDistance, 0.0f, 50000.0f); - loadClampedFloat("POMDepthScale", settings.pomDepthScale, 0.0f, 500.0f); - loadClampedFloat("ForwardOcclusionScale", settings.forwardOcclusionScale, 0.0f, 10.0f); - - loadBool("UseEyeTracking", settings.useEyeTracking); - loadBool("DebugVisualization", settings.debugVisualization); - loadBool("DebugSkipMerge", settings.debugSkipMerge); - loadBool("DebugForceAllStencil", settings.debugForceAllStencil); - loadBool("DebugForceAllReprojectCS", settings.debugForceAllReprojectCS); - loadBool("DebugDepthMap", settings.debugDepthMap); - loadBool("DebugFullBlendDepth", settings.debugFullBlendDepth); - loadBool("DebugPOMDepth", settings.debugPOMDepth); -} - -void VRStereoOptimizations::RestoreDefaultSettings() -{ - settings = {}; -} - -//============================================================================= -// RESOURCE SETUP -//============================================================================= - -void VRStereoOptimizations::SetupResources() -{ - if (!REL::Module::IsVR()) - return; - - auto device = globals::d3d::device; - auto renderer = globals::game::renderer; - - // Constant buffers - paramsCB = eastl::make_unique(ConstantBufferDesc(), "VRStereoOpt::ParamsCB"); - - // Get main RT dimensions for per-eye calculations - auto& main = renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN]; - D3D11_TEXTURE2D_DESC mainDesc; - main.texture->GetDesc(&mainDesc); - - // Per-pixel mode texture (R8_UINT, full SBS resolution = both eyes) - { - D3D11_TEXTURE2D_DESC modeDesc{}; - modeDesc.Width = mainDesc.Width; - modeDesc.Height = mainDesc.Height; - modeDesc.MipLevels = 1; - modeDesc.ArraySize = 1; - modeDesc.Format = DXGI_FORMAT_R8_UINT; - modeDesc.SampleDesc.Count = 1; - modeDesc.SampleDesc.Quality = 0; - modeDesc.Usage = D3D11_USAGE_DEFAULT; - modeDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; - modeDesc.CPUAccessFlags = 0; - modeDesc.MiscFlags = 0; - - texPerPixelMode = eastl::make_unique(modeDesc, "VRStereoOpt::PerPixelMode"); - texPerPixelMode->CreateSRV(D3D11_SHADER_RESOURCE_VIEW_DESC{ - .Format = DXGI_FORMAT_R8_UINT, - .ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D, - .Texture2D = { .MostDetailedMip = 0, .MipLevels = 1 } }); - texPerPixelMode->CreateUAV(D3D11_UNORDERED_ACCESS_VIEW_DESC{ - .Format = DXGI_FORMAT_R8_UINT, - .ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D, - .Texture2D = { .MipSlice = 0 } }); - } - - // POM offset texture (R16_FLOAT, full SBS resolution) - // Written by Lighting PS (u7) for POM-active pixels, read by StereoBlendCS for depth-aware reprojection. - // Replaces the former overloading of Reflectance.w, so Reflectance stays R11G11B10 with no alpha. - { - D3D11_TEXTURE2D_DESC pomDesc{}; - pomDesc.Width = mainDesc.Width; - pomDesc.Height = mainDesc.Height; - pomDesc.MipLevels = 1; - pomDesc.ArraySize = 1; - pomDesc.Format = DXGI_FORMAT_R16_FLOAT; - pomDesc.SampleDesc.Count = 1; - pomDesc.SampleDesc.Quality = 0; - pomDesc.Usage = D3D11_USAGE_DEFAULT; - pomDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; - pomDesc.CPUAccessFlags = 0; - pomDesc.MiscFlags = 0; - - texPomOffset = eastl::make_unique(pomDesc, "VRStereoOpt::PomOffset"); - texPomOffset->CreateSRV(D3D11_SHADER_RESOURCE_VIEW_DESC{ - .Format = DXGI_FORMAT_R16_FLOAT, - .ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D, - .Texture2D = { .MostDetailedMip = 0, .MipLevels = 1 } }); - texPomOffset->CreateUAV(D3D11_UNORDERED_ACCESS_VIEW_DESC{ - .Format = DXGI_FORMAT_R16_FLOAT, - .ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D, - .Texture2D = { .MipSlice = 0 } }); - } - - // Depth-stencil state for stencil write pass: - // Depth test OFF (not rendering geometry), depth writes OFF, stencil ALWAYS + REPLACE with ref=1. - // We use the normal (writable) kMAIN DSV — no simultaneous SRV binding needed. - { - D3D11_DEPTH_STENCIL_DESC dssDesc{}; - dssDesc.DepthEnable = FALSE; - dssDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - dssDesc.StencilEnable = TRUE; - dssDesc.StencilReadMask = 0xFF; - dssDesc.StencilWriteMask = 0xFF; - dssDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - dssDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - dssDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_REPLACE; - dssDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - dssDesc.BackFace = dssDesc.FrontFace; - - DX::ThrowIfFailed(device->CreateDepthStencilState(&dssDesc, stencilWriteDSS.put())); - Util::SetResourceName(stencilWriteDSS.get(), "VRStereoOpt::StencilWriteDSS"); - } - - // Rasterizer state for stencil write: no culling, no depth clip - { - D3D11_RASTERIZER_DESC rsDesc{}; - rsDesc.FillMode = D3D11_FILL_SOLID; - rsDesc.CullMode = D3D11_CULL_NONE; - rsDesc.DepthClipEnable = FALSE; - - DX::ThrowIfFailed(device->CreateRasterizerState(&rsDesc, stencilWriteRS.put())); - } - - CompileShaders(); - - logger::info("[VRStereoOptimizations] Resources created: mode tex {}x{} (full SBS)", mainDesc.Width, mainDesc.Height); -} - -void VRStereoOptimizations::CompileShaders() -{ - std::vector> csDefines = { - { "VR", nullptr }, - { "FRAMEBUFFER", nullptr } - }; - - std::vector> vspsDefines = { - { "VR", nullptr } - }; - - if (auto* ptr = Util::CompileShader(L"Data\\Shaders\\VRStereoOptimizations\\StencilCS.hlsl", csDefines, "cs_5_0")) - stencilCS.attach(reinterpret_cast(ptr)); - else - logger::error("[VRStereoOptimizations] Failed to compile StencilCS"); - - { - auto debugDefines = csDefines; - debugDefines.push_back({ "DEBUG_DEPTH_MAP", nullptr }); - if (auto* ptr = Util::CompileShader(L"Data\\Shaders\\VRStereoOptimizations\\StencilCS.hlsl", debugDefines, "cs_5_0")) - stencilDebugDepthMapCS.attach(reinterpret_cast(ptr)); - else - logger::error("[VRStereoOptimizations] Failed to compile StencilCS (DEBUG_DEPTH_MAP)"); - } - - if (auto* ptr = Util::CompileShader(L"Data\\Shaders\\VRStereoOptimizations\\StencilWriteVS.hlsl", vspsDefines, "vs_5_0")) - stencilWriteVS.attach(reinterpret_cast(ptr)); - else - logger::error("[VRStereoOptimizations] Failed to compile StencilWriteVS"); - - if (auto* ptr = Util::CompileShader(L"Data\\Shaders\\VRStereoOptimizations\\StencilWritePS.hlsl", vspsDefines, "ps_5_0")) - stencilWritePS.attach(reinterpret_cast(ptr)); - else - logger::error("[VRStereoOptimizations] Failed to compile StencilWritePS"); -} - -void VRStereoOptimizations::ClearShaderCache() -{ - stencilCS = nullptr; - stencilDebugDepthMapCS = nullptr; - stencilWriteVS = nullptr; - stencilWritePS = nullptr; - dssCache.clear(); -} - -void VRStereoOptimizations::Reset() -{ - stencilActive = false; - stencilSwapCount = 0; -} - -void VRStereoOptimizations::ClearPomOffsetTexture() -{ - if (!texPomOffset) - return; - const float clearValue[4] = { kPomOffsetNoData, kPomOffsetNoData, kPomOffsetNoData, kPomOffsetNoData }; - globals::d3d::context->ClearUnorderedAccessViewFloat(texPomOffset->uav.get(), clearValue); -} - -//============================================================================= -// IMGUI SETTINGS -//============================================================================= - -void VRStereoOptimizations::DrawSettings() -{ - const char* modeNames[] = { T("feature.vr_stereo.off", "Off"), T("feature.vr_stereo.enable", "Enable") }; - int currentMode = static_cast(settings.stereoMode); - if (ImGui::Combo(T(TKEY("enable_stereo_reprojection"), "Enable Stereo Reprojection"), ¤tMode, modeNames, IM_ARRAYSIZE(modeNames))) - settings.stereoMode = static_cast(currentMode); - Util::AddTooltip(T(TKEY("enable_stereo_reprojection_tooltip"), "Reprojects Eye 0 (left) pixels into Eye 1 (right) using depth and motion data,\nskipping redundant full shading where the views overlap.\nReduces GPU cost in VR by shading each pixel fewer times per frame.")); - - if (globals::game::isVR && settings.stereoMode == StereoMode::Enable && !loaded) { - const auto& themeSettings = Menu::GetSingleton()->GetTheme(); - ImGui::TextColored(themeSettings.StatusPalette.RestartNeeded, - "%s", T(TKEY("restart_required"), "Restart is required to enable VR stereo reprojection.")); - } - if (settings.stereoMode == StereoMode::Off) - return; - - ImGui::SliderFloat(T(TKEY("disocclusion_depth_threshold"), "Disocclusion Depth Threshold"), &settings.disocclusionDepthThreshold, 0.001f, 0.1f, "%.4f"); - - ImGui::SliderFloat(T(TKEY("forward_occlusion_scale"), "Forward Occlusion Scale"), &settings.forwardOcclusionScale, 0.0f, 1.0f, "%.2f"); - Util::AddTooltip(T(TKEY("forward_occlusion_scale_tooltip"), "Prevents Eye 0 silhouette edges from bleeding onto Eye 1 backgrounds.\nFires when Eye 0 depth is within this fraction of Eye 1 depth (e.g. 0.5 = Eye 0 less than 2x Eye 1 depth).\nLower = more aggressive. 0 = disabled.")); - - if (globals::state->IsDeveloperMode()) { - if (ImGui::TreeNode(T(TKEY("debug"), "Debug"))) { - ImGui::SliderFloat(T(TKEY("full_blend_distance"), "Full Blend Distance"), &settings.fullBlendDistance, 0.0f, 10000.0f, "%.0f"); - Util::AddTooltip(T(TKEY("full_blend_distance_tooltip"), "Geometry closer than this distance (game units) is fully shaded in both eyes and bilaterally blended for 2x supersampling. 0 = disabled.")); - - ImGui::SliderFloat(T(TKEY("pom_depth_scale"), "POM Depth Scale"), &settings.pomDepthScale, 0.0f, 500.0f, "%.1f"); - Util::AddTooltip(T(TKEY("pom_depth_scale_tooltip"), "Scale factor for POM depth correction in stereo reprojection.\n1.0 = physical scale. Increase for more visible POM stereo depth.")); - ImGui::Checkbox(T(TKEY("skip_pixel_reprojection"), "Skip Pixel Reprojection"), &settings.debugSkipMerge); - ImGui::Checkbox(T(TKEY("full_blend_depth_view"), "Full Blend Depth View"), &settings.debugFullBlendDepth); - ImGui::Checkbox(T(TKEY("debug_pom_depth"), "Debug POM Depth"), &settings.debugPOMDepth); - if (settings.debugFullBlendDepth) - ImGui::TextColored(ImVec4(0, 1, 1, 1), "%s", T(TKEY("full_blend_zone_hint"), " Cyan = full blend zone (closer = stronger tint)")); - ImGui::Text("Stencil swaps this frame: %u", stencilSwapCount); - ImGui::TreePop(); - } - } -} - -//============================================================================= -// CONSTANT BUFFER UPDATE -//============================================================================= - -void VRStereoOptimizations::UpdateConstantBuffer() -{ - float2 resolution = Util::ConvertToDynamic(globals::state->screenSize); - - VRStereoOptParams params{}; - params.FrameDim[0] = resolution.x; - params.FrameDim[1] = resolution.y; - params.RcpFrameDim[0] = 1.0f / resolution.x; - params.RcpFrameDim[1] = 1.0f / resolution.y; - params.StereoModeValue = static_cast(settings.stereoMode); - params.DisocclusionThreshold = settings.disocclusionDepthThreshold; - params.EdgeDepthThreshold = settings.edgeDepthThreshold; - params.EdgeWidth = 2; - params.QualityJitter[0] = settings.qualityJitterOffset; - params.QualityJitter[1] = settings.qualityJitterOffset; - params.FoveatedRadius = settings.foveatedRegionRadius; - params.FoveatedCenter[0] = settings.foveatedRegionCenterX; - params.FoveatedCenter[1] = settings.foveatedRegionCenterY; - params.MinEdgeDistance = settings.minEdgeDistance; - params.FullBlendDistance = settings.fullBlendDistance; - params.ForwardOcclusionScale = settings.forwardOcclusionScale; - - paramsCB->Update(params); -} - -//============================================================================= -// PHASE 1: STENCIL CLASSIFICATION + WRITE -//============================================================================= - -void VRStereoOptimizations::DispatchStencil() -{ - if (!REL::Module::IsVR()) - return; - if (settings.stereoMode == StereoMode::Off) - return; - if (!stencilCS || !stencilWriteVS || !stencilWritePS || !texPerPixelMode || !paramsCB || - !stencilWriteDSS || !stencilWriteRS) - return; - - ZoneScoped; - TracyD3D11Zone(globals::state->tracyCtx, "VR Stereo Opt - Stencil"); - - if (globals::state->frameAnnotations) - globals::state->BeginPerfEvent("VR Stereo Opt - Stencil"); - - auto context = globals::d3d::context; - - UpdateConstantBuffer(); - auto cbPtr = paramsCB->CB(); - // Use the same depth source as the rest of the deferred pipeline. - // kMAIN.depthSRV is unpopulated at StartDeferred time (z-prepass has not written to it yet). - // GetCurrentSceneDepthSRV() returns TerrainBlending's blended depth when active, or - // kPOST_ZPREPASS_COPY otherwise — both have valid z-prepass data by this point. - auto* depthSRV = Util::GetCurrentSceneDepthSRV(); - if (!depthSRV) { - logger::warn("[VRStereoOptimizations] DispatchStencil: depthSRV is null, skipping"); - if (globals::state->frameAnnotations) - globals::state->EndPerfEvent(); - return; - } - - // Dispatch classification CS over Eye 1 region - // Input: t0 = depth, b1 = params CB - // Output: u0 = per-pixel mode texture - { - TracyD3D11Zone(globals::state->tracyCtx, "StereoOpt - Mode Classify"); - - { - TracyD3D11Zone(globals::state->tracyCtx, "StereoOpt - Mode Classify Bind"); - - ID3D11ShaderResourceView* srvs[1]{ depthSRV }; - ID3D11UnorderedAccessView* uavs[1]{ texPerPixelMode->uav.get() }; - - context->CSSetConstantBuffers(1, 1, &cbPtr); - context->CSSetShaderResources(0, 1, srvs); - context->CSSetUnorderedAccessViews(0, 1, uavs, nullptr); - auto* activeStencilCS = (settings.debugDepthMap && stencilDebugDepthMapCS) ? stencilDebugDepthMapCS.get() : stencilCS.get(); - context->CSSetShader(activeStencilCS, nullptr, 0); - } - - { - TracyD3D11Zone(globals::state->tracyCtx, "StereoOpt - Mode Classify Dispatch"); - - uint32_t fullWidth = texPerPixelMode->desc.Width; - uint32_t fullHeight = texPerPixelMode->desc.Height; - globals::profiler->BeginPass("VR::StencilClassify"); - context->Dispatch((fullWidth + 7) / 8, (fullHeight + 7) / 8, 1); - globals::profiler->EndPass(); - } - - // Cleanup CS bindings - ID3D11ShaderResourceView* nullSRV = nullptr; - ID3D11UnorderedAccessView* nullUAV = nullptr; - ID3D11Buffer* nullCB = nullptr; - context->CSSetShaderResources(0, 1, &nullSRV); - context->CSSetUnorderedAccessViews(0, 1, &nullUAV, nullptr); - context->CSSetConstantBuffers(1, 1, &nullCB); - context->CSSetShader(nullptr, nullptr, 0); - } - - // Transfer classification to hardware stencil buffer - { - TracyD3D11Zone(globals::state->tracyCtx, "StereoOpt - Stencil Write"); - globals::profiler->BeginPass("VR::StencilWrite"); - ExecuteStencilWritePass(); - globals::profiler->EndPass(); - } - - stencilActive = true; - stencilSwapCount = 0; - - if (globals::state->frameAnnotations) - globals::state->EndPerfEvent(); -} - -void VRStereoOptimizations::ExecuteStencilWritePass() -{ - auto context = globals::d3d::context; - auto renderer = globals::game::renderer; - - // ===== SAVE FULL D3D11 PIPELINE STATE ===== - - ID3D11RenderTargetView* savedRTVs[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = {}; - ID3D11DepthStencilView* savedDSV = nullptr; - context->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, savedRTVs, &savedDSV); - - ID3D11DepthStencilState* savedDSS = nullptr; - UINT savedStencilRef = 0; - context->OMGetDepthStencilState(&savedDSS, &savedStencilRef); - - ID3D11BlendState* savedBlendState = nullptr; - FLOAT savedBlendFactor[4] = {}; - UINT savedSampleMask = 0; - context->OMGetBlendState(&savedBlendState, savedBlendFactor, &savedSampleMask); - - ID3D11RasterizerState* savedRS = nullptr; - context->RSGetState(&savedRS); - - D3D11_VIEWPORT savedViewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE] = {}; - UINT numViewports = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; - context->RSGetViewports(&numViewports, savedViewports); - - ID3D11VertexShader* savedVS = nullptr; - context->VSGetShader(&savedVS, nullptr, nullptr); - - ID3D11PixelShader* savedPS = nullptr; - context->PSGetShader(&savedPS, nullptr, nullptr); - - ID3D11GeometryShader* savedGS = nullptr; - context->GSGetShader(&savedGS, nullptr, nullptr); - - ID3D11InputLayout* savedInputLayout = nullptr; - context->IAGetInputLayout(&savedInputLayout); - - D3D11_PRIMITIVE_TOPOLOGY savedTopology = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED; - context->IAGetPrimitiveTopology(&savedTopology); - - ID3D11ShaderResourceView* savedPSSRV = nullptr; - context->PSGetShaderResources(0, 1, &savedPSSRV); - - ID3D11Buffer* savedPSCB = nullptr; - context->PSGetConstantBuffers(1, 1, &savedPSCB); - - // ===== SET UP STENCIL WRITE PASS ===== - - // Clear stencil buffer to 0 before writing classification. - // The engine's z-prepass may have written stencil values for rendered geometry. - // Without this clear, non-discarded pixels in StencilWritePS could inherit engine stencil - // values that match our NOT_EQUAL ref=1 culling test and incorrectly skip geometry pixels. - // StencilWritePS no longer binds a depth SRV, so we can use the normal writable DSV here. - { - auto& depthData = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - context->ClearDepthStencilView(depthData.views[0], D3D11_CLEAR_STENCIL, 1.0f, 0); - } - - // Use the normal DSV for stencil writes — no depth SRV is bound simultaneously, - // so there is no D3D11 resource hazard and stencil writes are not suppressed. - auto& depthData = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - context->OMSetRenderTargets(0, nullptr, depthData.views[0]); - context->OMSetDepthStencilState(stencilWriteDSS.get(), 1); - context->RSSetState(stencilWriteRS.get()); - - // Eye 1 viewport (right half of SBS buffer) - { - D3D11_TEXTURE2D_DESC mainDesc; - renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN].texture->GetDesc(&mainDesc); - - D3D11_VIEWPORT vp{}; - vp.TopLeftX = static_cast(mainDesc.Width / 2); - vp.TopLeftY = 0.0f; - vp.Width = static_cast(mainDesc.Width / 2); - vp.Height = static_cast(mainDesc.Height); - vp.MinDepth = 0.0f; - vp.MaxDepth = 1.0f; - context->RSSetViewports(1, &vp); - } - - // Bind shaders and mode texture - context->VSSetShader(stencilWriteVS.get(), nullptr, 0); - context->PSSetShader(stencilWritePS.get(), nullptr, 0); - context->GSSetShader(nullptr, nullptr, 0); - - ID3D11ShaderResourceView* modeSRV = texPerPixelMode->srv.get(); - context->PSSetShaderResources(0, 1, &modeSRV); - - // Bind params CB to pixel shader (CS and PS have separate CB bindings) - auto cbPtr = paramsCB->CB(); - context->PSSetConstantBuffers(1, 1, &cbPtr); - - // Fullscreen triangle: no VB/IB, procedurally generated in VS - context->IASetInputLayout(nullptr); - context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - context->Draw(3, 0); - - // ===== RESTORE FULL D3D11 PIPELINE STATE ===== - - ID3D11ShaderResourceView* nullSRV = nullptr; - context->PSSetShaderResources(0, 1, &nullSRV); - - context->PSSetConstantBuffers(1, 1, &savedPSCB); - - context->OMSetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, savedRTVs, savedDSV); - context->OMSetDepthStencilState(savedDSS, savedStencilRef); - context->OMSetBlendState(savedBlendState, savedBlendFactor, savedSampleMask); - context->RSSetState(savedRS); - context->RSSetViewports(numViewports, savedViewports); - context->VSSetShader(savedVS, nullptr, 0); - context->PSSetShader(savedPS, nullptr, 0); - context->GSSetShader(savedGS, nullptr, 0); - context->IASetInputLayout(savedInputLayout); - context->IASetPrimitiveTopology(savedTopology); - context->PSSetShaderResources(0, 1, &savedPSSRV); - - // Release COM references acquired by Get* calls - for (auto& rtv : savedRTVs) { - if (rtv) - rtv->Release(); - } - if (savedDSV) - savedDSV->Release(); - if (savedDSS) - savedDSS->Release(); - if (savedBlendState) - savedBlendState->Release(); - if (savedRS) - savedRS->Release(); - if (savedVS) - savedVS->Release(); - if (savedPS) - savedPS->Release(); - if (savedGS) - savedGS->Release(); - if (savedInputLayout) - savedInputLayout->Release(); - if (savedPSSRV) - savedPSSRV->Release(); - if (savedPSCB) - savedPSCB->Release(); -} - -//============================================================================= -// DSS CACHE: CLONE + STENCIL NOT_EQUAL ENFORCEMENT -//============================================================================= - -ID3D11DepthStencilState* VRStereoOptimizations::GetOrCreateModifiedDSS(ID3D11DepthStencilState* originalDSS) -{ - if (!stencilActive) - return originalDSS; - - // Check cache (nullptr is a valid key — represents D3D11 default state) - if (auto it = dssCache.find(originalDSS); it != dssCache.end()) - return it->second.get(); - - D3D11_DEPTH_STENCIL_DESC desc; - if (originalDSS) { - originalDSS->GetDesc(&desc); - } else { - // D3D11 default state: depth enabled, stencil disabled - desc = {}; - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_LESS; - desc.StencilEnable = FALSE; - desc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; - desc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; - desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - desc.BackFace = desc.FrontFace; - } - - desc.StencilEnable = TRUE; - desc.StencilReadMask = 0xFF; - desc.StencilWriteMask = 0x00; - - desc.FrontFace.StencilFunc = D3D11_COMPARISON_NOT_EQUAL; - desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - desc.BackFace = desc.FrontFace; - - winrt::com_ptr modifiedDSS; - HRESULT hr = globals::d3d::device->CreateDepthStencilState(&desc, modifiedDSS.put()); - if (FAILED(hr)) { - logger::warn("[VRStereoOptimizations] Failed to create modified DSS (HRESULT: {:#x})", static_cast(hr)); - return originalDSS; - } - - auto* result = modifiedDSS.get(); - dssCache[originalDSS] = std::move(modifiedDSS); - - return result; -} -void VRStereoOptimizations::DeactivateStencil() -{ - if (!stencilActive) - return; - logger::trace("[VRStereoOptimizations] Frame: stencilSwapCount={}", stencilSwapCount); - stencilActive = false; -} - -#undef I18N_KEY_PREFIX diff --git a/src/Features/VRStereoOptimizations.h b/src/Features/VRStereoOptimizations.h deleted file mode 100644 index 4f324395ce..0000000000 --- a/src/Features/VRStereoOptimizations.h +++ /dev/null @@ -1,221 +0,0 @@ -#pragma once - -#include -using json = nlohmann::json; - -#include -#include -#include - -/** - * @brief VR Stereo Rendering Optimizations feature. - * - * Uses hardware stencil culling to skip Eye 1 pixel shading for pixels that can be - * reprojected from Eye 0 via lateral stereo reprojection, then runs a compute shader - * to fill those pixels. This avoids redundant pixel shading in overlapping stereo regions. - * - * Pipeline: - * 1. DispatchStencil() - CS classifies per-pixel reprojection viability into a mode texture, - * then a fullscreen VS/PS pass writes that classification into the stencil buffer. - * 2. (Game renders Eye 1) - Hardware stencil test skips shading for marked pixels. - * 3. VR::DrawStereoBlend() - Stereo overwrite CS reprojects Eye 0 color into skipped Eye 1 pixels. - */ -struct VRStereoOptimizations -{ - bool loaded = false; - - //============================================================================= - // ENUMS - //============================================================================= - - /// Operating mode for stereo reprojection - enum class StereoMode : uint32_t - { - Off = 0, ///< Feature disabled - Enable = 1 ///< Stereo reprojection enabled - }; - - /// Per-pixel classification written by StencilCS - enum PixelMode : uint8_t - { - MODE_DISOCCLUDED = 0, ///< Fully shaded, no reprojection, no blend - MODE_EDGE = 1, ///< Fully shaded + bilateral blend with other eye - MODE_MAIN = 2, ///< Eye 0: no reproject (Perf) / bilateral (Quality). Eye 1: overwrite (Perf) / bilateral (Quality) - MODE_EDGE_NEIGHBOUR = 3, ///< Outer band: background pixels near edge, blended in post-process - MODE_FULL_BLEND = 4, ///< Near-camera pixels: fully shaded in both eyes + bilateral blended - }; - - //============================================================================= - // CONSTANTS - //============================================================================= - - /// Sentinel written to texPomOffset when POM did not run for a pixel. - /// -1.0 = no POM; >= 0.0 = POM ran. Matches Stereo::POM_NO_DATA in Common/VR.hlsli. - static constexpr float kPomOffsetNoData = -1.0f; - - //============================================================================= - // PUBLIC METHODS - //============================================================================= - - void SetupResources(); - void Reset(); - void DrawSettings(); - void SaveSettings(json& o_json); - void LoadSettings(json& o_json); - void RestoreDefaultSettings(); - void ClearShaderCache(); - - //============================================================================= - // SETTINGS - //============================================================================= - - struct Settings - { - StereoMode stereoMode = StereoMode::Off; - float disocclusionDepthThreshold = 0.01f; - float edgeDepthThreshold = 0.05f; - float minEdgeDistance = 5000.0f; ///< Minimum linearized depth for edge AA (game units) - float fullBlendDistance = 0.0f; ///< Linearized depth below which both eyes are fully shaded + blended (game units) - float pomDepthScale = 22.5f; ///< Scale factor for POM depth correction in stereo reprojection - float forwardOcclusionScale = 0.1f; ///< Eye 0 depth multiplier for directional disocclusion; 0 = disabled - bool debugFullBlendDepth = false; ///< Show full blend depth zone as cyan overlay - float qualityJitterOffset = 0.125f; - float foveatedRegionRadius = 0.3f; - float foveatedRegionCenterX = 0.5f; - float foveatedRegionCenterY = 0.5f; - bool useEyeTracking = false; - - // Debug controls - bool debugVisualization = false; - bool debugSkipMerge = false; - bool debugForceAllStencil = false; - bool debugForceAllReprojectCS = false; - bool debugDepthMap = false; - bool debugPOMDepth = false; ///< Show POM depth data (texPomOffset) as heatmap overlay - - } settings; - - //============================================================================= - // GPU CONSTANT BUFFER (must match HLSL cbuffer layout exactly) - //============================================================================= - - struct alignas(16) VRStereoOptParams - { - float FrameDim[2]; // Full stereo buffer dimensions - float RcpFrameDim[2]; // 1.0 / FrameDim - - uint32_t StereoModeValue; // Cast of StereoMode enum (0-3) - float DisocclusionThreshold; - float EdgeDepthThreshold; - uint32_t EdgeWidth; - - float QualityJitter[2]; // Sub-pixel jitter offset (Quality mode) - float FoveatedRadius; - float ForwardOcclusionScale; ///< Eye 0 depth multiplier for directional disocclusion (0 = disabled) - - float FoveatedCenter[2]; // Foveal region center UV - float MinEdgeDistance; - float FullBlendDistance; // Linearized depth for full blend zone - }; - static_assert(sizeof(VRStereoOptParams) % 16 == 0, "VRStereoOptParams must be 16-byte aligned for HLSL cbuffer."); - - //============================================================================= - // PUBLIC API - //============================================================================= - - /** - * @brief Classify Eye 1 pixels and write stencil marks. - * - * Dispatches the stencil classification CS, then performs a fullscreen triangle pass - * to write the classification into the hardware stencil buffer. - * Called from Deferred::StartDeferred() after OverrideBlendStates(). - */ - void DispatchStencil(); - - /** - * @brief Returns true when stencil classification/write resources are ready. - * - * This mirrors DispatchStencil prerequisites except transient per-frame inputs - * like depth SRV availability. - */ - bool CanDispatchStencil() const - { - return loaded && - settings.stereoMode != StereoMode::Off && - !settings.debugSkipMerge && - stencilCS && - stencilWriteVS && - stencilWritePS && - texPerPixelMode && - paramsCB && - stencilWriteDSS && - stencilWriteRS; - } - - /** - * @brief Creates or retrieves a modified DSS with stencil NOT_EQUAL test. - * - * Clones the given DSS with read-only stencil (WriteMask=0x00, Func=NOT_EQUAL, ref=1) - * so that pixels marked by our stencil write pass are skipped during normal rendering. - * Cached per unique input DSS pointer. - * - * @param originalDSS The original depth-stencil state to modify. - * @return Modified DSS with stencil test, or original if creation fails. - */ - ID3D11DepthStencilState* GetOrCreateModifiedDSS(ID3D11DepthStencilState* originalDSS); - - /// Whether the stencil pass is currently active this frame - bool IsStencilActive() const { return stencilActive; } - void NoteStencilSwap() { ++stencilSwapCount; } - - /// Deactivate stencil culling (called from Deferred after geometry rendering completes) - void DeactivateStencil(); - - /// Get mode texture SRV for external consumers (e.g., DeferredCompositeCS Eye 1 skip) - ID3D11ShaderResourceView* GetModeTextureSRV() const { return texPerPixelMode ? texPerPixelMode->srv.get() : nullptr; } - - /// Get POM offset texture SRV for StereoBlendCS (reads per-pixel parallax depth offset) - ID3D11ShaderResourceView* GetPomOffsetSRV() const { return texPomOffset ? texPomOffset->srv.get() : nullptr; } - - /// Get POM offset texture UAV for PS writes during deferred lighting (injected at u7) - ID3D11UnorderedAccessView* GetPomOffsetUAV() const { return texPomOffset ? texPomOffset->uav.get() : nullptr; } - - /// Clear the POM offset texture to -1.0 (no-POM sentinel) at the start of each deferred frame - void ClearPomOffsetTexture(); - -private: - //============================================================================= - // INTERNAL METHODS - //============================================================================= - - /// Fullscreen triangle pass: reads mode texture, writes stencil ref=1 for MODE_MAIN pixels - void ExecuteStencilWritePass(); - - /// Compiles all shaders used by this feature - void CompileShaders(); - - /// Updates the constant buffer with current settings and frame dimensions - void UpdateConstantBuffer(); - - //============================================================================= - // GPU RESOURCES - //============================================================================= - - eastl::unique_ptr paramsCB; - eastl::unique_ptr texPerPixelMode; ///< R8_UINT classification texture (full SBS resolution) - eastl::unique_ptr texPomOffset; ///< R16_FLOAT POM depth offset written by Lighting PS, read by StereoBlendCS - - winrt::com_ptr stencilWriteDSS; - winrt::com_ptr stencilWriteRS; - - winrt::com_ptr stencilCS; - winrt::com_ptr stencilDebugDepthMapCS; - winrt::com_ptr stencilWriteVS; - winrt::com_ptr stencilWritePS; - - /// Cache of original DSS -> modified DSS with stencil NOT_EQUAL enforcement - std::unordered_map> dssCache; - - bool stencilActive = false; - uint32_t stencilSwapCount = 0; -}; diff --git a/src/Features/VolumetricLighting.cpp b/src/Features/VolumetricLighting.cpp index db9f646b10..280427e632 100644 --- a/src/Features/VolumetricLighting.cpp +++ b/src/Features/VolumetricLighting.cpp @@ -146,39 +146,14 @@ void VolumetricLighting::SaveSettings(json& o_json) void VolumetricLighting::RestoreDefaultSettings() { settings = {}; - if (globals::game::isVR) - Util::ResetGameSettingsToDefaults(hiddenVRSettings); } void VolumetricLighting::DataLoaded() { - auto shaderCache = globals::shaderCache; - const static auto address = REL::Offset{ 0x1ec6b88 }.address(); - bool& bDepthBufferCulling = *reinterpret_cast(address); - - if (REL::Module::IsVR() && bDepthBufferCulling && shaderCache->IsDiskCache()) { - // clear cache to fix bug caused by bDepthBufferCulling - logger::info("Force clearing cache due to bDepthBufferCulling"); - shaderCache->Clear(); - } } void VolumetricLighting::PostPostLoad() { - if (REL::Module::IsVR()) { - if (settings.ExteriorEnabled || settings.InteriorEnabled) - EnableBooleanSettings(hiddenVRSettings, GetName()); - auto address = REL::RelocationID(100475, 0).address() + 0x45b; // AE not needed, VR only hook - logger::info("[{}] Hooking CopyResource at {:x}", GetName(), address); - REL::safe_fill(address, REL::NOP, 7); - stl::write_thunk_call(address); - - // Skip volumetric lighting rendering - REL::safe_write(REL::RelocationID(35560, 0).address() + REL::Relocate(0x254, 0), &REL::JMP8, 1); - // Move it to render after depth to ensure camera matches rest of scene - stl::write_thunk_call(REL::RelocationID(35560, 0).address() + REL::Relocate(0x2EE, 0)); - } - bEnableVolumetricLighting = reinterpret_cast(REL::RelocationID(527940, 414913).address()); gVolumetricLightingSizeLow = reinterpret_cast(REL::RelocationID(527970, 414916).address()); gVolumetricLightingSizeMedium = reinterpret_cast(REL::RelocationID(527973, 414919).address()); @@ -231,17 +206,11 @@ void VolumetricLighting::EarlyPrepass() void VolumetricLighting::SetupVL() { if (inInterior) { - if (globals::game::isVR) - SetBooleanSettings(hiddenVRSettings, GetName(), settings.InteriorEnabled && inInteriorWithSun); - else - *bEnableVolumetricLighting = settings.InteriorEnabled && inInteriorWithSun; + *bEnableVolumetricLighting = settings.InteriorEnabled && inInteriorWithSun; *gVolumetricLightingSizeHigh = static_cast(settings.InteriorQuality) == Quality::Custom ? settings.InteriorCustomSize : defaultSizeHigh; SetVLQuality(GetVLDescriptor(), settings.InteriorQuality); } else { - if (globals::game::isVR) - SetBooleanSettings(hiddenVRSettings, GetName(), settings.ExteriorEnabled); - else - *bEnableVolumetricLighting = settings.ExteriorEnabled; + *bEnableVolumetricLighting = settings.ExteriorEnabled; *gVolumetricLightingSizeHigh = static_cast(settings.ExteriorQuality) == Quality::Custom ? settings.ExteriorCustomSize : defaultSizeHigh; SetVLQuality(GetVLDescriptor(), settings.ExteriorQuality); } @@ -261,20 +230,6 @@ void VolumetricLighting::SetVLQuality(VolumetricLightingDescriptor& descriptor, func(descriptor, std::clamp(quality, 0, 2)); } -void VolumetricLighting::RenderVolumetricLighting(VolumetricLightingDescriptor* descriptor, RE::NiCamera* camera, bool flag) -{ - using func_t = decltype(&VolumetricLighting::RenderVolumetricLighting); - static REL::Relocation func{ REL::RelocationID(100306, 0) }; - func(descriptor, camera, flag); -} - -void VolumetricLighting::RenderDepth::thunk() -{ - func(); - if (globals::features::volumetricLighting.bEnableVolumetricLighting) - RenderVolumetricLighting(&GetVLDescriptor(), RE::Main::WorldRootCamera(), false); -} - RE::BSImagespaceShader* VolumetricLighting::CreateShader(const std::string_view& name, const std::string_view& fileName, RE::BSComputeShader* computeShader) { auto shader = RE::BSImagespaceShader::Create(); @@ -331,21 +286,4 @@ void VolumetricLighting::SetGroupCountsVCS(uint32_t& threadGroupCountY) const threadGroupCountY = (vlData.screenY + BlurThreadGroupSizeY - BlurWindow * 2u - 1u) / (BlurThreadGroupSizeY - BlurWindow * 2u); } -void VolumetricLighting::CopyResource::thunk(ID3D11DeviceContext* a_this, ID3D11Resource* a_renderTarget, ID3D11Resource* a_renderTargetSource) -{ - // In VR with dynamic resolution enabled, there's a bug with the depth stencil. - // The depth stencil passed to IsFullScreenVR is scaled down incorrectly. - // The fix is to stop a CopyResource from replacing kMAIN_COPY with kMAIN after - // ISApplyVolumetricLighting because it clobbers a properly scaled kMAIN_COPY. - // The kMAIN_COPY does not appear to be used in the remaining frame after - // ISApplyVolumetricLighting except for IsFullScreenVR. - // But, the copy might have to be done manually later after IsFullScreenVR if - // used in the next frame. - - auto& singleton = globals::features::volumetricLighting; - if (!(Util::IsDynamicResolution() && singleton.bEnableVolumetricLighting)) { - a_this->CopyResource(a_renderTarget, a_renderTargetSource); - } -} - #undef I18N_KEY_PREFIX diff --git a/src/Features/VolumetricLighting.h b/src/Features/VolumetricLighting.h index a6bcf21c95..2b27656bbd 100644 --- a/src/Features/VolumetricLighting.h +++ b/src/Features/VolumetricLighting.h @@ -22,8 +22,6 @@ struct VolumetricLighting : Feature Settings settings; - bool enabledAtBoot = false; - virtual inline std::string GetName() override { return "Volumetric Lighting"; } virtual std::string GetDisplayName() override { return T("feature.volumetric_lighting.name", "Volumetric Lighting"); } virtual inline std::string GetShortName() override { return "VolumetricLighting"; } @@ -48,24 +46,6 @@ struct VolumetricLighting : Feature virtual void SetupResources() override; virtual void EarlyPrepass() override; - std::map hiddenVRSettings{ - { "bEnableVolumetricLighting:Display", { "Enable VL Shaders (INI) ", - "Enables volumetric lighting effects by creating shaders. " - "Needed at startup. ", - 0x1ed63d8, true, false, true } }, - { "bVolumetricLightingEnable:Display", { "Enable VL (INI))", "Enables volumetric lighting. ", 0x3485360, true, false, true } }, - { "bVolumetricLightingUpdateWeather:Display", { "Enable Volumetric Lighting (Weather) (INI) ", - "Enables volumetric lighting for weather. " - "Only used during startup and used to set bVLWeatherUpdate.", - 0x3485361, true, false, true } }, - { "bVLWeatherUpdate", { "Enable VL (Weather)", "Enables volumetric lighting for weather.", 0x3485363, true, false, true } }, - { "bVolumetricLightingEnabled_143232EF0", { "Enable VL (Papyrus) ", - "Enables volumetric lighting. " - "This is the Papyrus command. ", - REL::Relocate(0x3232ef0, 0, 0x3485362), true, false, true } }, - }; - - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; static RE::BSImagespaceShader* CreateShader(const std::string_view& name, const std::string_view& fileName, RE::BSComputeShader* computeShader); @@ -77,20 +57,6 @@ struct VolumetricLighting : Feature void SetGroupCountsHCS(uint32_t& threadGroupCountX) const; void SetGroupCountsVCS(uint32_t& threadGroupCountY) const; - // hooks - - struct CopyResource - { - static void thunk(ID3D11DeviceContext* a_this, ID3D11Resource* a_renderTarget, ID3D11Resource* a_renderTargetSource); - static inline REL::Relocation func; - }; - - struct RenderDepth - { - static void thunk(); - static inline REL::Relocation func; - }; - private: struct VolumetricLightingDescriptor {}; @@ -98,8 +64,6 @@ struct VolumetricLighting : Feature static const char* FromUnits(int32_t value, int32_t unitScale); static VolumetricLightingDescriptor& GetVLDescriptor(); static void SetVLQuality(VolumetricLightingDescriptor& descriptor, std::uint32_t quality); - static void RenderVolumetricLighting(VolumetricLightingDescriptor* descriptor, RE::NiCamera* camera, bool flag); - void DrawVolumetricLightingSettings(int32_t& quality, TextureSize& customSize, bool isInterior, bool inLocationType); TextureSize& FetchCurrentSizeInUnits(bool interior); void SetupVL(); diff --git a/src/Features/VolumetricShadows.h b/src/Features/VolumetricShadows.h index e7d5a385eb..0830395070 100644 --- a/src/Features/VolumetricShadows.h +++ b/src/Features/VolumetricShadows.h @@ -64,7 +64,6 @@ struct VolumetricShadows : Feature virtual void SaveSettings(json& o_json) override; virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; } virtual void PostPostLoad() override; diff --git a/src/Features/WaterEffects.h b/src/Features/WaterEffects.h index 87a79d1f36..e64a04ea30 100644 --- a/src/Features/WaterEffects.h +++ b/src/Features/WaterEffects.h @@ -28,6 +28,5 @@ struct WaterEffects : Feature virtual void Prepass() override; - virtual bool SupportsVR() override { return true; }; virtual bool IsCore() const override { return true; }; }; diff --git a/src/Features/WetnessEffects.h b/src/Features/WetnessEffects.h index ff4c28d4d2..f7b31e4a96 100644 --- a/src/Features/WetnessEffects.h +++ b/src/Features/WetnessEffects.h @@ -118,7 +118,6 @@ struct WetnessEffects : Feature virtual void RestoreDefaultSettings() override; - virtual bool SupportsVR() override { return true; }; // Override to provide weather analysis configuration virtual WeatherAnalysisConfig GetWeatherAnalysisConfig() const override diff --git a/src/FrameAnnotations.cpp b/src/FrameAnnotations.cpp index 14fafd6e98..49116a4170 100644 --- a/src/FrameAnnotations.cpp +++ b/src/FrameAnnotations.cpp @@ -16,8 +16,7 @@ namespace FrameAnnotations if (globals::state && globals::state->IsDeveloperMode()) { uint16_t packed = static_cast(EffectType); uint16_t se = RE::ImageSpaceManager::GetSEIndex(EffectType); - uint16_t vr = RE::ImageSpaceManager::GetVRIndex(EffectType); - std::string packedString = std::format(" (packed: 0x{:X}, SE: {}, VR: {})", packed, se, vr); + std::string packedString = std::format(" (packed: 0x{:X}, SE: {})", packed, se); return enumName + packedString; } else { return enumName; @@ -220,39 +219,6 @@ namespace FrameAnnotations static inline REL::Relocation func; }; - struct VR_RenderDepth_DownscaleDepthBuffer - { - static void thunk(RE::BSSceneGraph* a1) - { - globals::state->BeginPerfEvent("DownscaleDepthBuffer"); - func(a1); - globals::state->EndPerfEvent(); - }; - static inline REL::Relocation func; - }; - - struct VR_RenderDepth_BSOBBOcclusionTestingShader - { - static void thunk(RE::BSImagespaceShader* a_this, RE::ImageSpaceEffectParam* a_param) - { - globals::state->BeginPerfEvent("BSOBBOcclusionTestingShader"); - func(a_this, a_param); - globals::state->EndPerfEvent(); - }; - static inline REL::Relocation func; - }; - - struct VR_UpscaleDepthBuffer - { - static void thunk(RE::ImageSpaceManager* a_this, unsigned int a2, RE::RENDER_TARGET a_target, RE::RENDER_TARGET a_target2, __int64 a5, bool a6) - { - globals::state->BeginPerfEvent("UpscaleDepthBuffer"); - func(a_this, a2, a_target, a_target2, a5, a6); - globals::state->EndPerfEvent(); - }; - static inline REL::Relocation func; - }; - struct Main_RenderWorld { static void thunk(bool a1) @@ -958,74 +924,6 @@ namespace FrameAnnotations RE::VTABLE_BSImagespaceShaderISUnderwaterMask[0]); stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( RE::VTABLE_BSImagespaceShaderWaterFlow[0]); - // VR-only shaders - if (globals::game::isVR) { - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderCopyDepthBuffer[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderCopyDepthBuffer_DR[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderDepthBuffer4xDownscale[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderISDownsampleHierarchicalDepthBufferCS[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderISDiffScaleDownsampleDepthBufferCS[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderISFullScreenVR[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderTransformLvl7PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl6PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl5PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl4PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl3PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl2PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl1PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderLvl0PreTest[3]); - stl::write_vfunc<0x1, BSImagespaceShader_Render>( - RE::VTABLE_BSImagespaceShaderSetupPreTest[3]); - - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderCopyDepthBuffer[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderCopyDepthBuffer_DR[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderDepthBuffer4xDownscale[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderISDownsampleHierarchicalDepthBufferCS[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderISDiffScaleDownsampleDepthBufferCS[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderISFullScreenVR[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderTransformLvl7PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl6PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl5PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl4PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl3PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl2PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl1PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderLvl0PreTest[0]); - stl::write_vfunc<0xC, BSImagespaceShader_Dispatch>( - RE::VTABLE_BSImagespaceShaderSetupPreTest[0]); - stl::write_thunk_call(REL::RelocationID(100421, 107139).address() + REL::Relocate(0x37f, 0)); - stl::write_thunk_call(REL::RelocationID(100421, 107139).address() + REL::Relocate(0x3b1, 0)); - stl::write_thunk_call(REL::Offset(0x13246AE).address()); - } - stl::write_vfunc<0x2A, BSShaderAccumulator_FinishAccumulatingDispatch>( RE::VTABLE_BSShaderAccumulator[0]); diff --git a/src/Globals.cpp b/src/Globals.cpp index 15cba11777..7a6ef3ff5f 100644 --- a/src/Globals.cpp +++ b/src/Globals.cpp @@ -31,7 +31,6 @@ #include "Features/TerrainVariation.h" #include "Features/UnifiedWater.h" #include "Features/Upscaling.h" -#include "Features/VR.h" #include "Features/VolumetricLighting.h" #include "Features/VolumetricShadows.h" #include "Features/WaterEffects.h" @@ -78,7 +77,6 @@ namespace globals TerrainShadows terrainShadows{}; UnifiedWater unifiedWater{}; VolumetricLighting volumetricLighting{}; - VR vr{}; WaterEffects waterEffects{}; PerformanceOverlay performanceOverlay{}; WetnessEffects wetnessEffects{}; @@ -104,7 +102,6 @@ namespace globals RE::BSGraphics::Renderer* renderer = nullptr; RE::BSShaderManager::State* smState = nullptr; RE::TES* tes = nullptr; - bool isVR = false; RE::MemoryManager* memoryManager = nullptr; RE::INISettingCollection* iniSettingCollection = nullptr; RE::INIPrefSettingCollection* iniPrefSettingCollection = nullptr; @@ -177,7 +174,6 @@ namespace globals graphicsState = RE::BSGraphics::State::GetSingleton(); renderer = RE::BSGraphics::Renderer::GetSingleton(); smState = &RE::BSShaderManager::State::GetSingleton(); - isVR = REL::Module::IsVR(); iniSettingCollection = RE::INISettingCollection::GetSingleton(); iniPrefSettingCollection = RE::INIPrefSettingCollection::GetSingleton(); gameSettingCollection = RE::GameSettingCollection::GetSingleton(); @@ -243,13 +239,8 @@ namespace globals void CacheFramebuffer() { using namespace game; - if (REL::Module::IsVR()) { - auto frameBufferVR = (FrameBufferVR*)mappedFrameBuffer->pData; - frameBufferCached.vr = *frameBufferVR; - } else { - auto frameBuffer = (FrameBuffer*)mappedFrameBuffer->pData; - frameBufferCached.nonVR = *frameBuffer; - } + auto frameBuffer = (FrameBuffer*)mappedFrameBuffer->pData; + frameBufferCached.data = *frameBuffer; mappedFrameBuffer = nullptr; } @@ -291,118 +282,9 @@ namespace globals static inline REL::Relocation func; }; - /** - * @brief Hooked OMSetRenderTargets — injects POM offset UAV at slot 7 when in the deferred pass. - * - * vtable index 33 for ID3D11DeviceContext::OMSetRenderTargets. - * After Skyrim binds the deferred MRT (clearing all UAVs), this hook re-adds the POM offset - * UAV at slot u7 so the Lighting PS (VR_STEREO_OPT permutation) can write per-pixel parallax - * depth offsets without overloading Reflectance.w. - */ - struct ID3D11DeviceContext_OMSetRenderTargets - { - static void STDMETHODCALLTYPE thunk(ID3D11DeviceContext* This, UINT NumViews, ID3D11RenderTargetView* const* ppRenderTargetViews, ID3D11DepthStencilView* pDepthStencilView) - { - func(This, NumViews, ppRenderTargetViews, pDepthStencilView); - - // D3D11 handles any SRV/UAV conflict automatically (silently unbinds the UAV when - // the same resource is later bound as an SRV), so no NumViews guard is needed. - if (globals::deferred->deferredPass) { - auto& stereoOpt = globals::features::vr.stereoOpt; - if (stereoOpt.loaded) { - if (auto* uav = stereoOpt.GetPomOffsetUAV()) { - This->OMSetRenderTargetsAndUnorderedAccessViews( - D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, nullptr, nullptr, - 7, 1, &uav, nullptr); - } - } - } - } - static inline REL::Relocation func; - }; - - /** - * @brief Hooked OMSetDepthStencilState — replaces DSS with stencil-enforcing version when VR stereo opt is active. - * - * vtable index 36 for ID3D11DeviceContext::OMSetDepthStencilState. - * When VRStereoOptimizations has written stencil marks, this hook transparently swaps - * the game's DSS for a modified version that adds a stencil NOT_EQUAL test, causing - * marked Eye 1 pixels to be skipped during normal rendering. - */ - struct ID3D11DeviceContext_OMSetDepthStencilState - { - static void thunk(ID3D11DeviceContext* This, ID3D11DepthStencilState* pDepthStencilState, UINT StencilRef) - { - if (globals::game::isVR) { - auto& stereoOpt = globals::features::vr.stereoOpt; - if (stereoOpt.loaded && stereoOpt.IsStencilActive()) { - pDepthStencilState = stereoOpt.GetOrCreateModifiedDSS(pDepthStencilState); - stereoOpt.NoteStencilSwap(); - StencilRef = 1; // Must match the ref written by our stencil pass - } - } - func(This, pDepthStencilState, StencilRef); - } - static inline REL::Relocation func; - }; - - /** - * @brief Hooked ClearDepthStencilView — blocks stencil clears when VR stereo opt stencil is active. - * - * vtable index 53 for ID3D11DeviceContext::ClearDepthStencilView. - * Prevents the game from clearing our stencil marks between the stencil write and - * the stereo overwrite blend pass by stripping the D3D11_CLEAR_STENCIL flag. - */ - struct ID3D11DeviceContext_ClearDepthStencilView - { - static void thunk(ID3D11DeviceContext* This, ID3D11DepthStencilView* pDepthStencilView, UINT ClearFlags, FLOAT Depth, UINT8 Stencil) - { - if (globals::game::isVR) { - auto& stereoOpt = globals::features::vr.stereoOpt; - if (stereoOpt.loaded && stereoOpt.IsStencilActive()) { - // Only protect the main scene DSV — allow other DSVs to clear normally - auto renderer = globals::game::renderer; - auto& mainDepth = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - if (mainDepth.views[0]) { - // Compare the DSV being cleared against the main scene DSV - ID3D11Resource* clearRes = nullptr; - ID3D11Resource* mainRes = nullptr; - pDepthStencilView->GetResource(&clearRes); - mainDepth.views[0]->GetResource(&mainRes); - bool isMainDSV = (clearRes == mainRes); - if (clearRes) - clearRes->Release(); - if (mainRes) - mainRes->Release(); - if (isMainDSV) { - ClearFlags &= ~D3D11_CLEAR_STENCIL; - if (ClearFlags == 0) - return; - } - } - } - } - func(This, pDepthStencilView, ClearFlags, Depth, Stencil); - } - static inline REL::Relocation func; - }; - - /** - * @brief Installs hooks on the Map and Unmap methods of the provided D3D11 device context. - * - * This enables interception of resource mapping and unmapping operations for frame buffer caching. - */ void InstallD3DHooks(ID3D11DeviceContext* a_context) { stl::detour_vfunc<14, ID3D11DeviceContext_Map>(a_context); stl::detour_vfunc<15, ID3D11DeviceContext_Unmap>(a_context); - - // VR stereo optimization hooks: installed only when stereo reprojection is enabled at startup. - // Changing stereoMode at runtime requires a restart; the UI communicates this to the user. - if (globals::game::isVR && globals::features::vr.stereoOpt.settings.stereoMode != VRStereoOptimizations::StereoMode::Off) { - stl::detour_vfunc<33, ID3D11DeviceContext_OMSetRenderTargets>(a_context); - stl::detour_vfunc<36, ID3D11DeviceContext_OMSetDepthStencilState>(a_context); - stl::detour_vfunc<53, ID3D11DeviceContext_ClearDepthStencilView>(a_context); - } } } diff --git a/src/Globals.h b/src/Globals.h index 9fd5bb081c..7376389bde 100644 --- a/src/Globals.h +++ b/src/Globals.h @@ -26,7 +26,6 @@ struct TerrainHelper; struct TerrainShadows; struct UnifiedWater; struct VolumetricLighting; -struct VR; struct WaterEffects; struct PerformanceOverlay; struct WetnessEffects; @@ -86,7 +85,6 @@ namespace globals extern TerrainShadows terrainShadows; extern UnifiedWater unifiedWater; extern VolumetricLighting volumetricLighting; - extern VR vr; extern WaterEffects waterEffects; extern PerformanceOverlay performanceOverlay; extern WetnessEffects wetnessEffects; @@ -124,92 +122,25 @@ namespace globals float4 DynamicResolutionParams2; }; - struct FrameBufferVR + struct FrameBufferCache { - // Must match HLSL VR layout exactly - packoffsets c0 to c86 - Matrix CameraView[2]; // packoffset(c0) - 8 registers - Matrix CameraProj[2]; // packoffset(c8) - 8 registers - Matrix CameraViewProj[2]; // packoffset(c16) - 8 registers - Matrix CameraViewProjUnjittered[2]; // packoffset(c24) - 8 registers - Matrix CameraPreviousViewProjUnjittered[2]; // packoffset(c32) - 8 registers - Matrix CameraProjUnjittered[2]; // packoffset(c40) - 8 registers - Matrix CameraProjUnjitteredInverse[2]; // packoffset(c48) - 8 registers - Matrix CameraViewInverse[2]; // packoffset(c56) - 8 registers - Matrix CameraViewProjInverse[2]; // packoffset(c64) - 8 registers - Matrix CameraProjInverse[2]; // packoffset(c72) - 8 registers - float4 CameraPosAdjust[2]; // packoffset(c80) - 2 registers - float4 CameraPreviousPosAdjust[2]; // packoffset(c82) - 2 registers - float4 FrameParams; // packoffset(c84) - 1 register - float4 DynamicResolutionParams1; // packoffset(c85) - 1 register - float4 DynamicResolutionParams2; // packoffset(c86) - 1 register - }; - - union FrameBufferCache - { - FrameBuffer nonVR; - FrameBufferVR vr; - - // Helper functions for VR-agnostic access to eye 0 (or single eye) - const Matrix& GetCameraView(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraView[eyeIndex] : nonVR.CameraView; - } - const Matrix& GetCameraProj(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraProj[eyeIndex] : nonVR.CameraProj; - } - const Matrix& GetCameraViewProj(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraViewProj[eyeIndex] : nonVR.CameraViewProj; - } - const Matrix& GetCameraViewProjUnjittered(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraViewProjUnjittered[eyeIndex] : nonVR.CameraViewProjUnjittered; - } - const Matrix& GetCameraPreviousViewProjUnjittered(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraPreviousViewProjUnjittered[eyeIndex] : nonVR.CameraPreviousViewProjUnjittered; - } - const Matrix& GetCameraProjUnjittered(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraProjUnjittered[eyeIndex] : nonVR.CameraProjUnjittered; - } - const Matrix& GetCameraProjUnjitteredInverse(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraProjUnjitteredInverse[eyeIndex] : nonVR.CameraProjUnjitteredInverse; - } - const Matrix& GetCameraViewInverse(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraViewInverse[eyeIndex] : nonVR.CameraViewInverse; - } - const Matrix& GetCameraViewProjInverse(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraViewProjInverse[eyeIndex] : nonVR.CameraViewProjInverse; - } - const Matrix& GetCameraProjInverse(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraProjInverse[eyeIndex] : nonVR.CameraProjInverse; - } - const float4& GetCameraPosAdjust(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraPosAdjust[eyeIndex] : nonVR.CameraPosAdjust; - } - const float4& GetCameraPreviousPosAdjust(uint32_t eyeIndex = 0) const - { - return REL::Module::IsVR() ? vr.CameraPreviousPosAdjust[eyeIndex] : nonVR.CameraPreviousPosAdjust; - } - const float4& GetFrameParams() const - { - return REL::Module::IsVR() ? vr.FrameParams : nonVR.FrameParams; - } - const float4& GetDynamicResolutionParams1() const - { - return REL::Module::IsVR() ? vr.DynamicResolutionParams1 : nonVR.DynamicResolutionParams1; - } - const float4& GetDynamicResolutionParams2() const - { - return REL::Module::IsVR() ? vr.DynamicResolutionParams2 : nonVR.DynamicResolutionParams2; - } + FrameBuffer data; + + const Matrix& GetCameraView() const { return data.CameraView; } + const Matrix& GetCameraProj() const { return data.CameraProj; } + const Matrix& GetCameraViewProj() const { return data.CameraViewProj; } + const Matrix& GetCameraViewProjUnjittered() const { return data.CameraViewProjUnjittered; } + const Matrix& GetCameraPreviousViewProjUnjittered() const { return data.CameraPreviousViewProjUnjittered; } + const Matrix& GetCameraProjUnjittered() const { return data.CameraProjUnjittered; } + const Matrix& GetCameraProjUnjitteredInverse() const { return data.CameraProjUnjitteredInverse; } + const Matrix& GetCameraViewInverse() const { return data.CameraViewInverse; } + const Matrix& GetCameraViewProjInverse() const { return data.CameraViewProjInverse; } + const Matrix& GetCameraProjInverse() const { return data.CameraProjInverse; } + const float4& GetCameraPosAdjust() const { return data.CameraPosAdjust; } + const float4& GetCameraPreviousPosAdjust() const { return data.CameraPreviousPosAdjust; } + const float4& GetFrameParams() const { return data.FrameParams; } + const float4& GetDynamicResolutionParams1() const { return data.DynamicResolutionParams1; } + const float4& GetDynamicResolutionParams2() const { return data.DynamicResolutionParams2; } }; namespace game @@ -219,7 +150,6 @@ namespace globals extern RE::BSGraphics::Renderer* renderer; extern RE::BSShaderManager::State* smState; extern RE::TES* tes; - extern bool isVR; extern RE::MemoryManager* memoryManager; extern RE::INISettingCollection* iniSettingCollection; extern RE::INIPrefSettingCollection* iniPrefSettingCollection; diff --git a/src/Hooks.cpp b/src/Hooks.cpp index b11a89eca7..f8b9de8a6c 100644 --- a/src/Hooks.cpp +++ b/src/Hooks.cpp @@ -17,7 +17,6 @@ #include "Features/Skin.h" #include "Features/SkySync.h" #include "Features/Upscaling.h" -#include "Features/VR.h" #include "Features/VolumetricLighting.h" #include "ShaderTools/BSShaderHooks.h" @@ -420,33 +419,8 @@ struct BSInputDeviceManager_PollInputDevices if (*a_events) { if (auto device = (*a_events)->GetDevice()) { - if (globals::game::isVR) { - // In VR, block mouse/keyboard input when menu is open (like Flatrim) - // Allow gamepad input to pass through - // Also handle VR controller devices based on OpenVR compatibility - bool isVRController = ((device == RE::INPUT_DEVICES::INPUT_DEVICE::kVivePrimary) || - (device == RE::INPUT_DEVICES::INPUT_DEVICE::kViveSecondary) || - (device == RE::INPUT_DEVICES::INPUT_DEVICE::kOculusPrimary) || - (device == RE::INPUT_DEVICES::INPUT_DEVICE::kOculusSecondary) || - (device == RE::INPUT_DEVICES::INPUT_DEVICE::kWMRPrimary) || - (device == RE::INPUT_DEVICES::INPUT_DEVICE::kWMRSecondary)); - - // Allow gamepad input to pass through always - if (device == RE::INPUT_DEVICES::INPUT_DEVICE::kGamepad) { - blockedDevice = false; - } - // For VR controllers, only block if OpenVR is compatible - else if (isVRController) { - blockedDevice = globals::features::vr.IsOpenVRCompatible(); - } - // For mouse/keyboard and other devices, block them (like Flatrim) - else { - blockedDevice = true; - } - } else { // Block all devices except gamepad when menu is open blockedDevice = (device != RE::INPUT_DEVICES::INPUT_DEVICE::kGamepad); - } } } } @@ -880,10 +854,8 @@ namespace Hooks */ void Install() { - if (!REL::Module::IsVR()) { - logger::info("Hooking BSImageSpace::Init::IBLF"); - stl::detour_thunk(REL::RelocationID(100480, 107198)); - } + logger::info("Hooking BSImageSpace::Init::IBLF"); + stl::detour_thunk(REL::RelocationID(100480, 107198)); // This input hook also drives per-frame Reflex update (see BSInputDeviceManager_PollInputDevices::thunk). logger::info("Hooking BSInputDeviceManager::PollInputDevices"); @@ -961,9 +933,6 @@ namespace Hooks if (REL::Module::IsAE()) { std::uint8_t patch[] = { 0x41, 0x83, 0xE7, 0x00 }; // and r15d, 0 REL::safe_write(setupGeometryUpdateRenderSpace + 0x71, patch, sizeof(patch)); - } else if (REL::Module::IsVR()) { - std::uint8_t patch[] = { 0x41, 0x83, 0xE4, 0x00 }; // and r12d, 0 - REL::safe_write(setupGeometryUpdateRenderSpace + 0x65, patch, sizeof(patch)); } else { std::uint8_t patch1[] = { 0xB8, 0x00, 0x00 }; // mov eax, 0 REL::safe_write(setupGeometryUpdateRenderSpace + 0x73, patch1, sizeof(patch1)); @@ -987,6 +956,6 @@ namespace Hooks } logger::info("Hooking CreateDXGIFactory"); - *(uintptr_t*)&ptrCreateDXGIFactory = SKSE::PatchIAT(hk_CreateDXGIFactory, "dxgi.dll", !REL::Module::IsVR() ? "CreateDXGIFactory" : "CreateDXGIFactory1"); + *(uintptr_t*)&ptrCreateDXGIFactory = SKSE::PatchIAT(hk_CreateDXGIFactory, "dxgi.dll", "CreateDXGIFactory"); } } diff --git a/src/Menu.cpp b/src/Menu.cpp index 719c90f0a3..284c459d97 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -47,7 +47,6 @@ #include "Features/PerformanceOverlay/ABTesting/ABTestAggregator.h" #include "Features/PerformanceOverlay/ABTesting/ABTesting.h" #include "Features/ScreenshotFeature.h" -#include "Features/VR.h" NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( Menu::ThemeSettings::PaletteColors, @@ -936,7 +935,7 @@ void Menu::DrawFooter() * callbacks for input processing, settings rendering, and key mapping. This method * serves as the bridge between Menu's state and the extracted overlay rendering logic. * - * Handles VR setup, input event processing, shader compilation status, feature overlays, + * Handles input event processing, shader compilation status, feature overlays, * A/B testing, and ImGui frame management through the specialized renderer component. */ void Menu::DrawOverlay() @@ -992,11 +991,10 @@ void Menu::DrawOverlay() } /** - * @brief Processes queued input events for both VR and non-VR devices + * @brief Processes queued input events * - * This method handles the complex logic of routing input events to appropriate handlers: - * - VR controller events are forwarded to the VR system for specialized processing - * - Non-VR events (keyboard, mouse) are processed directly for ImGui integration + * This method handles the logic of routing input events to appropriate handlers: + * - Keyboard and mouse events are processed directly for ImGui integration * - Includes key state normalization and stuck key detection/correction * * The method maintains thread safety through mutex protection of the input event queue. @@ -1029,28 +1027,7 @@ void Menu::ProcessInputEventQueue() { std::unique_lock mutex(_inputEventMutex); ImGuiIO& io = ImGui::GetIO(); - // Split the queue into VR and non-VR events - std::vector vrEvents; - std::vector nonVREvents; for (auto& event : _keyEventQueue) { - bool isVRController = ((event.device == RE::INPUT_DEVICE::kVivePrimary || event.device == RE::INPUT_DEVICE::kViveSecondary || - event.device == RE::INPUT_DEVICE::kOculusPrimary || event.device == RE::INPUT_DEVICE::kOculusSecondary || - event.device == RE::INPUT_DEVICE::kWMRPrimary || event.device == RE::INPUT_DEVICE::kWMRSecondary)); - - if (globals::features::vr.IsOpenVRCompatible() && isVRController) { - vrEvents.push_back(event); - } else { - nonVREvents.push_back(event); - } - } - // Process VR events in VR - if (!vrEvents.empty()) { - globals::features::vr.ProcessVREvents(vrEvents); - globals::features::vr.UpdateOverlayMenuStateFromInput(); - } - - // Process non-VR events in Menu - for (auto& event : nonVREvents) { if (event.eventType == RE::INPUT_EVENT_TYPE::kChar) { io.AddInputCharacter(event.keyCode); continue; diff --git a/src/Menu.h b/src/Menu.h index 61079df656..e7b39fe566 100644 --- a/src/Menu.h +++ b/src/Menu.h @@ -238,7 +238,7 @@ class Menu float FontSize = ThemeManager::Constants::DEFAULT_FONT_SIZE; std::string FontName = "Jost/Jost-Regular.ttf"; // Default font file name (legacy) - float GlobalScale = REL::Module::IsVR() ? -0.5f : 0.f; // exponential + float GlobalScale = 0.f; // exponential std::array(FontRole::Count)> FontRoles = []() { std::array(FontRole::Count)> roles{}; auto setRole = [&roles](FontRole role, std::string family, std::string style, std::string file, float sizeScale) { @@ -499,8 +499,6 @@ class Menu [[nodiscard]] constexpr bool IsHeld() const noexcept { return IsPressed() && IsRepeating(); } [[nodiscard]] constexpr bool IsUp() const noexcept { return (value == 0.0F) && IsRepeating(); } }; - // VR overlay input and cursor helpers - void ProcessVROverlayInput(); private: Settings settings; diff --git a/src/Menu/HomePageRenderer.cpp b/src/Menu/HomePageRenderer.cpp index 5547f56756..b7875751d4 100644 --- a/src/Menu/HomePageRenderer.cpp +++ b/src/Menu/HomePageRenderer.cpp @@ -574,11 +574,6 @@ void HomePageRenderer::RenderFirstTimeSetupDialog() bool HomePageRenderer::ShouldShowFirstTimeSetup() { - // Never show first-time setup in VR mode - if (REL::Module::IsVR()) { - return false; - } - // Check if already completed this session if (isFirstTimeSetupShown) { return false; diff --git a/src/Menu/OverlayRenderer.cpp b/src/Menu/OverlayRenderer.cpp index 58471ac9ef..4a1ee491e4 100644 --- a/src/Menu/OverlayRenderer.cpp +++ b/src/Menu/OverlayRenderer.cpp @@ -24,8 +24,6 @@ #include "Features/PerformanceOverlay.h" #include "Features/PerformanceOverlay/ABTesting/ABTesting.h" -#include "Features/VR.h" - namespace { std::unordered_map s_windowOverlapAlpha; @@ -133,13 +131,8 @@ void OverlayRenderer::RenderOverlay( float& cachedFontSize, float currentFontSize) { - HandleVRSetup(); processInputEventQueue(); - if (globals::features::vr.IsOpenVRCompatible()) { - globals::features::vr.ProcessControllerInputForImGui(); - } - if (ShouldSkipRendering()) { auto& io = ImGui::GetIO(); io.ClearInputKeys(); @@ -184,13 +177,6 @@ void OverlayRenderer::RenderOverlay( FinalizeImGuiFrame(); } -void OverlayRenderer::HandleVRSetup() -{ - if (globals::features::vr.IsOpenVRCompatible()) { - globals::features::vr.RecreateOverlayTexturesIfNeeded(); - } -} - bool OverlayRenderer::ShouldSkipRendering() { auto shaderCache = globals::shaderCache; @@ -391,9 +377,6 @@ void OverlayRenderer::FinalizeImGuiFrame() ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - if (globals::features::vr.IsOpenVRCompatible()) { - globals::features::vr.SubmitOverlayFrame(); - } } void OverlayRenderer::RenderFirstTimeSetupOverlay() diff --git a/src/Menu/OverlayRenderer.h b/src/Menu/OverlayRenderer.h index d78e908319..b9b9dc6720 100644 --- a/src/Menu/OverlayRenderer.h +++ b/src/Menu/OverlayRenderer.h @@ -10,7 +10,7 @@ class Menu; * @brief Specialized renderer component for overlay and frame management * * This class was extracted from Menu.cpp to handle all overlay-related rendering - * responsibilities including VR setup, shader compilation status, feature overlays, + * responsibilities including shader compilation status, feature overlays, * A/B testing, and ImGui frame lifecycle management. * * The renderer uses a callback-based architecture to maintain separation of concerns @@ -25,7 +25,7 @@ class OverlayRenderer /** * @brief Main overlay rendering entry point * - * Coordinates all overlay rendering activities including VR setup, input processing, + * Coordinates all overlay rendering activities including input processing, * shader compilation status display, feature overlays, A/B testing, and ImGui frame * management. Uses callback functions to access Menu functionality while maintaining * architectural separation. @@ -46,7 +46,6 @@ class OverlayRenderer float currentFontSize); private: - static void HandleVRSetup(); static bool ShouldSkipRendering(); static void HandleFontReload(Menu& menu, float& cachedFontSize, float currentFontSize); static void InitializeImGuiFrame(Menu& menu); diff --git a/src/Menu/SettingsTabRenderer.cpp b/src/Menu/SettingsTabRenderer.cpp index 804c7c6ea8..02e6c80882 100644 --- a/src/Menu/SettingsTabRenderer.cpp +++ b/src/Menu/SettingsTabRenderer.cpp @@ -7,7 +7,6 @@ #include "BackgroundBlur.h" #include "Features/ScreenshotFeature.h" -#include "Features/VR.h" #include "Fonts.h" #include "Globals.h" #include "I18n/I18n.h" diff --git a/src/Menu/ThemeManager.cpp b/src/Menu/ThemeManager.cpp index b43784f8c6..dea9cbdef1 100644 --- a/src/Menu/ThemeManager.cpp +++ b/src/Menu/ThemeManager.cpp @@ -28,8 +28,6 @@ #include "../Util.h" #include "../Utils/FileSystem.h" #include "../Utils/UI.h" -#include "Features/VR.h" - using namespace SKSE; namespace @@ -1020,11 +1018,8 @@ float ThemeManager::ResolveFontSize(const Menu& menu) // Compute dynamic size from screen resolution float dynamicSize; - if (globals::game::isVR) { - // VR: use overlay height - dynamicSize = VR::Config::kOverlayHeight * Constants::DEFAULT_FONT_RATIO; - } else if (globals::state && globals::state->screenSize.y > 0) { - // Non-VR: use current screen height + if (globals::state && globals::state->screenSize.y > 0) { + // Use current screen height dynamicSize = globals::state->screenSize.y * Constants::DEFAULT_FONT_RATIO; } else { // Fallback: use default font size diff --git a/src/ShaderCache.cpp b/src/ShaderCache.cpp index 38bd325651..2ee5f53f4b 100644 --- a/src/ShaderCache.cpp +++ b/src/ShaderCache.cpp @@ -762,12 +762,12 @@ namespace SIE { "SplitDistance", lightingPSConstants.SplitDistance }, { "SSRParams", lightingPSConstants.SSRParams }, { "WorldMapOverlayParametersPS", lightingPSConstants.WorldMapOverlayParametersPS }, - { "ShadowSampleParam", lightingPSConstants.ShadowSampleParam }, // VR only - { "EndSplitDistances", lightingPSConstants.EndSplitDistances }, // VR only - { "StartSplitDistances", lightingPSConstants.StartSplitDistances }, // VR only - { "DephBiasParam", lightingPSConstants.DephBiasParam }, // VR only - { "ShadowLightParam", lightingPSConstants.ShadowLightParam }, // VR only - { "ShadowMapProj", lightingPSConstants.ShadowMapProj }, // VR only + { "ShadowSampleParam", lightingPSConstants.ShadowSampleParam }, + { "EndSplitDistances", lightingPSConstants.EndSplitDistances }, + { "StartSplitDistances", lightingPSConstants.StartSplitDistances }, + { "DephBiasParam", lightingPSConstants.DephBiasParam }, + { "ShadowLightParam", lightingPSConstants.ShadowLightParam }, + { "ShadowMapProj", lightingPSConstants.ShadowMapProj }, { "AmbientColor", lightingPSConstants.AmbientColor }, { "FogColor", lightingPSConstants.FogColor }, { "ColourOutputClamp", lightingPSConstants.ColourOutputClamp }, @@ -786,8 +786,8 @@ namespace SIE { "LandscapeTexture5to6IsSpecPower", lightingPSConstants.LandscapeTexture5to6IsSpecPower }, { "SnowRimLightParameters", lightingPSConstants.SnowRimLightParameters }, { "CharacterLightParams", lightingPSConstants.CharacterLightParams }, - { "InvWorldMat", lightingPSConstants.InvWorldMat }, // VR only - { "PreviousWorldMat", lightingPSConstants.PreviousWorldMat }, // VR only + { "InvWorldMat", lightingPSConstants.InvWorldMat }, + { "PreviousWorldMat", lightingPSConstants.PreviousWorldMat }, { "PBRFlags", lightingPSConstants.PBRFlags }, { "PBRParams1", lightingPSConstants.PBRParams1 }, @@ -879,11 +879,7 @@ namespace SIE { "ScaleMask", 13 }, }; - if (REL::Module::IsVR()) { - grassVS.insert({ "Padding", 14 }); - } else { - grassVS.insert({ "ShadowClampValue", 14 }); - } + grassVS.insert({ "ShadowClampValue", 14 }); const auto& grassPSConstants = ShaderConstants::GrassPS::Get(); @@ -985,14 +981,12 @@ namespace SIE { "CellTexCoordOffset", 11 }, }; - if (!REL::Module::IsVR()) { - waterVS.insert( - { - { "SubTexOffset", 12 }, - { "PosAdjust", 13 }, - { "MatProj", 14 }, - }); - } + waterVS.insert( + { + { "SubTexOffset", 12 }, + { "PosAdjust", 13 }, + { "MatProj", 14 }, + }); auto& waterPS = result[static_cast(RE::BSShader::Type::Water)] [static_cast(ShaderClass::Pixel)]; @@ -1052,26 +1046,14 @@ namespace SIE { "ShadowLightParam", 8 }, }; - if (!REL::Module::IsVR()) { - utilityPS.insert( - { - { "ShadowFadeParam", 9 }, - { "VPOSOffset", 10 }, - { "EndSplitDistances", 11 }, - { "StartSplitDistances", 12 }, - { "FocusShadowFadeParam", 13 }, - }); - } else { - utilityPS.insert( - { - { "StereoClipRects", 9 }, // VR only - { "ShadowFadeParam", 10 }, - { "VPOSOffset", 11 }, - { "EndSplitDistances", 12 }, - { "StartSplitDistances", 13 }, - { "FocusShadowFadeParam", 14 }, - }); - } + utilityPS.insert( + { + { "ShadowFadeParam", 9 }, + { "VPOSOffset", 10 }, + { "EndSplitDistances", 11 }, + { "StartSplitDistances", 12 }, + { "FocusShadowFadeParam", 13 }, + }); return result; } @@ -1427,8 +1409,6 @@ namespace SIE defines[lastIndex++] = { "D3DCOMPILE_SKIP_OPTIMIZATION", nullptr }; defines[lastIndex++] = { "D3DCOMPILE_DEBUG", nullptr }; } - if (REL::Module::IsVR()) - defines[lastIndex++] = { "VR", nullptr }; auto shaderDefines = globals::state->GetDefines(); if (!shaderDefines->empty()) { for (unsigned int i = 0; i < shaderDefines->size(); i++) @@ -1792,16 +1772,9 @@ namespace SIE { "BSImagespaceShaderVolumetricLightingBlurHCS", RE::ImageSpaceManager::GetCurrentIndex(ISVolumetricLightingBlurHCS) }, { "BSImagespaceShaderVolumetricLightingBlurVCS", RE::ImageSpaceManager::GetCurrentIndex(ISVolumetricLightingBlurVCS) }, - // VR only shaders - // Disable BSImagespaceShaderCopyDepthBuffer since we don't have it REed and it causes issues with cache and upscaling - // https://github.com/doodlum/skyrim-community-shaders/issues/1552 - // { "BSImagespaceShaderCopyDepthBuffer", RE::ImageSpaceManager::GetCurrentIndex(ISCopyDepthBuffer) }, - // { "BSImagespaceShaderCopyDepthBuffer_DR", RE::ImageSpaceManager::GetCurrentIndex(ISCopyDepthBuffer_DR) }, - // { "BSImagespaceShaderCopyDepthBufferTargetSize", RE::ImageSpaceManager::GetCurrentIndex(ISCopyDepthBufferTargetSize) }, { "BSImagespaceShaderGraphicsTextureFilterMode", RE::ImageSpaceManager::GetCurrentIndex(ISGraphicsTextureFilterMode) }, { "BSImagespaceShaderISDownsampleHierarchicalDepthBufferCS", RE::ImageSpaceManager::GetCurrentIndex(ISDownsampleHierarchicalDepthBufferCS) }, { "BSImagespaceShaderISDiffScaleDownsampleDepthBufferCS", RE::ImageSpaceManager::GetCurrentIndex(ISDiffScaleDownsampleDepthBufferCS) }, - { "BSImagespaceShaderISFullScreenVR", RE::ImageSpaceManager::GetCurrentIndex(ISFullScreenVR) }, { "BSImagespaceShaderISTransformLvl7PreTest", RE::ImageSpaceManager::GetCurrentIndex(ISTransformLvl7PreTest) }, { "BSImagespaceShaderISLvl6PreTest", RE::ImageSpaceManager::GetCurrentIndex(ISLvl6PreTest) }, { "BSImagespaceShaderISLvl5PreTest", RE::ImageSpaceManager::GetCurrentIndex(ISLvl5PreTest) }, @@ -1839,9 +1812,6 @@ namespace SIE } auto state = globals::state; - if (globals::game::isVR && strcmp(shader.fxpFilename, "OBBOcclusionTesting") == 0) - // use vanilla shader - return nullptr; if (!((ShaderCache::IsSupportedShader(shader) || state->IsDeveloperMode() && state->IsShaderEnabled(shader)) && state->enableVShaders)) { return nullptr; @@ -1883,9 +1853,6 @@ namespace SIE uint32_t descriptor) { auto state = globals::state; - if (globals::game::isVR && strcmp(shader.fxpFilename, "OBBOcclusionTesting") == 0) - // use vanilla shader - return nullptr; if (!((ShaderCache::IsSupportedShader(shader) || state->IsDeveloperMode() && state->IsShaderEnabled(shader)) && state->enablePShaders)) { return nullptr; diff --git a/src/ShaderCache.h b/src/ShaderCache.h index 3808a10236..c5e73c42d1 100644 --- a/src/ShaderCache.h +++ b/src/ShaderCache.h @@ -14,7 +14,7 @@ namespace ShaderConstants { static const LightingPS& Get() { - static LightingPS instance = REL::Module::IsVR() ? GetVR() : GetFlat(); + static LightingPS instance = GetFlat(); return instance; } @@ -23,54 +23,6 @@ namespace ShaderConstants return LightingPS{}; } - static LightingPS GetVR() - { - return LightingPS{ - .AmbientColor = 24, - .FogColor = 25, - .ColourOutputClamp = 26, - .EnvmapData = 27, - .ParallaxOccData = 28, - .TintColor = 29, - .LODTexParams = 30, - .SpecularColor = 31, - .SparkleParams = 32, - .MultiLayerParallaxData = 33, - .LightingEffectParams = 34, - .IBLParams = 35, - .LandscapeTexture1to4IsSnow = 36, - .LandscapeTexture5to6IsSnow = 37, - .LandscapeTexture1to4IsSpecPower = 38, - .LandscapeTexture5to6IsSpecPower = 39, - .SnowRimLightParameters = 40, - .CharacterLightParams = 41, - .PBRFlags = 44, - .PBRParams1 = 45, - .LandscapeTexture2PBRParams = 46, - .LandscapeTexture3PBRParams = 47, - .LandscapeTexture4PBRParams = 48, - .LandscapeTexture5PBRParams = 49, - .LandscapeTexture6PBRParams = 50, - .PBRParams2 = 51, - .LandscapeTexture1GlintParameters = 52, - .LandscapeTexture2GlintParameters = 53, - .LandscapeTexture3GlintParameters = 54, - .LandscapeTexture4GlintParameters = 55, - .LandscapeTexture5GlintParameters = 56, - .LandscapeTexture6GlintParameters = 57, - .MaterialObjectRGBScale = 58, // RGB multipliers for material objects - - .ShadowSampleParam = 18, - .EndSplitDistances = 19, - .StartSplitDistances = 20, - .DephBiasParam = 21, - .ShadowLightParam = 22, - .ShadowMapProj = 23, - .InvWorldMat = 42, - .PreviousWorldMat = 43, - }; - } - const int32_t NumLightNumShadowLight = 0; const int32_t PointLightPosition = 1; const int32_t PointLightColor = 2; @@ -138,7 +90,7 @@ namespace ShaderConstants { static const GrassPS& Get() { - static GrassPS instance = REL::Module::IsVR() ? GetVR() : GetFlat(); + static GrassPS instance = GetFlat(); return instance; } @@ -147,11 +99,6 @@ namespace ShaderConstants return GrassPS{}; } - static GrassPS GetVR() - { - return GrassPS{}; - } - const int32_t PBRFlags = 0; const int32_t PBRParams1 = 1; const int32_t PBRParams2 = 2; @@ -161,7 +108,7 @@ namespace ShaderConstants { static const EffectPS& Get() { - static EffectPS instance = REL::Module::IsVR() ? GetVR() : GetFlat(); + static EffectPS instance = GetFlat(); return instance; } @@ -170,11 +117,6 @@ namespace ShaderConstants return EffectPS{}; } - static EffectPS GetVR() - { - return EffectPS{}; - } - const int32_t PropertyColor = 0; const int32_t AlphaTestRef = 1; const int32_t MembraneRimColor = 2; @@ -375,17 +317,6 @@ namespace SIE inline static bool IsSupportedShader(const RE::BSShader::Type type) { - if (!REL::Module::IsVR()) - return type == RE::BSShader::Type::Lighting || - type == RE::BSShader::Type::BloodSplatter || - type == RE::BSShader::Type::DistantTree || - type == RE::BSShader::Type::Sky || - type == RE::BSShader::Type::Grass || - type == RE::BSShader::Type::Particle || - type == RE::BSShader::Type::Water || - type == RE::BSShader::Type::Effect || - type == RE::BSShader::Type::Utility || - type == RE::BSShader::Type::ImageSpace; return type == RE::BSShader::Type::Lighting || type == RE::BSShader::Type::BloodSplatter || type == RE::BSShader::Type::DistantTree || diff --git a/src/State.cpp b/src/State.cpp index 2a7a79e65d..b90d7c35b4 100644 --- a/src/State.cpp +++ b/src/State.cpp @@ -17,7 +17,6 @@ #include "Features/TerrainBlending.h" #include "Features/TerrainHelper.h" #include "Features/Upscaling.h" -#include "Features/VRStereoOptimizations.h" #include "Features/VolumetricShadows.h" #include "Menu.h" #include "SceneSettingsManager.h" @@ -210,9 +209,7 @@ void State::Reset() } // Disable "improved" snow shader, unsupported - if (!globals::game::isVR) { - RE::GetINISetting("bEnableImprovedSnow:Display")->data.b = false; - } + RE::GetINISetting("bEnableImprovedSnow:Display")->data.b = false; activeReflections = false; } @@ -725,7 +722,6 @@ void State::CheckTypedUAVLoadSupport() { DXGI_FORMAT_R16G16B16A16_FLOAT, "R16G16B16A16_FLOAT", "Dynamic Cubemaps (HDR), Skylighting outProbeArray" }, { DXGI_FORMAT_R16G16B16A16_UNORM, "R16G16B16A16_UNORM", "Grass Collision (collisionTexture)" }, { DXGI_FORMAT_R16G16_UNORM, "R16G16_UNORM", "Terrain Shadows (RWTexShadowHeights)" }, - { DXGI_FORMAT_R16G16_FLOAT, "R16G16_FLOAT", "VR Stereo Blend (kMOTION_VECTOR reprojection)" }, { DXGI_FORMAT_R8G8B8A8_UNORM, "R8G8B8A8_UNORM", "HDR Display UI brightness (uiTexture)" }, { DXGI_FORMAT_R8_UINT, "R8_UINT", "Skylighting accumulation frames (outAccumFramesArray)" }, { DXGI_FORMAT_R16_FLOAT, "R16_FLOAT", "Vanilla volumetric lighting density (DensityRW)" }, @@ -755,7 +751,7 @@ void State::CheckTypedUAVLoadSupport() logger::warn( "[TypedUAVLoad] One or more required formats lack typed-UAV-load support on this GPU. " "Affected features will read undefined data and may produce visual artifacts. " - "Consider disabling: Dynamic Cubemaps, Grass Collision, Terrain Shadows, Skylighting, HDR Display, VR Stereo Optimisations."); + "Consider disabling: Dynamic Cubemaps, Grass Collision, Terrain Shadows, Skylighting, HDR Display."); } } @@ -782,7 +778,6 @@ void State::SetupResources() featureDataCB = new ConstantBuffer(ConstantBufferDesc((uint32_t)size)); // Grab main texture to get resolution - // VR cannot use viewport->screenWidth/Height as it's the desktop preview window's resolution and not HMD D3D11_TEXTURE2D_DESC texDesc{}; renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN].texture->GetDesc(&texDesc); @@ -970,7 +965,7 @@ void State::UpdateSharedData([[maybe_unused]] bool a_inWorld, [[maybe_unused]] b data.DirLightColor *= lightRuntimeData.fade; auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton(); - data.DirLightColor *= !globals::game::isVR ? imageSpaceManager->GetRuntimeData().data.baseData.hdr.sunlightScale : imageSpaceManager->GetVRRuntimeData().data.baseData.hdr.sunlightScale; + data.DirLightColor *= imageSpaceManager->GetRuntimeData().data.baseData.hdr.sunlightScale; const auto& direction = dirLight->GetWorldDirection(); data.DirLightDirection = { -direction.x, -direction.y, -direction.z, 0.0f }; @@ -994,23 +989,7 @@ void State::UpdateSharedData([[maybe_unused]] bool a_inWorld, [[maybe_unused]] b } } - // Fallback water height for the VR analytical mask when tile 12 returns the sentinel. - // Uses player->GetWaterHeight() (reads relevantWaterHeight from LOADED_REF_DATA) gated by - // underwaterCount > 0 so it is only set when the player is actually in a water body. - // Covers both interior water (where TES::GetWaterHeight returns -NI_INFINITY) and exterior - // partial submersion. Stored as eye-0 camera-relative Z to match WaterData[].w. data.WaterSystemHeight = -RE::NI_INFINITY; - if (globals::game::isVR) { - if (auto player = globals::game::player) { - if (player->loadedData && player->loadedData->underwaterCount > 0) { - float worldHeight = player->GetWaterHeight(); - if (worldHeight > -RE::NI_INFINITY) { - auto eye0Pos = Util::GetEyePosition(0); - data.WaterSystemHeight = worldHeight - eye0Pos.z; - } - } - } - } data.InInterior = Util::IsInterior(); data.HasDirectionalShadows = HasDirectionalShadows(); diff --git a/src/State.h b/src/State.h index 7057fee387..32d811a822 100644 --- a/src/State.h +++ b/src/State.h @@ -257,7 +257,7 @@ class State uint InMapMenu; uint HideSky; float MipBias; - float WaterSystemHeight; // TES::GetWaterHeight at eye-0 in camera-relative Z; -NI_INFINITY when no water body found (VR only) + float WaterSystemHeight; // TES::GetWaterHeight in camera-relative Z; -NI_INFINITY when no water body found float3 pad0; float4 AmbientSHR; float4 AmbientSHG; diff --git a/src/TruePBR.cpp b/src/TruePBR.cpp index 4dc47668d9..530f13f5c5 100644 --- a/src/TruePBR.cpp +++ b/src/TruePBR.cpp @@ -1182,7 +1182,7 @@ bool TruePBR::TESObjectLAND_SetupMaterial(RE::TESObjectLAND* land) if (land->loadedData != nullptr && land->loadedData->mesh[0] != nullptr) { land->data.flags.set(static_cast(8)); for (uint32_t quadIndex = 0; quadIndex < 4; ++quadIndex) { - auto shaderProperty = static_cast(memoryManager->Allocate(REL::Module::IsVR() ? 0x178 : sizeof(RE::BSLightingShaderProperty), 0, false)); + auto shaderProperty = static_cast(memoryManager->Allocate(sizeof(RE::BSLightingShaderProperty), 0, false)); shaderProperty->Ctor(); { diff --git a/src/TruePBR.h b/src/TruePBR.h index 044baea62b..befc8db420 100644 --- a/src/TruePBR.h +++ b/src/TruePBR.h @@ -19,7 +19,6 @@ struct TruePBR : Feature virtual std::string GetShortName() override { return "TruePBR"; } virtual std::string_view GetCategory() const override { return FeatureCategories::kMaterials; } virtual bool IsCore() const override { return true; } - virtual bool SupportsVR() override { return true; } virtual bool IsInMenu() const override { return true; } virtual bool DrawFailLoadMessage() const override { return false; } diff --git a/src/Utils/D3D.cpp b/src/Utils/D3D.cpp index 5f6c4b5737..a8bf203c50 100644 --- a/src/Utils/D3D.cpp +++ b/src/Utils/D3D.cpp @@ -159,8 +159,6 @@ namespace Util } } - if (REL::Module::IsVR()) - macros.push_back({ "VR", "" }); if (globals::state->IsDeveloperMode()) { macros.push_back({ "D3DCOMPILE_SKIP_OPTIMIZATION", "" }); macros.push_back({ "D3DCOMPILE_DEBUG", "" }); diff --git a/src/Utils/D3D.h b/src/Utils/D3D.h index eef88de3f0..06c9aa3ed5 100644 --- a/src/Utils/D3D.h +++ b/src/Utils/D3D.h @@ -17,15 +17,14 @@ namespace Util void ApplyHighlightTintToTexture(ID3D11Texture2D* texture, bool isHighlighted, const std::array& highlightColor = { 1.0f, 0.5f, 0.0f, 0.3f }); HRESULT CreateOverlayTextureAndRTV(ID3D11Device* device, int width, int height, ID3D11Texture2D** outTex, ID3D11RenderTargetView** outRTV); - // VR-aware counts for render targets inline int GetRenderTargetCount() { - return REL::Module::IsVR() ? RE::RENDER_TARGETS::kVRTOTAL : RE::RENDER_TARGETS::kTOTAL; + return RE::RENDER_TARGETS::kTOTAL; } inline int GetDepthStencilCount() { - return REL::Module::IsVR() ? RE::RENDER_TARGETS_DEPTHSTENCIL::kVRTOTAL : RE::RENDER_TARGETS_DEPTHSTENCIL::kTOTAL; + return RE::RENDER_TARGETS_DEPTHSTENCIL::kTOTAL; } HRESULT SaveTextureToFile(ID3D11Device* device, ID3D11DeviceContext* context, const std::filesystem::path& path, ID3D11Texture2D* tex); diff --git a/src/Utils/Game.cpp b/src/Utils/Game.cpp index 31900f417c..08619347e2 100644 --- a/src/Utils/Game.cpp +++ b/src/Utils/Game.cpp @@ -32,7 +32,7 @@ namespace Util { if (globals::game::shadowState) { if (auto tes = RE::TES::GetSingleton()) { - auto position = GetEyePosition(0); + auto position = GetAverageEyePosition(); position.x += offsetX; position.y += offsetY; if (auto cell = tes->GetCell(position)) { @@ -96,26 +96,7 @@ namespace Util RE::NiPoint3 GetAverageEyePosition() { auto shadowState = globals::game::shadowState; - if (!REL::Module::IsVR()) - return shadowState->GetRuntimeData().posAdjust.getEye(); - return (shadowState->GetVRRuntimeData().posAdjust.getEye(0) + shadowState->GetVRRuntimeData().posAdjust.getEye(1)) * 0.5f; - } - - RE::NiPoint3 GetEyePosition(int eyeIndex) - { - auto shadowState = globals::game::shadowState; - if (!REL::Module::IsVR()) - return shadowState->GetRuntimeData().posAdjust.getEye(); - return shadowState->GetVRRuntimeData().posAdjust.getEye(eyeIndex); - } - - RE::BSGraphics::ViewData GetCameraData(int eyeIndex) - { - auto shadowState = globals::game::shadowState; - if (!REL::Module::IsVR()) { - return shadowState->GetRuntimeData().cameraData.getEye(); - } - return shadowState->GetVRRuntimeData().cameraData.getEye(eyeIndex); + return shadowState->GetRuntimeData().posAdjust.getEye(); } float4 GetCameraData() @@ -135,7 +116,7 @@ namespace Util bool GetTemporal() { auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton(); - return (!REL::Module::IsVR() ? imageSpaceManager->GetRuntimeData().BSImagespaceShaderISTemporalAA->taaEnabled : imageSpaceManager->GetVRRuntimeData().BSImagespaceShaderISTemporalAA->taaEnabled); + return imageSpaceManager->GetRuntimeData().BSImagespaceShaderISTemporalAA->taaEnabled; } float GetVerticalFOVRad() diff --git a/src/Utils/Game.h b/src/Utils/Game.h index 83f620cdc7..14fb3ee80c 100644 --- a/src/Utils/Game.h +++ b/src/Utils/Game.h @@ -2,31 +2,11 @@ #pragma once -/** - @def GET_INSTANCE_MEMBER - @brief Set variable in current namespace based on instance member from GetRuntimeData or GetVRRuntimeData. - - @warning The class must have both a GetRuntimeData() and GetVRRuntimeData() function. - - @param a_value The instance member value to access (e.g., renderTargets). - @param a_source The instance of the class (e.g., state). - @result The a_value will be set as a variable in the current namespace. (e.g., auto& renderTargets = state->renderTargets;) - */ #define GET_INSTANCE_MEMBER(a_value, a_source) \ - auto& a_value = !REL::Module::IsVR() ? a_source->GetRuntimeData().a_value : a_source->GetVRRuntimeData().a_value; - -/** - @def GET_INSTANCE_MEMBER_PTR - @brief Return refptr to runtimedata in current namespace based on instance member from GetRuntimeData or GetVRRuntimeData. - - @warning The class must have both a GetRuntimeData() and GetVRRuntimeData() function. + auto& a_value = a_source->GetRuntimeData().a_value; - @param a_value The instance member value to access (e.g., renderTargets). - @param a_source The instance of the class (e.g., state). - @result The a_value will be returned as a refptr. (e.g., &state->renderTargets;) - */ #define GET_INSTANCE_MEMBER_PTR(a_value, a_source) \ - &(!REL::Module::IsVR() ? a_source->GetRuntimeData().a_value : a_source->GetVRRuntimeData().a_value) + &(a_source->GetRuntimeData().a_value) namespace Util { @@ -38,8 +18,6 @@ namespace Util float GetVerticalFOVRad(); RE::NiPoint3 GetAverageEyePosition(); - RE::NiPoint3 GetEyePosition(int eyeIndex); - RE::BSGraphics::ViewData GetCameraData(int eyeIndex); float2 ConvertToDynamic(float2 a_size, bool a_ignoreLock = false); diff --git a/src/Utils/GameSetting.h b/src/Utils/GameSetting.h index dff7d2f3fe..b212c9ebbc 100644 --- a/src/Utils/GameSetting.h +++ b/src/Utils/GameSetting.h @@ -107,7 +107,7 @@ namespace Util * @brief Gets the value of a game setting, transparently handling INI-based and offset-based settings. * * For INI-based settings (offset == 0), tries INISettingCollection, INIPrefSettingCollection, - * then GameSettingCollection. For offset-based settings (e.g., VR where INI entries don't exist), + * then GameSettingCollection. For offset-based settings, * reads directly from the memory address. * * @tparam T The expected value type (bool, float, std::int32_t, or std::uint32_t). @@ -152,7 +152,7 @@ namespace Util * @brief Sets the value of a game setting, transparently handling INI-based and offset-based settings. * * For INI-based settings (offset == 0), tries INISettingCollection, INIPrefSettingCollection, - * then GameSettingCollection. For offset-based settings (e.g., VR where INI entries don't exist), + * then GameSettingCollection. For offset-based settings, * writes directly to the memory address. * * @tparam T The value type (bool, float, std::int32_t, or std::uint32_t). diff --git a/src/Utils/Input.h b/src/Utils/Input.h index d4d01aff61..7e5ba6d768 100644 --- a/src/Utils/Input.h +++ b/src/Utils/Input.h @@ -7,17 +7,15 @@ /** * @brief Identifies the type of input device for input mapping - * - * Used to distinguish between VR controllers, keyboard, mouse, and gamepads. */ enum class InputDeviceType { - Primary = 0, ///< VR: The dominant hand controller (right for right-handed, left for left-handed) - Secondary = 1, ///< VR: The non-dominant hand controller - Both = 2, ///< VR: Both controllers simultaneously + Primary = 0, + Secondary = 1, + Both = 2, Keyboard = 3, ///< Keyboard input Mouse = 4, ///< Mouse input - Gamepad = 5 ///< Gamepad/Controller input (non-VR) + Gamepad = 5 ///< Gamepad/Controller input }; /** @@ -63,9 +61,9 @@ constexpr bool IsValidDevice(InputDeviceType device) * The upper 16 bits store the device type, lower 16 bits store the key code. * * Can represent: - * - VR Controller button presses * - Keyboard key presses * - Mouse button clicks + * - Gamepad button presses */ struct InputCombo { @@ -83,12 +81,7 @@ struct InputCombo { } - // VR helper methods - static InputCombo Primary(uint32_t key) { return InputCombo(InputDeviceType::Primary, key); } - static InputCombo Secondary(uint32_t key) { return InputCombo(InputDeviceType::Secondary, key); } - static InputCombo Both(uint32_t key) { return InputCombo(InputDeviceType::Both, key); } - - // Desktop helper methods + // Helper methods static InputCombo Keyboard(uint32_t key) { return InputCombo(InputDeviceType::Keyboard, key); } static InputCombo Mouse(uint32_t key) { return InputCombo(InputDeviceType::Mouse, key); } static InputCombo Gamepad(uint32_t key) { return InputCombo(InputDeviceType::Gamepad, key); } @@ -192,84 +185,12 @@ struct InputCombo * If so, we could serialize as a list of integers (key codes) for better readability. */ - /** - * @brief Static helper to get a formatted string for a VR combo - */ - static std::string GetVRString(const std::vector& combo) - { - std::string result; - for (size_t i = 0; i < combo.size(); ++i) { - if (i > 0) - result += " + "; - const auto& input = combo[i]; - - if (input.GetDevice() == InputDeviceType::Keyboard) { - result += std::format("Key:{:X}", input.GetKey()); - } else { - // VR Button mapping - // Based on BSOpenVRControllerDevice::Keys enum values - // 2 = Grip, 7 = Trigger, 32 = Touchpad, 33 = Stick, 1 = BY, 31 = XA - // These are standard OpenVR / SkyrimVR constants - switch (input.GetKey()) { - case 2: - result += "Grip"; - break; - case 7: - result += "Trigger"; - break; - case 32: - result += "Touchpad"; - break; - case 33: - result += "Stick"; - break; - case 1: - result += "B/Y"; - break; - case 31: - result += "A/X"; - break; - case 9: - result += "Menu"; - break; - case 34: - result += "Shoulder"; - break; - default: - result += std::format("Btn:{:d}", input.GetKey()); - break; - } - - // Append device info if mixed or specific - switch (input.GetDevice()) { - case InputDeviceType::Primary: - result += "(Pri)"; - break; - case InputDeviceType::Secondary: - result += "(Sec)"; - break; - case InputDeviceType::Both: - result += "(Both)"; - break; - default: - break; - } - } - } - - if (result.empty()) { - return "None"; - } - - return result; - } - /** * @brief Wrapper for std::vector to provide custom JSON serialization. * * Serialization rules for backward compatibility: * - Single keyboard key (no modifiers): saves as plain uint32_t key code - * - Single VR/controller input: saves as plain uint32_t packed value + * - Single controller input: saves as plain uint32_t packed value * - Multiple keys (combo): saves as array of uint32_t values * - Empty: saves as 0 (unbound) * @@ -292,7 +213,7 @@ struct InputCombo // Single keyboard key - save as plain key code j = combos[0].GetKey(); } else { - // Single VR/controller input - save as packed value + // Single controller input - save as packed value j = combos[0].deviceAndKey; } return; @@ -320,7 +241,7 @@ struct InputCombo } j = keyCodes; } else { - // For VR or mixed inputs, use the packed format + // For mixed inputs, use the packed format std::vector packedValues; packedValues.reserve(combos.size()); for (const auto& c : combos) { diff --git a/src/Utils/UI.cpp b/src/Utils/UI.cpp index 9e6e6464ea..df59ea4fba 100644 --- a/src/Utils/UI.cpp +++ b/src/Utils/UI.cpp @@ -25,11 +25,9 @@ #include #include "../Feature.h" -#include "../Features/VR.h" #include "../Globals.h" #include "../Menu.h" #include "FileSystem.h" -#include "VRUtils.h" #define STB_IMAGE_IMPLEMENTATION #include @@ -1883,18 +1881,6 @@ namespace Util if (combo.empty()) return "None"; - bool hasVRInput = false; - for (const auto& input : combo) { - if (input.GetDevice() != InputDeviceType::Keyboard && input.GetDevice() != InputDeviceType::Mouse) { - hasVRInput = true; - break; - } - } - - if (hasVRInput && REL::Module::IsVR()) { - return InputCombo::GetVRString(combo); - } - std::string result; for (size_t i = 0; i < combo.size(); ++i) { if (i > 0) @@ -2431,50 +2417,6 @@ namespace Util } } - // Draw VR-specific color coding if applicable - if (REL::Module::IsVR() && !combo.empty()) { - ImGui::SameLine(); - - // Check if we have mixed devices - bool hasPrimary = false; - bool hasSecondary = false; - bool hasBoth = false; - - for (const auto& input : combo) { - switch (input.GetDevice()) { - case InputDeviceType::Primary: - hasPrimary = true; - break; - case InputDeviceType::Secondary: - hasSecondary = true; - break; - case InputDeviceType::Both: - hasBoth = true; - break; - default: - break; - } - } - - ImVec4 indicatorColor = GetControllerDefaultColor(); - const char* indicatorText = ""; - - if (hasBoth || (hasPrimary && hasSecondary)) { - indicatorColor = GetControllerBothColor(); - indicatorText = hasBoth ? "(Both)" : "(Mixed)"; - } else if (hasPrimary) { - indicatorColor = GetControllerPrimaryColor(); - indicatorText = "(Primary)"; - } else if (hasSecondary) { - indicatorColor = GetControllerSecondaryColor(); - indicatorText = "(Secondary)"; - } - - if (indicatorText[0] != '\0') { - ImGui::TextColored(indicatorColor, "%s", indicatorText); - } - } - return changed; } diff --git a/src/Utils/UI.h b/src/Utils/UI.h index e93babe8d8..89addd6526 100644 --- a/src/Utils/UI.h +++ b/src/Utils/UI.h @@ -1074,7 +1074,7 @@ namespace Util * @brief Converts a key combo (vector of InputCombo) to a human-readable string * * For keyboard-only combos, produces strings like "Ctrl + Shift + A". - * For VR inputs, delegates to InputCombo::GetVRString for proper formatting. + * For non-keyboard inputs, formats using the packed device+key representation. * * @param combo Vector of InputCombo representing the key combination * @return Human-readable string representation of the combo, or "None" if empty @@ -1516,9 +1516,9 @@ namespace Util } /** - * @brief Unified input recording widget for both VR and Desktop + * @brief Unified input recording widget * - * Handles recording of multi-key sequences for keyboard, mouse, and VR controllers. + * Handles recording of multi-key sequences for keyboard and mouse. * Supports modifiers, combo sequences, and device-specific rendering. * * @param label The label for the input setting diff --git a/src/Utils/VRUtils.cpp b/src/Utils/VRUtils.cpp deleted file mode 100644 index 23ac293156..0000000000 --- a/src/Utils/VRUtils.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include "VRUtils.h" -#include "Features/VR.h" // For ButtonCombo and ControllerDevice definitions -#include "RE/B/BSOpenVR.h" -#include "UI.h" -#include - -namespace Util -{ - void DrawButtonCombo(const std::vector& combo, bool showControllerLabels) - { - bool anyDrawn = false; - for (size_t i = 0; i < combo.size(); ++i) { - if (combo[i].GetKey() == 0) - continue; - if (i > 0) { - ImGui::SameLine(); - ImGui::Text("+"); - ImGui::SameLine(); - } - ImVec4 color; - switch (combo[i].GetDevice()) { - case InputDeviceType::Primary: - color = Util::GetControllerPrimaryColor(); - break; - case InputDeviceType::Secondary: - color = Util::GetControllerSecondaryColor(); - break; - case InputDeviceType::Both: - color = Util::GetControllerBothColor(); - break; - default: - color = Util::GetControllerDefaultColor(); - break; - } - ImGui::PushStyleColor(ImGuiCol_Text, color); - ImGui::Text("%s", RE::GetOpenVRButtonName(combo[i].GetKey())); - ImGui::PopStyleColor(); - anyDrawn = true; - if (showControllerLabels) { - ImGui::SameLine(); - ImVec4 labelColor = Util::GetControllerDefaultColor(); - const char* label = ""; - switch (combo[i].GetDevice()) { - case InputDeviceType::Primary: - label = "(Primary Controller)"; - labelColor = Util::GetControllerPrimaryColor(); - break; - case InputDeviceType::Secondary: - label = "(Secondary Controller)"; - labelColor = Util::GetControllerSecondaryColor(); - break; - case InputDeviceType::Both: - label = "(Both Controllers)"; - labelColor = Util::GetControllerBothColor(); - break; - default: - break; - } - ImGui::TextColored(labelColor, "%s", label); - if (i < combo.size() - 1) - ImGui::SameLine(); - } - } - if (anyDrawn) { - if (auto _tt = Util::HoverTooltipWrapper()) { - Util::DrawColoredMultiLineTooltip({ { "Color coding:", Util::GetControllerDefaultColor() }, - { "Yellow = Primary controller", Util::GetControllerPrimaryColor() }, - { "Blue = Secondary controller", Util::GetControllerSecondaryColor() }, - { "Green = Both controllers (Yellow + Blue)", Util::GetControllerBothColor() } }); - } - } - } - - vr::HmdMatrix34_t ComputeOverlayTransformFromHMD(float offsetX, float offsetY, float offsetZ) - { - // Initialize as identity matrix to ensure valid transform on early returns - vr::HmdMatrix34_t transform = {}; - transform.m[0][0] = 1.0f; - transform.m[1][1] = 1.0f; - transform.m[2][2] = 1.0f; - // All other elements remain 0.0f from the {} initialization - - // Use the same OpenVR access pattern as the VR class - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - if (!openvr) - return transform; - - auto* system = openvr->vrSystem; - if (!system) - return transform; - - vr::TrackedDevicePose_t hmdPose; - if (!GetDeviceToAbsoluteTrackingPoseCompatible(vr::TrackingUniverseStanding, 0, &hmdPose, 1)) - return transform; - if (!hmdPose.bPoseIsValid) - return transform; - - transform = hmdPose.mDeviceToAbsoluteTracking; - - // Apply HMD overlay offsets (in HMD local space) - transform.m[0][3] += transform.m[0][0] * offsetX + transform.m[0][1] * offsetY + transform.m[0][2] * offsetZ; - transform.m[1][3] += transform.m[1][0] * offsetX + transform.m[1][1] * offsetY + transform.m[1][2] * offsetZ; - transform.m[2][3] += transform.m[2][0] * offsetX + transform.m[2][1] * offsetY + transform.m[2][2] * offsetZ; - - return transform; - } - - //============================================================================= - // NEW ACTIVE FUNCTIONS FROM VR.CPP - //============================================================================= - - // NOTE: OpenComposite Compatibility - // The functions below provide compatibility with OpenComposite, which has issues - // with GetDeviceToAbsoluteTrackingPose when requesting poses. We completely avoid - // using GetDeviceToAbsoluteTrackingPose and instead use VRCompositor interfaces - // obtained through BSOpenVR to avoid static linking issues on non-VR systems. - - OpenVRContext::OpenVRContext() - { - openvr = RE::BSOpenVR::GetSingleton(); - if (openvr) { - system = openvr->vrSystem; - overlay = RE::BSOpenVR::GetIVROverlayFromContext(&openvr->vrContext); - } - } - - vr::TrackedDeviceIndex_t GetControllerIndexForDevice(InputDeviceType device, bool isLeftHanded) - { - OpenVRContext ctx; - if (!ctx.IsValid()) - return vr::k_unTrackedDeviceIndexInvalid; - - // Determine the OpenVR role based on handedness and our device enum - vr::ETrackedControllerRole targetRole; - - if (device == InputDeviceType::Primary) { - // Primary controller = dominant hand - targetRole = isLeftHanded ? vr::ETrackedControllerRole::TrackedControllerRole_LeftHand : vr::ETrackedControllerRole::TrackedControllerRole_RightHand; - } else { - // Secondary controller = non-dominant hand - targetRole = isLeftHanded ? vr::ETrackedControllerRole::TrackedControllerRole_RightHand : vr::ETrackedControllerRole::TrackedControllerRole_LeftHand; - } - - // Find controller with the target role - for (vr::TrackedDeviceIndex_t i = 0; i < vr::k_unMaxTrackedDeviceCount; ++i) { - if (ctx.system->GetTrackedDeviceClass(i) == vr::TrackedDeviceClass_Controller) { - if (ctx.system->GetControllerRoleForTrackedDeviceIndex(i) == targetRole) { - return i; - } - } - } - return vr::k_unTrackedDeviceIndexInvalid; - } - - bool GetControllerWorldMatrix(vr::TrackedDeviceIndex_t index, float out[3][4]) - { - OpenVRContext ctx; - if (!ctx.IsValid()) - return false; - - vr::TrackedDevicePose_t poses[vr::k_unMaxTrackedDeviceCount]; - if (!GetDeviceToAbsoluteTrackingPoseCompatible(vr::TrackingUniverseStanding, 0, poses, vr::k_unMaxTrackedDeviceCount)) - return false; - - if (!poses[index].bPoseIsValid) - return false; - - for (int i = 0; i < 3; ++i) - for (int j = 0; j < 4; ++j) - out[i][j] = poses[index].mDeviceToAbsoluteTracking.m[i][j]; - return true; - } - - bool GetDeviceToAbsoluteTrackingPoseCompatible(vr::ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, vr::TrackedDevicePose_t* pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount) - { - (void)fPredictedSecondsToPhotonsFromNow; - (void)eOrigin; - OpenVRContext ctx; - if (!ctx.IsValid()) - return false; - - // For single device requests (common with HMD pose requests), - // use a full pose array to ensure OpenComposite compatibility - if (unTrackedDevicePoseArrayCount == 1) { - vr::TrackedDevicePose_t allPoses[vr::k_unMaxTrackedDeviceCount]; - - // Try to use compositor interface first for better OpenComposite compatibility - // Use BSOpenVR's method to avoid static linking issues - auto* compositor = RE::BSOpenVR::GetIVRCompositor(); - if (!compositor && ctx.openvr) { - // Fallback to compositor from the context - compositor = ctx.openvr->vrContext.vrCompositor; - } - - if (compositor) { - // For OpenComposite compatibility, try to use GetLastPoses which is more stable - auto error = compositor->GetLastPoses(allPoses, vr::k_unMaxTrackedDeviceCount, nullptr, 0); - if (error == vr::VRCompositorError_None) { - // Copy HMD pose (index 0) to output - pTrackedDevicePoseArray[0] = allPoses[0]; - return true; - } - // Fallback to WaitGetPoses if GetLastPoses fails - error = compositor->WaitGetPoses(allPoses, vr::k_unMaxTrackedDeviceCount, nullptr, 0); - if (error == vr::VRCompositorError_None) { - // Copy HMD pose (index 0) to output - pTrackedDevicePoseArray[0] = allPoses[0]; - return true; - } - } - - // If compositor methods failed, return false rather than using the problematic direct call - return false; - } - - // For full device array requests, try compositor first - // Use BSOpenVR's method to avoid static linking issues - auto* compositor = RE::BSOpenVR::GetIVRCompositor(); - if (!compositor && ctx.openvr) { - // Fallback to compositor from the context - compositor = ctx.openvr->vrContext.vrCompositor; - } - - if (compositor) { - // For OpenComposite compatibility, try to use GetLastPoses which is more stable - auto error = compositor->GetLastPoses(pTrackedDevicePoseArray, unTrackedDevicePoseArrayCount, nullptr, 0); - if (error == vr::VRCompositorError_None) { - return true; - } - // Fallback to WaitGetPoses if GetLastPoses fails - error = compositor->WaitGetPoses(pTrackedDevicePoseArray, unTrackedDevicePoseArrayCount, nullptr, 0); - if (error == vr::VRCompositorError_None) { - return true; - } - } - - // If compositor methods failed, return false rather than using the problematic direct call - return false; - } - -} \ No newline at end of file diff --git a/src/Utils/VRUtils.h b/src/Utils/VRUtils.h deleted file mode 100644 index 0e52b283d6..0000000000 --- a/src/Utils/VRUtils.h +++ /dev/null @@ -1,248 +0,0 @@ -#pragma once -#include "D3D.h" -#include "Utils/Input.h" -#include -#include -#include // For ImVec4 -#include -#include - -// Forward declarations - actual definitions are in Features/VR.h -using ControllerDevice = InputDeviceType; -using ButtonCombo = InputCombo; - -/** - * @brief VR utility functions and helpers for OpenVR integration - * - * This namespace provides a collection of utility functions for VR development, - * including overlay management, matrix transformations, controller utilities, - * and UI drawing functions for VR-specific elements. - */ -namespace Util -{ - // ----------------------------------------------------------------------------- - // Centralized UI Colors for Util functions - // ----------------------------------------------------------------------------- - namespace Colors - { - constexpr ImVec4 Primary = ImVec4(1.0f, 1.0f, 0.0f, 1.0f); // Yellow - constexpr ImVec4 Secondary = ImVec4(0.0f, 0.5f, 1.0f, 1.0f); // Blue - constexpr ImVec4 Both = ImVec4(0.0f, 1.0f, 0.0f, 1.0f); // Green - constexpr ImVec4 Default = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // White - } - - inline ImVec4 GetControllerPrimaryColor() { return Colors::Primary; } - inline ImVec4 GetControllerSecondaryColor() { return Colors::Secondary; } - inline ImVec4 GetControllerBothColor() { return Colors::Both; } - inline ImVec4 GetControllerDefaultColor() { return Colors::Default; } - - /** - * @brief Draws a button combination in the ImGui interface with color coding - * @param combo Vector of ButtonCombo structures representing the key combination - * @param showControllerLabels Whether to show controller device labels (Primary/Secondary/Both) - * - * This function renders button combinations with color-coded text: - * - Green: Primary controller - * - Blue: Secondary controller - * - Purple: Both controllers - * - * @example - * ```cpp - * std::vector combo = { ButtonCombo::Primary(kTrigger), ButtonCombo::Secondary(kGrip) }; - * Util::DrawButtonCombo(combo, true); - * ``` - */ - void DrawButtonCombo(const std::vector& combo, bool showControllerLabels); - - /** - * @brief Computes a transformation matrix for positioning an overlay relative to the HMD - * @param offsetX Horizontal offset from HMD in meters (positive = right) - * @param offsetY Vertical offset from HMD in meters (positive = up) - * @param offsetZ Depth offset from HMD in meters (positive = away from user) - * @return HMD transformation matrix with applied offsets - * - * This function gets the current HMD pose and applies the specified offsets - * in HMD local space to create a transformation matrix suitable for overlay positioning. - */ - vr::HmdMatrix34_t ComputeOverlayTransformFromHMD(float offsetX, float offsetY, float offsetZ); - - /** - * @brief Common OpenVR system access pattern with validation - * - * This struct provides a standardized way to access OpenVR interfaces - * with proper validation and error handling. It encapsulates the common - * pattern of getting BSOpenVR singleton and extracting the system and overlay interfaces. - */ - struct OpenVRContext - { - RE::BSOpenVR* openvr = nullptr; ///< BSOpenVR singleton instance - vr::IVRSystem* system = nullptr; ///< OpenVR system interface - vr::IVROverlay* overlay = nullptr; ///< OpenVR overlay interface - - /** - * @brief Constructor that initializes all OpenVR interfaces - * - * Automatically retrieves the BSOpenVR singleton and extracts - * the system and overlay interfaces for immediate use. - */ - OpenVRContext(); - - /** - * @brief Check if basic VR system is available - * @return true if both openvr and system interfaces are valid - */ - bool IsValid() const { return openvr && system; } - - /** - * @brief Check if overlay functionality is available - * @return true if all interfaces (including overlay) are valid - */ - bool HasOverlay() const { return IsValid() && overlay; } - }; - - /** - * @brief Get controller index for our ControllerDevice enum - * @param device The controller device type (Primary/Secondary) - * @param isLeftHanded Whether the user is left-handed (affects primary/secondary mapping) - * @return Tracked device index or vr::k_unTrackedDeviceIndexInvalid if not found - * - * This function maps our ControllerDevice enum to actual OpenVR tracked device indices, - * taking into account user handedness for primary/secondary controller assignment. - */ - vr::TrackedDeviceIndex_t GetControllerIndexForDevice(ControllerDevice device, bool isLeftHanded); - - /** - * @brief Get controller world matrix from OpenVR pose - * @param index The tracked device index of the controller - * @param out Output array[3][4] for the transformation matrix - * @return true if the pose was valid and matrix was retrieved successfully - * - * This function retrieves the current world-space transformation matrix - * for a VR controller in a format compatible with OpenVR matrix operations. - */ - bool GetControllerWorldMatrix(vr::TrackedDeviceIndex_t index, float out[3][4]); - - /** - * @brief OpenComposite-compatible function to get device poses - * @param eOrigin The tracking universe origin - * @param fPredictedSecondsToPhotonsFromNow Prediction time for poses - * @param pTrackedDevicePoseArray Output array for tracked device poses - * @param unTrackedDevicePoseArrayCount Number of poses to retrieve - * @return true if poses were retrieved successfully - * - * This function provides a compatibility layer for getting device poses that works - * with both standard OpenVR and OpenComposite. It uses the compositor interface - * when available for better OpenComposite compatibility. - */ - bool GetDeviceToAbsoluteTrackingPoseCompatible(vr::ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, vr::TrackedDevicePose_t* pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount); - - //============================================================================= - // MATRIX CONVERSION UTILITIES - //============================================================================= - - /** - * @brief Converts an OpenVR HmdMatrix34_t to a DirectX SimpleMath Matrix - * @param m The OpenVR 3x4 transformation matrix to convert - * @return DirectX SimpleMath 4x4 Matrix with bottom row set to [0,0,0,1] - * - * This function converts between OpenVR's 3x4 transformation matrix format - * and DirectX SimpleMath's 4x4 matrix format, adding the implicit bottom row. - */ - inline Matrix HmdMatrix34ToMatrix(const vr::HmdMatrix34_t& m) - { - // OpenVR matrices are row-major but designed for column-vector math (M * v). - // DirectX SimpleMath uses row-vector math (v * M). - // We need to transpose the rotation and move translation to the bottom row. - return Matrix( - m.m[0][0], m.m[1][0], m.m[2][0], 0.0f, - m.m[0][1], m.m[1][1], m.m[2][1], 0.0f, - m.m[0][2], m.m[1][2], m.m[2][2], 0.0f, - m.m[0][3], m.m[1][3], m.m[2][3], 1.0f); - } - - /** - * @brief Converts a DirectX SimpleMath Matrix to an OpenVR HmdMatrix34_t - * @param mat The DirectX SimpleMath 4x4 matrix to convert - * @return OpenVR 3x4 transformation matrix (bottom row is discarded) - * - * This function converts from DirectX SimpleMath's 4x4 matrix format - * to OpenVR's 3x4 transformation matrix format, discarding the bottom row. - */ - inline vr::HmdMatrix34_t MatrixToHmdMatrix34(const Matrix& mat) - { - vr::HmdMatrix34_t m{}; - // Transpose rotation back (row-vector → column-vector) and extract translation from row 4 - m.m[0][0] = mat._11; - m.m[0][1] = mat._21; - m.m[0][2] = mat._31; - m.m[0][3] = mat._41; - m.m[1][0] = mat._12; - m.m[1][1] = mat._22; - m.m[1][2] = mat._32; - m.m[1][3] = mat._42; - m.m[2][0] = mat._13; - m.m[2][1] = mat._23; - m.m[2][2] = mat._33; - m.m[2][3] = mat._43; - return m; - } - - /** - * @brief Converts a raw 3x4 float array to an OpenVR HmdMatrix34_t - * @param m Raw 3x4 float array in [row][column] format - * @return OpenVR HmdMatrix34_t structure - * - * This function provides a convenient way to convert raw transformation - * matrices from other APIs into OpenVR's matrix format. - */ - inline vr::HmdMatrix34_t Float3x4ToHmdMatrix34(const float m[3][4]) - { - vr::HmdMatrix34_t mat; - for (int i = 0; i < 3; ++i) - for (int j = 0; j < 4; ++j) - mat.m[i][j] = m[i][j]; - return mat; - } - - /** - * @brief Gets the Inter-Pupillary Distance (IPD) from the HMD - * @return IPD in meters, or 0.064 (average human IPD) as fallback - * - * Tries multiple methods to determine IPD: - * 1. Query Prop_UserIpdMeters_Float property directly - * 2. Calculate from eye-to-head transforms - * 3. Fallback to average human IPD (64mm) - */ - inline float GetIPDFromHMD() - { - RE::BSOpenVR* openvr = RE::BSOpenVR::GetSingleton(); - if (!openvr || !openvr->vrSystem) - return 0.064f; // Default fallback IPD in meters - - // Method 1: Query IPD property directly - vr::ETrackedPropertyError error = vr::TrackedProp_UnknownProperty; - float ipd = openvr->vrSystem->GetFloatTrackedDeviceProperty( - vr::k_unTrackedDeviceIndex_Hmd, - vr::Prop_UserIpdMeters_Float, - &error); - - if (error == vr::TrackedProp_Success && ipd > 0.0f && ipd < 0.1f) { - return ipd; - } - - // Method 2: Calculate from eye-to-head transforms - vr::HmdMatrix34_t leftEye = openvr->vrSystem->GetEyeToHeadTransform(vr::Eye_Left); - vr::HmdMatrix34_t rightEye = openvr->vrSystem->GetEyeToHeadTransform(vr::Eye_Right); - - // Eye separation is in the X translation component (m[0][3]) - float eyeSeparation = std::abs(leftEye.m[0][3] - rightEye.m[0][3]); - - if (eyeSeparation > 0.0f && eyeSeparation < 0.1f) { - return eyeSeparation; - } - - // Fallback to average human IPD - return 0.064f; - } - -} \ No newline at end of file diff --git a/src/XSEPlugin.cpp b/src/XSEPlugin.cpp index a17f7e0751..5555268526 100644 --- a/src/XSEPlugin.cpp +++ b/src/XSEPlugin.cpp @@ -146,10 +146,6 @@ bool Load() return true; } - if (REL::Module::IsVR()) { - REL::IDDatabase::get().IsVRAddressLibraryAtLeastVersion("0.207.0", true); - } - auto privateProfileRedirectorVersion = Util::GetDllVersion(L"Data/SKSE/Plugins/PrivateProfileRedirector.dll"); if (privateProfileRedirectorVersion.has_value() && privateProfileRedirectorVersion.value().compare(REL::Version(0, 6, 2)) == std::strong_ordering::less) { stl::report_and_fail("Old version of PrivateProfileRedirector detected, 0.6.2+ required if using it."sv); @@ -203,15 +199,8 @@ bool Load() errors.push_back(errorMessage); }; - // Engine Fixes: VR accepts either EngineFixesVR.dll or the EngineFixes.dll NG - if (REL::Module::IsVR()) { - if (!LoadLibrary(L"Data/SKSE/Plugins/EngineFixesVR.dll") && !LoadLibrary(L"Data/SKSE/Plugins/EngineFixes.dll")) { - pushMissingDllError("EngineFixesVR.dll or EngineFixes.dll"); - } - } else { - if (!LoadLibrary(L"Data/SKSE/Plugins/EngineFixes.dll")) { - pushMissingDllError(stl::utf16_to_utf8(L"Data/SKSE/Plugins/EngineFixes.dll").value_or(""s)); - } + if (!LoadLibrary(L"Data/SKSE/Plugins/EngineFixes.dll")) { + pushMissingDllError(stl::utf16_to_utf8(L"Data/SKSE/Plugins/EngineFixes.dll").value_or(""s)); } // Empty RequiredDLLs array, if necessary we can add a dll here in the future without needing to modify the plugin loading logic. From 9cc8c6e6d67f101b3d6e8c28a65daaec075d96b7 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 20:58:56 +0100 Subject: [PATCH 02/20] fix(shaders): remove stale eyeIndex args from VolumetricShadows calls GetVSMShadow3D and GetVSMShadow2D had their eyeIndex parameter removed but two call sites in ShadowSampling.hlsli still passed a literal 0 as that argument, shifting it onto the out param and causing X3025 (l-value specifies const object) at runtime. Co-Authored-By: Claude Sonnet 4.6 --- package/Shaders/Common/ShadowSampling.hlsli | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/Shaders/Common/ShadowSampling.hlsli b/package/Shaders/Common/ShadowSampling.hlsli index 076970839b..8397d5333b 100644 --- a/package/Shaders/Common/ShadowSampling.hlsli +++ b/package/Shaders/Common/ShadowSampling.hlsli @@ -108,7 +108,7 @@ namespace ShadowSampling #if defined(VOLUMETRIC_SHADOWS) if (HasDirectionalShadows()) { float vsmSurfaceShadow; - float shadow = VolumetricShadows::GetVSMShadow3D(startPosition, endPosition, noise, sampleCount, 0, vsmSurfaceShadow); + float shadow = VolumetricShadows::GetVSMShadow3D(startPosition, endPosition, noise, sampleCount, vsmSurfaceShadow); surfaceShadow *= vsmSurfaceShadow; return worldShadow * shadow; } @@ -127,7 +127,7 @@ namespace ShadowSampling } #if defined(VOLUMETRIC_SHADOWS) - float shadow = VolumetricShadows::GetVSMShadow2D(worldPosition, 0, detailedShadow); + float shadow = VolumetricShadows::GetVSMShadow2D(worldPosition, detailedShadow); return shadow; #else detailedShadow = 1.0; From 1221fe4b2f16d27bc14697a85d1869023aaa3b77 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:02:24 +0100 Subject: [PATCH 03/20] fix(shaders): remove stale eyeIndex arg from GetWaterData call Lighting.hlsl was calling SharedData::GetWaterData with a spurious second argument (the old eyeIndex=0) after the parameter was removed. Co-Authored-By: Claude Sonnet 4.6 --- package/Shaders/Lighting.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 5999972e74..2f01b85b87 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -2416,7 +2416,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # endif - float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz, 0); + float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; float waterRoughnessSpecular = 1; From 7caa62564565f1c40c4e783c864d3293d734ad27 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:06:32 +0100 Subject: [PATCH 04/20] fix(shaders): remove remaining stale eyeIndex args from call sites Remove spurious trailing 0 (old eyeIndex) from calls to: - ShadowSampling::GetWorldShadow (Lighting, RunGrass, ISVolumetricLightingGenerateCS) - ShadowSampling::Get3DFilteredShadow (Water) - MotionBlur::GetSSMotionVector (RunGrass) - ScreenSpaceShadows::GetScreenSpaceShadow (Lighting, RunGrass) - Hair::HairSelfShadow (Lighting) Co-Authored-By: Claude Sonnet 4.6 --- package/Shaders/ISVolumetricLightingGenerateCS.hlsl | 2 +- package/Shaders/Lighting.hlsl | 6 +++--- package/Shaders/RunGrass.hlsl | 12 ++++++------ package/Shaders/Water.hlsl | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package/Shaders/ISVolumetricLightingGenerateCS.hlsl b/package/Shaders/ISVolumetricLightingGenerateCS.hlsl index ec34b546c2..6283ddc9cd 100644 --- a/package/Shaders/ISVolumetricLightingGenerateCS.hlsl +++ b/package/Shaders/ISVolumetricLightingGenerateCS.hlsl @@ -94,7 +94,7 @@ cbuffer PerTechnique : register(b0) float shadowContribution = noShadow; # if defined(TERRAIN_SHADOWS) || defined(CLOUD_SHADOWS) - shadowContribution *= sqrt(ShadowSampling::GetWorldShadow(positionWS.xyz, PosAdjust[0], 0)); + shadowContribution *= sqrt(ShadowSampling::GetWorldShadow(positionWS.xyz, PosAdjust[0])); # endif float vl = shadowContribution * densityContribution * phaseContribution; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 2f01b85b87..4b0ab18e9d 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -2545,7 +2545,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) // Apply world shadow (terrain shadows, cloud shadows) directly to light color if (inWorld || inReflection) - dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, 0); + dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); float dirLightAngle = dot(worldNormal.xyz, DirLightDirection.xyz); @@ -2580,7 +2580,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(SCREEN_SPACE_SHADOWS) && defined(DEFERRED) if (!SharedData::InInterior && dirLightAngle >= 0.0) - dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, 0); + dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise); # endif # if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) @@ -2645,7 +2645,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) dirLightContext = CreateDirectLightingContext(worldNormal.xyz, vertexNormal.xyz, viewDirection, DirLightDirection, dirLightColor, dirDetailedShadow, dirSoftShadow); # if defined(HAIR) && defined(CS_HAIR) if (SharedData::hairSpecularSettings.Enabled) { - float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, DirLightDirection, screenNoise, 0); + float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, DirLightDirection, screenNoise); dirLightContext.hairShadow = hairShadow; } # endif diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 5de8f4a50c..15c52b3bd0 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -444,7 +444,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float4 specColor = TexNormalSampler.SampleBias(SampNormalSampler, input.TexCoord.xy, SharedData::MipBias); # endif - psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, 0); + psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); float3 viewDirection = -normalize(input.WorldPosition.xyz); float3 normal = normalize(input.VertexNormal.xyz); @@ -519,7 +519,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) // Apply world shadow (terrain shadows, cloud shadows) directly to light color if (!SharedData::InInterior) - dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, 0); + dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); float dirDetailedShadow = 1.0; @@ -528,7 +528,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(SCREEN_SPACE_SHADOWS) if (!SharedData::InInterior && dirLightAngle >= 0.0) - dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise, 0); + dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise); # endif // SCREEN_SPACE_SHADOWS float3 diffuseColor = 0; @@ -748,7 +748,7 @@ PS_OUTPUT main(PS_INPUT input) // Apply world shadow (terrain shadows, cloud shadows) directly to light color if (!SharedData::InInterior) - dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz, 0); + dirLightColor *= ShadowSampling::GetWorldShadow(input.WorldPosition.xyz, FrameBuffer::CameraPosAdjust.xyz); float dirDetailedShadow = 1.0; @@ -757,7 +757,7 @@ PS_OUTPUT main(PS_INPUT input) # if defined(SCREEN_SPACE_SHADOWS) if (!SharedData::InInterior) - dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise, 0); + dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.HPosition.xyz, screenUV, screenNoise); # endif // SCREEN_SPACE_SHADOWS float3 diffuseColor = dirLightColor * dirDetailedShadow; @@ -855,7 +855,7 @@ PS_OUTPUT main(PS_INPUT input) psout.Diffuse.w = 1; - psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, 0); + psout.MotionVectors = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition); psout.Normal.xy = GBuffer::EncodeNormal(FrameBuffer::WorldToView(normal, false)); psout.Normal.zw = 0; diff --git a/package/Shaders/Water.hlsl b/package/Shaders/Water.hlsl index a5b5e51889..52c1cdabe9 100644 --- a/package/Shaders/Water.hlsl +++ b/package/Shaders/Water.hlsl @@ -1073,7 +1073,7 @@ PS_OUTPUT main(PS_INPUT input) DiffuseOutput diffuseOutput = GetWaterDiffuseColor(input, normal, viewDirection, distanceMul, depthControl.y, fresnel, viewPosition, depth); float surfaceShadow; - float dirShadow = ShadowSampling::Get3DFilteredShadow(input.WPosition.xyz, diffuseOutput.refractedViewDirection, input.HPosition.xy, 0, surfaceShadow); + float dirShadow = ShadowSampling::Get3DFilteredShadow(input.WPosition.xyz, diffuseOutput.refractedViewDirection, input.HPosition.xy, surfaceShadow); float3 dirColor; float3 ambientColor; From 303714abee43940bf5a6a718d70d16ea7ea4bb8d Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:09:58 +0100 Subject: [PATCH 05/20] fix(shaders): remove stale eyeIndex arg from GetLightingShadow call Lighting.hlsl passed a spurious 0 before the out param dirVSMDetailedShadow. Co-Authored-By: Claude Sonnet 4.6 --- package/Shaders/Lighting.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 4b0ab18e9d..683a58b342 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -2563,7 +2563,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(VOLUMETRIC_SHADOWS) if (inWorld && !inReflection && ShadowSampling::HasDirectionalShadows()) - dirSoftShadow = ShadowSampling::GetLightingShadow(input.WorldPosition.xyz, 0, dirVSMDetailedShadow); + dirSoftShadow = ShadowSampling::GetLightingShadow(input.WorldPosition.xyz, dirVSMDetailedShadow); # endif float dirDetailedShadow = 1.0; From 15c1b848dee2895d3a0b45cc3d6ffa4200a73345 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:12:28 +0100 Subject: [PATCH 06/20] fix(shaders): remove stale eyeIndex args from HairSelfShadow point light calls Two additional HairSelfShadow calls in the point light loop in Lighting.hlsl still had the old eyeIndex=0 argument. Co-Authored-By: Claude Sonnet 4.6 --- package/Shaders/Lighting.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 683a58b342..f44493743a 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -2708,7 +2708,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) pointLightContext = CreateDirectLightingContext(worldNormal.xyz, vertexNormal.xyz, viewDirection, normalizedLightDirection, lightColor, lightShadow, lightShadow); # if defined(HAIR) && defined(CS_HAIR) if (SharedData::hairSpecularSettings.Enabled) { - float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise, 0); + float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise); pointLightContext.hairShadow = hairShadow; } # endif @@ -2832,7 +2832,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) pointLightContext = CreateDirectLightingContext(worldNormal.xyz, vertexNormal.xyz, viewDirection, normalizedLightDirection, lightColor, pointLightShadow, pointLightShadow); # if defined(HAIR) && defined(CS_HAIR) if (SharedData::hairSpecularSettings.Enabled) { - float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise, 0); + float hairShadow = Hair::HairSelfShadow(input.WorldPosition.xyz, normalizedLightDirection, screenNoise); pointLightContext.hairShadow = hairShadow; } # endif From 5aecf3c49d77b8246ba520f55b47e8465e7d87f0 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:19:20 +0100 Subject: [PATCH 07/20] refactor(shaders): remove remaining VR dead params and HMD shader - FrameBuffer.hlsli: remove unused 'stereo' default parameter from ClampDynamicResolutionAdjustedScreenPosition and both overloads of GetDynamicResolutionAdjustedScreenPosition - Water.hlsl: remove unused 'a_useVR' default parameter from GetScreenDepthWater - Delete ClearHMDMaskCS.hlsl (VR-only HMD mask compute shader with no C++ callers) Co-Authored-By: Claude Sonnet 4.6 --- .../Shaders/Upscaling/ClearHMDMaskCS.hlsl | 23 ------------------- package/Shaders/Common/FrameBuffer.hlsli | 12 ++++------ package/Shaders/Water.hlsl | 2 +- 3 files changed, 6 insertions(+), 31 deletions(-) delete mode 100644 features/Upscaling/Shaders/Upscaling/ClearHMDMaskCS.hlsl diff --git a/features/Upscaling/Shaders/Upscaling/ClearHMDMaskCS.hlsl b/features/Upscaling/Shaders/Upscaling/ClearHMDMaskCS.hlsl deleted file mode 100644 index df107d9175..0000000000 --- a/features/Upscaling/Shaders/Upscaling/ClearHMDMaskCS.hlsl +++ /dev/null @@ -1,23 +0,0 @@ -// Zeros color in the HMD hidden area per eye. -// Prevents DLSS/FSR from temporally accumulating the engine's sky/ambient clear color -// into visible pixels during head movement ("light blue border" ghosting). -// depth == 0.0 is the unrendered/hidden area value (Skyrim reversed-Z: far plane = 0). -// DepthIn is the combined stereo depth buffer; DepthOffsetX selects the eye's half. -// ColorInOut is the isolated per-eye buffer; ColorOffsetX is always 0. - -cbuffer ClearHMDMaskCB : register(b0) -{ - uint DepthOffsetX; // X offset into combined stereo depth (0 = left, eyeWidth = right) - uint ColorOffsetX; // X offset into color target (always 0 for per-eye buffers) - uint pad0; - uint pad1; -}; - -Texture2D DepthIn : register(t0); -RWTexture2D ColorInOut : register(u0); - -[numthreads(8, 8, 1)] void main(uint3 dispatchID : SV_DispatchThreadID) { - // Read from stereo depth, write to potentially stereo color - if (DepthIn[dispatchID.xy + uint2(DepthOffsetX, 0)] == 0.0) - ColorInOut[dispatchID.xy + uint2(ColorOffsetX, 0)] = float4(0.0, 0.0, 0.0, 0.0); -} diff --git a/package/Shaders/Common/FrameBuffer.hlsli b/package/Shaders/Common/FrameBuffer.hlsli index 7113da11df..a82adafd78 100644 --- a/package/Shaders/Common/FrameBuffer.hlsli +++ b/package/Shaders/Common/FrameBuffer.hlsli @@ -38,10 +38,9 @@ namespace FrameBuffer * * @param[in] screenPositionDR UVs already expressed in dynamic-resolution space. * @param[in] screenPosition Original normalized screen UVs. - * @param[in] stereo Unused, kept for call-site compatibility. Default is 1. * @return Clamped dynamic-resolution UVs. */ - float2 ClampDynamicResolutionAdjustedScreenPosition(float2 screenPositionDR, float2 screenPosition, uint stereo = 1) + float2 ClampDynamicResolutionAdjustedScreenPosition(float2 screenPositionDR, float2 screenPosition) { float2 minValue = 0; float2 maxValue = float2(DynamicResolutionParams2.z, DynamicResolutionParams1.y); @@ -67,13 +66,12 @@ namespace FrameBuffer * `ClampDynamicResolutionAdjustedScreenPosition(...)` instead. * * @param[in] screenPosition Normalized screen UVs in non-DR space. - * @param[in] stereo Unused, kept for call-site compatibility. Default is 1. * @return Dynamic-resolution-adjusted and clamped UVs. */ - float2 GetDynamicResolutionAdjustedScreenPosition(float2 screenPosition, uint stereo = 1) + float2 GetDynamicResolutionAdjustedScreenPosition(float2 screenPosition) { float2 screenPositionDR = DynamicResolutionParams1.xy * screenPosition; - return ClampDynamicResolutionAdjustedScreenPosition(screenPositionDR, screenPosition, stereo); + return ClampDynamicResolutionAdjustedScreenPosition(screenPositionDR, screenPosition); } /** @@ -81,9 +79,9 @@ namespace FrameBuffer * * Applies dynamic-resolution adjustment/clamp to XY and preserves Z unchanged. */ - float3 GetDynamicResolutionAdjustedScreenPosition(float3 screenPositionDR, uint stereo = 1) + float3 GetDynamicResolutionAdjustedScreenPosition(float3 screenPositionDR) { - return float3(GetDynamicResolutionAdjustedScreenPosition(screenPositionDR.xy, stereo), screenPositionDR.z); + return float3(GetDynamicResolutionAdjustedScreenPosition(screenPositionDR.xy), screenPositionDR.z); } /** diff --git a/package/Shaders/Water.hlsl b/package/Shaders/Water.hlsl index 52c1cdabe9..9b071378fe 100644 --- a/package/Shaders/Water.hlsl +++ b/package/Shaders/Water.hlsl @@ -824,7 +824,7 @@ float3 GetWaterSpecularColor(PS_INPUT input, float3 normal, float3 viewDirection return reflectionColor; } -float GetScreenDepthWater(float2 screenPosition, uint a_useVR = 0) +float GetScreenDepthWater(float2 screenPosition) { float depth = DepthTex.Load(float3(screenPosition, 0)).x; return (CameraDataWater.w / (-depth * CameraDataWater.z + CameraDataWater.x)); From 8e66d4bccffcd8d614528ab9153f64b1af7670fc Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:21:41 +0100 Subject: [PATCH 08/20] fix(shaders): remove stale eyeIndex args and update i18n - VolumetricFogConservativeDepthCS.hlsl: remove stale ', 0' eyeIndex args from ConvertUVToSampleCoord calls - en.json: regenerate to remove 3 deleted VR upscaling translation keys (feature.upscaling.native_inputs, upscaling_intermediates, view_resize) Co-Authored-By: Claude Sonnet 4.6 --- .../VolumetricFogConservativeDepthCS.hlsl | 4 ++-- package/SKSE/Plugins/CommunityShaders/Translations/en.json | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl index b2e7fb3943..f7f8cfad61 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogConservativeDepthCS.hlsl @@ -12,8 +12,8 @@ RWTexture2D ConservativeDepthTexture : register(u0); float2 eyeUVMin = saturate(volumeUVMin); float2 eyeUVMax = saturate(volumeUVMax); - int2 minCoord = SharedData::ConvertUVToSampleCoord(min(eyeUVMin, eyeUVMax), 0).xy; - int2 maxCoord = SharedData::ConvertUVToSampleCoord(max(eyeUVMin, eyeUVMax), 0).xy - 1; + int2 minCoord = SharedData::ConvertUVToSampleCoord(min(eyeUVMin, eyeUVMax)).xy; + int2 maxCoord = SharedData::ConvertUVToSampleCoord(max(eyeUVMin, eyeUVMax)).xy - 1; maxCoord = max(maxCoord, minCoord); int2 bufferMax = int2(SharedData::BufferDim.xy) - 1; diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/en.json b/package/SKSE/Plugins/CommunityShaders/Translations/en.json index 82afef5350..59313a5df7 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/en.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/en.json @@ -1355,7 +1355,6 @@ "feature.upscaling.method_none": "None", "feature.upscaling.method_taa": "TAA", "feature.upscaling.name": "Upscaling", - "feature.upscaling.native_inputs": "Native Inputs", "feature.upscaling.nvidia_reflex": "NVIDIA Reflex", "feature.upscaling.preset_balanced": "Balanced", "feature.upscaling.preset_dlaa": "DLAA", @@ -1370,14 +1369,12 @@ "feature.upscaling.streamline_logging_restart_note": "Changing this requires a restart to take effect.", "feature.upscaling.streamline_logging_tooltip": "Streamline logging controls the verbosity of NVIDIA Streamline backend logs. Useful for debugging issues with DLSS/DLSS-G.", "feature.upscaling.upscale_preset": "Upscale Preset", - "feature.upscaling.upscaling_intermediates": "Upscaling Intermediates", "feature.upscaling.use_fps_limit": "Use FPS Limit", "feature.upscaling.use_fps_limit_tooltip_1": "Uses Reflex's internal FPS cap for steadier frametimes.", "feature.upscaling.use_fps_limit_tooltip_2": "Can lower latency versus uncapped rendering.", "feature.upscaling.use_markers_to_optimize": "Use Markers To Optimize", "feature.upscaling.use_markers_to_optimize_tooltip_1": "Uses frame markers for tighter Reflex timing.", "feature.upscaling.use_markers_to_optimize_tooltip_2": "Try On first; turn Off if it causes stutter on your setup.", - "feature.upscaling.view_resize": "View Resize", "feature.volumetric_lighting.description": "Volumetric Lighting creates realistic light scattering effects through fog, dust, and atmospheric particles.\nThis adds dramatic god rays and atmospheric depth to both interior and exterior environments.", "feature.volumetric_lighting.enable_exteriors": "Enable Volumetric Lighting in Exteriors", "feature.volumetric_lighting.enable_interiors": "Enable Volumetric Lighting in Interiors", From 8c72598dd85537cd6d1eaf71c4b847969504b51a Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:22:45 +0100 Subject: [PATCH 09/20] chore(i18n): sort zh_CN.json to match en.json key order Co-Authored-By: Claude Sonnet 4.6 --- .../SKSE/Plugins/CommunityShaders/Translations/zh_CN.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json index 5258198f85..c54acada9f 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json @@ -1354,7 +1354,6 @@ "feature.upscaling.method_none": "无", "feature.upscaling.method_taa": "TAA", "feature.upscaling.name": "超分辨率", - "feature.upscaling.native_inputs": "原生输入", "feature.upscaling.nvidia_reflex": "NVIDIA Reflex", "feature.upscaling.preset_balanced": "平衡", "feature.upscaling.preset_dlaa": "DLAA", @@ -1369,14 +1368,12 @@ "feature.upscaling.streamline_logging_restart_note": "更改此设置需要重启才能生效。", "feature.upscaling.streamline_logging_tooltip": "Streamline日志记录控制NVIDIA Streamline后端日志的详细程度。对于调试DLSS/DLSS-G问题很有用。", "feature.upscaling.upscale_preset": "升频预设", - "feature.upscaling.upscaling_intermediates": "升频中间结果", "feature.upscaling.use_fps_limit": "使用FPS限制", "feature.upscaling.use_fps_limit_tooltip_1": "使用Reflex内部FPS上限以获得更稳定的帧时间。", "feature.upscaling.use_fps_limit_tooltip_2": "相比无上限渲染可以降低延迟。", "feature.upscaling.use_markers_to_optimize": "使用标记优化", "feature.upscaling.use_markers_to_optimize_tooltip_1": "使用帧标记以实现更紧密的Reflex计时。", "feature.upscaling.use_markers_to_optimize_tooltip_2": "先尝试开启;如果在您的设置上造成卡顿则关闭。", - "feature.upscaling.view_resize": "视图调整大小", "feature.volumetric_lighting.description": "体积光照通过雾、尘埃和大气粒子创造逼真的光散射效果。\n为室内和室外环境添加戏剧化的上帝射线和大气深度。", "feature.volumetric_lighting.enable_exteriors": "在室外启用体积光照", "feature.volumetric_lighting.enable_interiors": "在室内启用体积光照", @@ -2077,5 +2074,8 @@ "ui.copy": "复制", "ui.dont_ask_again": "不再提示", "ui.search": "搜索...", - "ui.search_features": "搜索功能..." + "ui.search_features": "搜索功能...", + "feature.upscaling.native_inputs": "原生输入", + "feature.upscaling.upscaling_intermediates": "升频中间结果", + "feature.upscaling.view_resize": "视图调整大小" } From 8c405ddd9ffdbd38bdc566fe845345b373e239d5 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:23:41 +0100 Subject: [PATCH 10/20] chore(i18n): remove deleted VR upscaling keys from zh_CN.json Co-Authored-By: Claude Sonnet 4.6 --- .../SKSE/Plugins/CommunityShaders/Translations/zh_CN.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json index c54acada9f..22b51f6721 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json @@ -2074,8 +2074,5 @@ "ui.copy": "复制", "ui.dont_ask_again": "不再提示", "ui.search": "搜索...", - "ui.search_features": "搜索功能...", - "feature.upscaling.native_inputs": "原生输入", - "feature.upscaling.upscaling_intermediates": "升频中间结果", - "feature.upscaling.view_resize": "视图调整大小" + "ui.search_features": "搜索功能..." } From 7fc735e43c3828b6bea08184792366c1771cc9c5 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:39:52 +0100 Subject: [PATCH 11/20] refactor: remove dead VR eye loop and eyeCount remnants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LightLimitFix.h: remove unused 'eyeCount' member (was used to loop over VR eyes, always 1 since VR removal) - Upscaling.h/cpp: remove eyeOffsetX from UpscalingDataCB struct and unwrap the numEyes=1 loop — renderWidth is now used directly - EncodeTexturesCS.hlsl: remove EyeOffsetX cbuffer field and replace all srcCoord uses with dispatchID.xy directly - docs/new-feature-template/NewFeatureReadme.md: update cross-platform note from SE/AE/VR to SE/AE, remove VR checklist item Co-Authored-By: Claude Sonnet 4.6 --- docs/new-feature-template/NewFeatureReadme.md | 3 +- .../Shaders/Upscaling/EncodeTexturesCS.hlsl | 24 ++++------- src/Features/LightLimitFix.h | 1 - src/Features/Upscaling.cpp | 41 ++++++++----------- src/Features/Upscaling.h | 3 +- 5 files changed, 28 insertions(+), 44 deletions(-) diff --git a/docs/new-feature-template/NewFeatureReadme.md b/docs/new-feature-template/NewFeatureReadme.md index 4d420b9d94..18c72cd546 100644 --- a/docs/new-feature-template/NewFeatureReadme.md +++ b/docs/new-feature-template/NewFeatureReadme.md @@ -79,7 +79,7 @@ The build system automatically handles: - Settings persistence (JSON serialization) - UI menu integration - Feature lifecycle management -- Cross-platform builds (SE/AE/VR) +- Cross-platform builds (SE/AE) Build with: `./BuildRelease.bat ALL` @@ -89,5 +89,4 @@ Build with: `./BuildRelease.bat ALL` - [ ] Settings save/load correctly - [ ] Shaders compile without errors - [ ] Feature works in-game -- [ ] VR compatibility (if enabled) - [ ] No build errors diff --git a/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl b/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl index 4053b46106..94d48eb554 100644 --- a/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl +++ b/features/Upscaling/Shaders/Upscaling/EncodeTexturesCS.hlsl @@ -3,8 +3,7 @@ cbuffer UpscalingData : register(b0) { float2 TrueSamplingDim; - uint EyeOffsetX; - uint pad0; + float2 pad0; }; Texture2D TAAMask : register(t0); @@ -24,18 +23,15 @@ RWTexture2D DepthOutput : register(u3); if (any(dispatchID.xy >= uint2(TrueSamplingDim))) return; - // All source reads use offset; outputs are 0-based - uint2 srcCoord = dispatchID.xy + uint2(EyeOffsetX, 0); - - float2 taaMask = TAAMask[srcCoord]; - float transparencyCompositionMask = NormalsWaterMask[srcCoord].z; + float2 taaMask = TAAMask[dispatchID.xy]; + float transparencyCompositionMask = NormalsWaterMask[dispatchID.xy].z; #if defined(DLSS) - float depth = DepthMask[srcCoord]; + float depth = DepthMask[dispatchID.xy]; float nearFactor = smoothstep(4096.0 * 2.5, 0.0, SharedData::GetScreenDepth(depth)); // Find longest motion vector in 5x5 neighborhood - float2 motionVector = MotionVectorMask[srcCoord]; + float2 motionVector = MotionVectorMask[dispatchID.xy]; float2 longestMotionVector = motionVector; float maxMotionLengthSq = dot(motionVector, motionVector); @@ -49,13 +45,11 @@ RWTexture2D DepthOutput : register(u3); if (any(samplePos < 0) || any(samplePos >= int2(TrueSamplingDim))) continue; - // Source read uses offset - int2 srcPos = samplePos + int2(EyeOffsetX, 0); - float neighborDepth = DepthMask[srcPos]; + float neighborDepth = DepthMask[samplePos]; // Take neighbor if it's longer AND closer if (neighborDepth < depth) { - float2 neighborMotionVector = MotionVectorMask[srcPos]; + float2 neighborMotionVector = MotionVectorMask[samplePos]; // Square motion vector for length float motionLengthSq = dot(neighborMotionVector, neighborMotionVector); @@ -74,11 +68,11 @@ RWTexture2D DepthOutput : register(u3); #if defined(DEPTH_OUTPUT) // Copy depth as R32_FLOAT so FSR DX11 backend receives a typed format. // The raw depth resource is R24G8_TYPELESS which maps to FFX_SURFACE_FORMAT_UNKNOWN. - DepthOutput[dispatchID.xy] = DepthMask[srcCoord]; + DepthOutput[dispatchID.xy] = DepthMask[dispatchID.xy]; #endif float reactiveMask = taaMask.x * 0.1 + taaMask.y; ReactiveMask[dispatchID.xy] = reactiveMask; TransparencyCompositionMask[dispatchID.xy] = transparencyCompositionMask; -} \ No newline at end of file +} diff --git a/src/Features/LightLimitFix.h b/src/Features/LightLimitFix.h index 37c6c34110..fa3cc5ad82 100644 --- a/src/Features/LightLimitFix.h +++ b/src/Features/LightLimitFix.h @@ -115,7 +115,6 @@ struct LightLimitFix : OverlayFeature ConstantBuffer* strictLightDataCB = nullptr; - int eyeCount = 1; bool previousEnableLightsVisualisation = settings.EnableLightsVisualisation; bool currentEnableLightsVisualisation = settings.EnableLightsVisualisation; diff --git a/src/Features/Upscaling.cpp b/src/Features/Upscaling.cpp index 11df01b9ed..45c0ef2ce6 100644 --- a/src/Features/Upscaling.cpp +++ b/src/Features/Upscaling.cpp @@ -1380,36 +1380,29 @@ void Upscaling::Upscale() auto& depth = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); - uint32_t numEyes = 1; - uint32_t eyeRenderWidth = (uint32_t)(renderSize.x / numEyes); - uint32_t eyeRenderHeight = (uint32_t)renderSize.y; + uint32_t renderWidth = (uint32_t)renderSize.x; + uint32_t renderHeight = (uint32_t)renderSize.y; - // The shader applies EyeOffsetX to sample the correct half. ID3D11ShaderResourceView* views[4] = { temporalAAMask.SRV, normals.SRV, motionVector.SRV, depth.depthSRV }; context->CSSetShaderResources(0, ARRAYSIZE(views), views); context->CSSetShader(GetEncodeTexturesCS(), nullptr, 0); - for (uint32_t i = 0; i < numEyes; ++i) { - uint32_t offsetX = i * eyeRenderWidth; - - UpscalingDataCB upscalingData; - upscalingData.trueSamplingDim = float2((float)eyeRenderWidth, (float)eyeRenderHeight); - upscalingData.eyeOffsetX = offsetX; - upscalingDataCB->Update(upscalingData); - auto upscalingBuffer = upscalingDataCB->CB(); - context->CSSetConstantBuffers(0, 1, &upscalingBuffer); - - // u2 (MotionVectorOutput): DLSS only — 5x5 dilated MVec for ghosting reduction. - ID3D11UnorderedAccessView* uavs[4] = { - reactiveMaskTexture->uav.get(), - transparencyCompositionMaskTexture->uav.get(), - (upscaleMethod == UpscaleMethod::kDLSS) ? motionVectorCopyTexture->uav.get() : nullptr, - nullptr - }; - context->CSSetUnorderedAccessViews(0, ARRAYSIZE(uavs), uavs, nullptr); + UpscalingDataCB upscalingData; + upscalingData.trueSamplingDim = float2((float)renderWidth, (float)renderHeight); + upscalingDataCB->Update(upscalingData); + auto upscalingBuffer = upscalingDataCB->CB(); + context->CSSetConstantBuffers(0, 1, &upscalingBuffer); + + // u2 (MotionVectorOutput): DLSS only — 5x5 dilated MVec for ghosting reduction. + ID3D11UnorderedAccessView* uavs[4] = { + reactiveMaskTexture->uav.get(), + transparencyCompositionMaskTexture->uav.get(), + (upscaleMethod == UpscaleMethod::kDLSS) ? motionVectorCopyTexture->uav.get() : nullptr, + nullptr + }; + context->CSSetUnorderedAccessViews(0, ARRAYSIZE(uavs), uavs, nullptr); - context->Dispatch((eyeRenderWidth + 7) / 8, (eyeRenderHeight + 7) / 8, 1); - } + context->Dispatch((renderWidth + 7) / 8, (renderHeight + 7) / 8, 1); ID3D11ShaderResourceView* nullViews[4] = { nullptr, nullptr, nullptr, nullptr }; context->CSSetShaderResources(0, ARRAYSIZE(nullViews), nullViews); diff --git a/src/Features/Upscaling.h b/src/Features/Upscaling.h index 5d9055ac26..3b179c244d 100644 --- a/src/Features/Upscaling.h +++ b/src/Features/Upscaling.h @@ -80,8 +80,7 @@ struct Upscaling : Feature struct UpscalingDataCB { float2 trueSamplingDim; - uint eyeOffsetX; - uint pad0; + float2 pad0; }; ConstantBuffer* jitterCB = nullptr; From 15b6803a2e896a0c34756bd138ec9af3404faae9 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Fri, 5 Jun 2026 22:25:32 +0100 Subject: [PATCH 12/20] refactor: flatten VR [1] eye arrays and inline dead helpers Shader cbuffer changes (all shaders): - Convert all World[1], PreviousWorld[1], WorldViewProj[1], WorldView[1], EyePos[1], EyePosition[1], PosAdjust[1], QPosAdjust[1], TextureProj[1], ScreenProj[1], ViewProj[1], HighDetailRange[1], BonesPivot[1], PreviousBonesPivot[1], CameraViewProj[1], CameraViewProjInverse[1], WindInput[1], VolumetricFogClipToWorld[2] from [N] arrays to plain vars - Convert ShadowMapProj[1][3] to ShadowMapProj[3] (remove eye dimension) - Update all X[0] accesses to X, and X[0][n] row accesses to X[n] C++ changes: - ExponentialHeightFog: clipToWorld[2] -> plain, remove redundant [1] fill - LightLimitFix: eyePositionCached[1] -> plain - Upscaling: encodeTexturesCS[5] -> [4], remove dead encodeTexturesCSDepthOutput - D3D.h/D3D.cpp/FrameAnnotations.cpp: inline GetRenderTargetCount() and GetDepthStencilCount() -> RE::RENDER_TARGETS::kTOTAL etc., remove functions - Game.h/all call sites: inline GET_INSTANCE_MEMBER and GET_INSTANCE_MEMBER_PTR macros, remove macro definitions i18n: - DynamicCubemaps: remove key_feature_4 (VR-specific 'standard rendering modes'), rename key_feature_5 -> key_feature_4 - Regenerate en.json (2083 keys), re-sort zh_CN.json Co-Authored-By: Claude Sonnet 4.6 --- .../VolumetricFogCSCommon.hlsli | 4 +- .../GrassCollision/GrassCollision.hlsli | 4 +- .../CommunityShaders/Translations/en.json | 3 +- .../CommunityShaders/Translations/zh_CN.json | 4 +- package/Shaders/DistantTree.hlsl | 12 ++--- package/Shaders/Effect.hlsl | 38 +++++++-------- .../ISVolumetricLightingGenerateCS.hlsl | 20 ++++---- package/Shaders/Lighting.hlsl | 48 +++++++++---------- package/Shaders/Particle.hlsl | 10 ++-- package/Shaders/RunGrass.hlsl | 24 +++++----- package/Shaders/Sky.hlsl | 20 ++++---- package/Shaders/Utility.hlsl | 38 +++++++-------- package/Shaders/Water.hlsl | 30 ++++++------ src/CSEditor/Weather/PrecipitationWidget.cpp | 4 +- src/Deferred.cpp | 10 ++-- src/Features/CSEditor.cpp | 2 +- src/Features/CloudShadows.cpp | 2 +- src/Features/DynamicCubemaps.h | 3 +- src/Features/ExponentialHeightFog.cpp | 3 +- src/Features/ExponentialHeightFog.h | 2 +- src/Features/LightLimitFix.cpp | 10 ++-- src/Features/LightLimitFix.h | 2 +- src/Features/ScreenSpaceGI.cpp | 2 +- src/Features/TerrainBlending.cpp | 8 ++-- src/Features/Upscaling.cpp | 6 +-- src/Features/Upscaling.h | 3 +- src/FrameAnnotations.cpp | 4 +- src/Globals.cpp | 6 +-- src/Hooks.cpp | 2 +- src/State.cpp | 2 +- src/Utils/D3D.cpp | 8 ++-- src/Utils/D3D.h | 10 ---- src/Utils/Game.h | 6 --- 33 files changed, 165 insertions(+), 185 deletions(-) diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli index e2a0a4b5c3..51aa39331b 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogCSCommon.hlsli @@ -8,7 +8,7 @@ cbuffer VolumetricFogCB : register(b0) uint4 VolumetricFogGridSizeAndFlags; float4 VolumetricFogInvGridSizeAndNearFade; float4 VolumetricFogGridZParams; - row_major float4x4 VolumetricFogClipToWorld[2]; + row_major float4x4 VolumetricFogClipToWorld; float4 VolumetricFogFrameJitterOffsets[16]; float4 VolumetricFogHistoryParameters; float4 VolumetricFogJitterParameters; @@ -47,7 +47,7 @@ namespace ExponentialHeightFog float2 ndc = volumeUV * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f); float deviceZ = (SharedData::CameraData.x - SharedData::CameraData.w / viewDepth) / SharedData::CameraData.z; - float4 worldPosition = mul(VolumetricFogClipToWorld[0], float4(ndc, deviceZ, 1.0f)); + float4 worldPosition = mul(VolumetricFogClipToWorld, float4(ndc, deviceZ, 1.0f)); return worldPosition.xyz / worldPosition.w; } } diff --git a/features/Grass Collision/Shaders/GrassCollision/GrassCollision.hlsli b/features/Grass Collision/Shaders/GrassCollision/GrassCollision.hlsli index 9a751f07cc..c69af8508b 100644 --- a/features/Grass Collision/Shaders/GrassCollision/GrassCollision.hlsli +++ b/features/Grass Collision/Shaders/GrassCollision/GrassCollision.hlsli @@ -135,11 +135,11 @@ namespace GrassCollision void GetDisplacedPosition(VS_INPUT input, float3 position, out float3 displacement, out float3 previousDisplacement) { - float3 worldPosition = mul(World[0], float4(position.xyz, 1.0)).xyz; + float3 worldPosition = mul(World, float4(position.xyz, 1.0)).xyz; float nearFactor = smoothstep(2048.0, 0.0, length(worldPosition)); if (input.Color.w > 0.0 && nearFactor > 0.0) { - float3 worldPositionCentre = mul(World[0], float4(input.InstanceData1.xyz, 1.0)).xyz; + float3 worldPositionCentre = mul(World, float4(input.InstanceData1.xyz, 1.0)).xyz; // Limit stretching float3 remappedWorldPosition = lerp(worldPosition, worldPositionCentre, float3(0.95, 0.95, 0.0)); diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/en.json b/package/SKSE/Plugins/CommunityShaders/Translations/en.json index 59313a5df7..20da806de0 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/en.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/en.json @@ -557,8 +557,7 @@ "feature.dynamic_cubemaps.key_feature_1": "Real-time environment capture for realistic reflections", "feature.dynamic_cubemaps.key_feature_2": "Dynamic cube map generation based on camera position", "feature.dynamic_cubemaps.key_feature_3": "Enhanced water reflections with environmental details", - "feature.dynamic_cubemaps.key_feature_4": "Support for standard rendering modes", - "feature.dynamic_cubemaps.key_feature_5": "Optimized cubemap inference and irradiance calculation", + "feature.dynamic_cubemaps.key_feature_4": "Optimized cubemap inference and irradiance calculation", "feature.dynamic_cubemaps.name": "Dynamic Cubemaps", "feature.dynamic_cubemaps.roughness": "Roughness", "feature.dynamic_cubemaps.screen_space_reflections": "Screen Space Reflections", diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json index 22b51f6721..a15c5c3650 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json @@ -557,7 +557,6 @@ "feature.dynamic_cubemaps.key_feature_2": "基于摄像机位置的动态立方体贴图生成", "feature.dynamic_cubemaps.key_feature_3": "增强的水面反射,包含环境细节", "feature.dynamic_cubemaps.key_feature_4": "支持标准和VR两种渲染模式", - "feature.dynamic_cubemaps.key_feature_5": "优化的立方体贴图推理与辐照度计算", "feature.dynamic_cubemaps.name": "动态立方体贴图", "feature.dynamic_cubemaps.roughness": "粗糙度", "feature.dynamic_cubemaps.screen_space_reflections": "屏幕空间反射", @@ -2074,5 +2073,6 @@ "ui.copy": "复制", "ui.dont_ask_again": "不再提示", "ui.search": "搜索...", - "ui.search_features": "搜索功能..." + "ui.search_features": "搜索功能...", + "feature.dynamic_cubemaps.key_feature_5": "优化的立方体贴图推理与辐照度计算" } diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index 5797ee58a1..70708e733a 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -42,9 +42,9 @@ cbuffer PerTechnique : register(b0) cbuffer PerGeometry : register(b2) { - row_major float4x4 WorldViewProj[1] : packoffset(c0); - row_major float4x4 World[1] : packoffset(c4); - row_major float4x4 PreviousWorld[1] : packoffset(c8); + row_major float4x4 WorldViewProj : packoffset(c0); + row_major float4x4 World : packoffset(c4); + row_major float4x4 PreviousWorld : packoffset(c8); }; VS_OUTPUT main(VS_INPUT input) @@ -57,14 +57,14 @@ VS_OUTPUT main(VS_INPUT input) adjustedModelPosition.y = dot(input.InstanceData2.yx, scaledModelPosition.xy); adjustedModelPosition.z = scaledModelPosition.z; float4 finalModelPosition = float4(input.InstanceData1.xyz + adjustedModelPosition.xyz, 1.0); - float4 viewPosition = mul(WorldViewProj[0], finalModelPosition); + float4 viewPosition = mul(WorldViewProj, finalModelPosition); # ifdef RENDER_DEPTH vsout.Depth.xy = viewPosition.zw; vsout.Depth.zw = input.InstanceData2.zw; # else - vsout.WorldPosition = mul(World[0], finalModelPosition); - vsout.PreviousWorldPosition = mul(PreviousWorld[0], finalModelPosition); + vsout.WorldPosition = mul(World, finalModelPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld, finalModelPosition); vsout.ViewPosition = viewPosition; # endif // RENDER_DEPTH diff --git a/package/Shaders/Effect.hlsl b/package/Shaders/Effect.hlsl index d611a20cad..6942bf9992 100644 --- a/package/Shaders/Effect.hlsl +++ b/package/Shaders/Effect.hlsl @@ -87,12 +87,12 @@ struct VS_OUTPUT #ifdef VSHADER cbuffer VS_PerFrame : register(b12) { - row_major float4x4 ScreenProj[1] : packoffset(c0); - row_major float4x4 ViewProj[1] : packoffset(c8); + row_major float4x4 ScreenProj : packoffset(c0); + row_major float4x4 ViewProj : packoffset(c8); # if defined(SKINNED) - float3 BonesPivot[1] : packoffset(c40); + float3 BonesPivot : packoffset(c40); # if defined(MOTIONVECTORS_NORMALS) - float3 PreviousBonesPivot[1] : packoffset(c41); + float3 PreviousBonesPivot : packoffset(c41); # endif // MOTIONVECTORS_NORMALS # endif // SKINNED }; @@ -113,11 +113,11 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { - row_major float3x4 World[1] : packoffset(c0); - row_major float3x4 PreviousWorld[1] : packoffset(c3); + row_major float3x4 World : packoffset(c0); + row_major float3x4 PreviousWorld : packoffset(c3); float4 MatProj[3] : packoffset(c6); - float4 EyePosition[1] : packoffset(c12); - float4 PosAdjust[1] : packoffset(c13); + float4 EyePosition : packoffset(c12); + float4 PosAdjust : packoffset(c13); float4 TexcoordOffsetMembrane : packoffset(c14); } @@ -162,7 +162,7 @@ float GetProjectedU(float3 worldPosition, float4 texCoordOffset) float GetProjectedV(float3 worldPosition) { - return (-PosAdjust[0].x + (PosAdjust[0].z + worldPosition.z)) / PosAdjust[0].y; + return (-PosAdjust.x + (PosAdjust.z + worldPosition.z)) / PosAdjust.y; } # endif @@ -171,31 +171,31 @@ VS_OUTPUT main(VS_INPUT input) VS_OUTPUT vsout; precise float4 inputPosition = float4(input.Position.xyz, 1.0); - precise row_major float4x4 world4x4 = float4x4(World[0][0], World[0][1], World[0][2], float4(0, 0, 0, 1)); + precise row_major float4x4 world4x4 = float4x4(World[0], World[1], World[2], float4(0, 0, 0, 1)); precise float3x3 world3x3 = - transpose(float3x3(transpose(World[0])[0], transpose(World[0])[1], transpose(World[0])[2])); + transpose(float3x3(transpose(World)[0], transpose(World)[1], transpose(World)[2])); # if defined(SKY_OBJECT) - float4x4 viewProj = float4x4(ViewProj[0][0], ViewProj[0][1], ViewProj[0][3], ViewProj[0][3]); + float4x4 viewProj = float4x4(ViewProj[0], ViewProj[1], ViewProj[3], ViewProj[3]); # else - row_major float4x4 viewProj = ViewProj[0]; + row_major float4x4 viewProj = ViewProj; # endif # if defined(SKINNED) precise int4 actualIndices = 765.01.xxxx * input.BoneIndices.xyzw; # if defined(MOTIONVECTORS_NORMALS) float3x4 previousBoneTransformMatrix = - Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot[0], input.BoneWeights); + Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot, input.BoneWeights); precise float4 previousWorldPosition = float4(mul(inputPosition, transpose(previousBoneTransformMatrix)), 1); # endif float3x4 boneTransformMatrix = - Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot[0], input.BoneWeights); + Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot, input.BoneWeights); precise float4 worldPosition = float4(mul(inputPosition, transpose(boneTransformMatrix)), 1); float4 viewPos = mul(viewProj, worldPosition); # else - precise float4 worldPosition = float4(mul(World[0], inputPosition), 1); - precise float4 previousWorldPosition = float4(mul(PreviousWorld[0], inputPosition), 1); + precise float4 worldPosition = float4(mul(World, inputPosition), 1); + precise float4 previousWorldPosition = float4(mul(PreviousWorld, inputPosition), 1); precise row_major float4x4 modelView = mul(viewProj, world4x4); float4 viewPos = mul(modelView, inputPosition); # endif @@ -297,7 +297,7 @@ VS_OUTPUT main(VS_INPUT input) float3 eyePosition = 0.0.xxx; # if defined(MEMBRANE) && defined(TEXTURE) && !defined(SKINNED) - eyePosition = EyePosition[0].xyz; + eyePosition = EyePosition.xyz; # endif float3 viewPosition = inputPosition.xyz; @@ -340,7 +340,7 @@ VS_OUTPUT main(VS_INPUT input) # elif defined(FALLOFF) || (defined(SKINNED) && defined(MEMBRANE)) float3 screenSpaceNormal = worldNormal; # else - float4x4 modelScreen = mul(ScreenProj[0], world4x4); + float4x4 modelScreen = mul(ScreenProj, world4x4); float3 screenSpaceNormal = normalize(mul(modelScreen, float4(normal, 0))).xyz; # endif diff --git a/package/Shaders/ISVolumetricLightingGenerateCS.hlsl b/package/Shaders/ISVolumetricLightingGenerateCS.hlsl index 6283ddc9cd..5cab1319fb 100644 --- a/package/Shaders/ISVolumetricLightingGenerateCS.hlsl +++ b/package/Shaders/ISVolumetricLightingGenerateCS.hlsl @@ -23,17 +23,17 @@ RWTexture3D DensityRW : register(u0); cbuffer PerTechnique : register(b0) { - row_major float4x4 CameraViewProj[1] : packoffset(c0); - row_major float4x4 CameraViewProjInverse[1] : packoffset(c4); - float4x3 ShadowMapProj[1][3] : packoffset(c8); + row_major float4x4 CameraViewProj : packoffset(c0); + row_major float4x4 CameraViewProjInverse : packoffset(c4); + float4x3 ShadowMapProj[3] : packoffset(c8); float3 EndSplitDistances : packoffset(c17.x); float ShadowMapCount : packoffset(c17.w); float EnableShadowCasting : packoffset(c18); float3 DirLightDirection : packoffset(c19); float3 TextureDimensions : packoffset(c20); - float3 WindInput[1] : packoffset(c21); + float3 WindInput : packoffset(c21); float InverseDensityScale : packoffset(c21.w); - float3 PosAdjust[1] : packoffset(c22); + float3 PosAdjust : packoffset(c22); float IterationIndex : packoffset(c22.w); float PhaseContribution : packoffset(c23.x); float PhaseScattering : packoffset(c23.y); @@ -57,10 +57,10 @@ cbuffer PerTechnique : register(b0) float depth = InverseRepartitionTex.SampleLevel(InverseRepartitionSampler, depthUv.z, 0); float4 positionCS = float4(2 * depthUv.x - 1, 1 - 2 * depthUv.y, depth, 1); - float4 positionWS = mul(CameraViewProjInverse[0], positionCS); + float4 positionWS = mul(CameraViewProjInverse, positionCS); positionWS *= rcp(positionWS.w); - float4 positionCSShifted = mul(CameraViewProj[0], positionWS); + float4 positionCSShifted = mul(CameraViewProj, positionWS); positionCSShifted *= rcp(positionCSShifted.w); float shadowMapDepth = positionCSShifted.z; @@ -70,7 +70,7 @@ cbuffer PerTechnique : register(b0) uint cascadeIndex = ShadowMapCount >= 3.0f && shadowMapDepth > EndSplitDistances.y ? 2 : shadowMapDepth > EndSplitDistances.x ? 1 : 0; float shadowMapThreshold = cascadeIndex == 0 ? 0.01f : 0.0f; - float4x3 lightProjectionMatrix = ShadowMapProj[0][cascadeIndex]; + float4x3 lightProjectionMatrix = ShadowMapProj[cascadeIndex]; float3 positionLS = mul(transpose(lightProjectionMatrix), float4(positionWS.xyz, 1)).xyz; float shadowMapValue = ShadowmapTex.SampleLevel(ShadowmapSampler, float3(positionLS.xy, cascadeIndex), 0); @@ -82,7 +82,7 @@ cbuffer PerTechnique : register(b0) } } - float3 noiseUv = 0.0125 * (InverseDensityScale * (positionWS.xyz + WindInput[0])); + float3 noiseUv = 0.0125 * (InverseDensityScale * (positionWS.xyz + WindInput)); float noise = NoiseTex.SampleLevel(NoiseSampler, noiseUv, 0); float densityFactor = noise * (1 - 0.75 * smoothstep(0, 1, saturate(2 * positionWS.z / 300))); float densityContribution = lerp(1, densityFactor, DensityContribution); @@ -94,7 +94,7 @@ cbuffer PerTechnique : register(b0) float shadowContribution = noShadow; # if defined(TERRAIN_SHADOWS) || defined(CLOUD_SHADOWS) - shadowContribution *= sqrt(ShadowSampling::GetWorldShadow(positionWS.xyz, PosAdjust[0])); + shadowContribution *= sqrt(ShadowSampling::GetWorldShadow(positionWS.xyz, PosAdjust)); # endif float vl = shadowContribution * densityContribution * phaseContribution; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index f44493743a..ea822742b8 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -92,7 +92,7 @@ struct VS_OUTPUT cbuffer PerTechnique : register(b0) { - float4 HighDetailRange[1] : packoffset(c0); // loaded cells center in xy, size in zw + float4 HighDetailRange : packoffset(c0); // loaded cells center in xy, size in zw float4 FogParam : packoffset(c1); float4 FogNearColor : packoffset(c2); float4 FogFarColor : packoffset(c3); @@ -107,24 +107,24 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { - row_major float3x4 World[1] : packoffset(c0); - row_major float3x4 PreviousWorld[1] : packoffset(c3); - float4 EyePosition[1] : packoffset(c6); + row_major float3x4 World : packoffset(c0); + row_major float3x4 PreviousWorld : packoffset(c3); + float4 EyePosition : packoffset(c6); float4 LandBlendParams : packoffset(c7); // offset in xy, gridPosition in yw float4 TreeParams : packoffset(c8); // wind magnitude in y, amplitude in z, leaf frequency in w float2 WindTimers : packoffset(c9); - row_major float3x4 TextureProj[1] : packoffset(c10); + row_major float3x4 TextureProj : packoffset(c10); float IndexScale : packoffset(c13); float4 WorldMapOverlayParameters : packoffset(c14); }; cbuffer VS_PerFrame : register(b12) { - row_major float3x3 ScreenProj[1] : packoffset(c0); - row_major float4x4 ViewProj[1] : packoffset(c8); + row_major float3x3 ScreenProj : packoffset(c0); + row_major float4x4 ViewProj : packoffset(c8); # if defined(SKINNED) - float3 BonesPivot[1] : packoffset(c40); - float3 PreviousBonesPivot[1] : packoffset(c41); + float3 BonesPivot : packoffset(c40); + float3 PreviousBonesPivot : packoffset(c41); # endif // SKINNED }; @@ -146,7 +146,7 @@ VS_OUTPUT main(VS_INPUT input) precise float4 inputPosition = float4(input.Position.xyz, 1.0); # if defined(LODLANDNOISE) || defined(LODLANDSCAPE) - inputPosition = LodLandscape::AdjustLodLandscapeVertexPositionMS(inputPosition, float4x4(World[0], float4(0, 0, 0, 1)), HighDetailRange[0]); + inputPosition = LodLandscape::AdjustLodLandscapeVertexPositionMS(inputPosition, float4x4(World, float4(0, 0, 0, 1)), HighDetailRange); # endif // defined(LODLANDNOISE) || defined(LODLANDSCAPE) \ precise float4 previousInputPosition = inputPosition; @@ -163,19 +163,19 @@ VS_OUTPUT main(VS_INPUT input) precise int4 actualIndices = 765.01.xxxx * input.BoneIndices.xyzw; float3x4 previousWorldMatrix = - Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot[0], input.BoneWeights); + Skinned::GetBoneTransformMatrix(PreviousBones, actualIndices, PreviousBonesPivot, input.BoneWeights); precise float4 previousWorldPosition = float4(mul(inputPosition, transpose(previousWorldMatrix)), 1); - float3x4 worldMatrix = Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot[0], input.BoneWeights); + float3x4 worldMatrix = Skinned::GetBoneTransformMatrix(Bones, actualIndices, BonesPivot, input.BoneWeights); precise float4 worldPosition = float4(mul(inputPosition, transpose(worldMatrix)), 1); - float4 viewPos = mul(ViewProj[0], worldPosition); + float4 viewPos = mul(ViewProj, worldPosition); # else // !SKINNED - precise float4 previousWorldPosition = float4(mul(PreviousWorld[0], inputPosition), 1); - precise float4 worldPosition = float4(mul(World[0], inputPosition), 1); - precise float4x4 world4x4 = float4x4(World[0][0], World[0][1], World[0][2], float4(0, 0, 0, 1)); - precise float4x4 modelView = mul(ViewProj[0], world4x4); + precise float4 previousWorldPosition = float4(mul(PreviousWorld, inputPosition), 1); + precise float4 worldPosition = float4(mul(World, inputPosition), 1); + precise float4x4 world4x4 = float4x4(World[0], World[1], World[2], float4(0, 0, 0, 1)); + precise float4x4 modelView = mul(ViewProj, world4x4); float4 viewPos = mul(modelView, inputPosition); # endif // SKINNED @@ -189,8 +189,8 @@ VS_OUTPUT main(VS_INPUT input) # if defined(LANDSCAPE) vsout.TexCoord0.zw = (uv * 0.010416667.xx + LandBlendParams.xy) * float2(1, -1) + float2(0, 1); # elif defined(PROJECTED_UV) && !defined(SKINNED) - vsout.TexCoord0.z = mul(TextureProj[0][0], inputPosition); - vsout.TexCoord0.w = mul(TextureProj[0][1], inputPosition); + vsout.TexCoord0.z = mul(TextureProj[0], inputPosition); + vsout.TexCoord0.w = mul(TextureProj[1], inputPosition); # endif vsout.TexCoord0.xy = uv; @@ -220,9 +220,9 @@ VS_OUTPUT main(VS_INPUT input) vsout.TBN1.xyz = worldTbnTr[1]; vsout.TBN2.xyz = worldTbnTr[2]; # else - vsout.TBN0.xyz = mul(tbn, World[0][0].xyz); - vsout.TBN1.xyz = mul(tbn, World[0][1].xyz); - vsout.TBN2.xyz = mul(tbn, World[0][2].xyz); + vsout.TBN0.xyz = mul(tbn, World[0].xyz); + vsout.TBN1.xyz = mul(tbn, World[1].xyz); + vsout.TBN2.xyz = mul(tbn, World[2].xyz); float3x3 tempTbnTr = transpose(float3x3(vsout.TBN0.xyz, vsout.TBN1.xyz, vsout.TBN2.xyz)); tempTbnTr[0] = normalize(tempTbnTr[0]); tempTbnTr[1] = normalize(tempTbnTr[1]); @@ -249,8 +249,8 @@ VS_OUTPUT main(VS_INPUT input) vsout.LandBlendWeights2.w = 1 - saturate(0.000375600968 * (9625.59961 - length(gridOffset))); vsout.LandBlendWeights2.xyz = input.LandBlendWeights2.xyz; # elif defined(PROJECTED_UV) && !defined(SKINNED) - float3x3 texProjWorld3x3 = float3x3(World[0][0].xyz, World[0][1].xyz, World[0][2].xyz); - vsout.TexProj = mul(texProjWorld3x3, TextureProj[0][2].xyz); + float3x3 texProjWorld3x3 = float3x3(World[0].xyz, World[1].xyz, World[2].xyz); + vsout.TexProj = mul(texProjWorld3x3, TextureProj[2].xyz); # endif # if defined(EYE) diff --git a/package/Shaders/Particle.hlsl b/package/Shaders/Particle.hlsl index d23f5d59ee..9eb46ccb2b 100644 --- a/package/Shaders/Particle.hlsl +++ b/package/Shaders/Particle.hlsl @@ -35,8 +35,8 @@ cbuffer PerTechnique : register(b0) cbuffer PerGeometry : register(b2) { - row_major float4x4 WorldViewProj[1]; // 0 - row_major float4x4 WorldView[1]; // 4 + row_major float4x4 WorldViewProj; // 0 + row_major float4x4 WorldView; // 4 # if defined(ENVCUBE) row_major float4x4 PrecipitationOcclusionWorldViewProj; // 8, 16 # endif @@ -81,11 +81,11 @@ VS_OUTPUT main(VS_INPUT input) msPosition.xyz = normalizedPosition * fVars2.xxx + (-(fVars2.x * 0.5).xxx + fVars1.xyz); msPosition.w = 1; - float4 viewPosition = mul(WorldViewProj[0], msPosition); + float4 viewPosition = mul(WorldViewProj, msPosition); # if defined(RAIN) float4 adjustedMsPosition = msPosition - float4(Velocity.xyz, 0); float positionBlendParam = 0.5 * (1 + input.TexCoord1.y); - float4 adjustedViewPosition = mul(WorldViewProj[0], adjustedMsPosition); + float4 adjustedViewPosition = mul(WorldViewProj, adjustedMsPosition); float4 finalViewPosition = lerp(adjustedViewPosition, viewPosition, positionBlendParam); # else float4 finalViewPosition = viewPosition; @@ -140,7 +140,7 @@ VS_OUTPUT main(VS_INPUT input) input.Position.xyz)); msPosition.w = 1; - float4 viewPosition = mul(WorldViewProj[0], msPosition); + float4 viewPosition = mul(WorldViewProj, msPosition); vsout.Position.xy = positionOffset * ScaleAdjust + viewPosition.xy; vsout.Position.zw = viewPosition.zw; diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 15c52b3bd0..a86f036589 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -69,10 +69,10 @@ cbuffer PerGeometry : register( #endif ) { - row_major float4x4 WorldViewProj[1] : packoffset(c0); - row_major float4x4 WorldView[1] : packoffset(c4); - row_major float4x4 World[1] : packoffset(c8); - row_major float4x4 PreviousWorld[1] : packoffset(c12); + row_major float4x4 WorldViewProj : packoffset(c0); + row_major float4x4 WorldView : packoffset(c4); + row_major float4x4 World : packoffset(c8); + row_major float4x4 PreviousWorld : packoffset(c12); float4 FogNearColor : packoffset(c16); float3 WindVector : packoffset(c17); float WindTimer : packoffset(c17.w); @@ -165,7 +165,7 @@ VS_OUTPUT main(VS_INPUT input) msPosition.xyz += windDisplacement; - float4 projSpacePosition = mul(WorldViewProj[0], msPosition); + float4 projSpacePosition = mul(WorldViewProj, msPosition); vsout.HPosition = projSpacePosition; # if defined(RENDER_DEPTH) @@ -184,8 +184,8 @@ VS_OUTPUT main(VS_INPUT input) vsout.TexCoord.xy = input.TexCoord.xy; vsout.TexCoord.z = FogNearColor.w; - vsout.ViewSpacePosition = mul(WorldView[0], msPosition).xyz; - vsout.WorldPosition = mul(World[0], msPosition); + vsout.ViewSpacePosition = mul(WorldView, msPosition).xyz; + vsout.WorldPosition = mul(World, msPosition); float4 previousMsPosition = GetMSPosition(input, world3x3); @@ -195,7 +195,7 @@ VS_OUTPUT main(VS_INPUT input) previousMsPosition.xyz += previousWindDisplacement; - vsout.PreviousWorldPosition = mul(PreviousWorld[0], previousMsPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld, previousMsPosition); // Vertex normal needs to be transformed to world-space for lighting calculations. vsout.VertexNormal.xyz = mul(world3x3, input.Normal.xyz * 2.0 - 1.0); @@ -221,7 +221,7 @@ VS_OUTPUT main(VS_INPUT input) msPosition.xyz += windDisplacement; - float4 projSpacePosition = mul(WorldViewProj[0], msPosition); + float4 projSpacePosition = mul(WorldViewProj, msPosition); vsout.HPosition = projSpacePosition; # if defined(RENDER_DEPTH) @@ -246,8 +246,8 @@ VS_OUTPUT main(VS_INPUT input) vsout.AmbientColor.xyz = input.InstanceData1.www * (AmbientColor.xyz * input.Color.xyz); vsout.AmbientColor.w = ShadowClampValue; - vsout.ViewSpacePosition = mul(WorldView[0], msPosition).xyz; - vsout.WorldPosition = mul(World[0], msPosition); + vsout.ViewSpacePosition = mul(WorldView, msPosition).xyz; + vsout.WorldPosition = mul(World, msPosition); float4 previousMsPosition = GetMSPosition(input); @@ -257,7 +257,7 @@ VS_OUTPUT main(VS_INPUT input) previousMsPosition.xyz += previousWindDisplacement; - vsout.PreviousWorldPosition = mul(PreviousWorld[0], previousMsPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld, previousMsPosition); return vsout; } diff --git a/package/Shaders/Sky.hlsl b/package/Shaders/Sky.hlsl index 952b18603e..4d483ef0c5 100644 --- a/package/Shaders/Sky.hlsl +++ b/package/Shaders/Sky.hlsl @@ -47,10 +47,10 @@ struct VS_OUTPUT #ifdef VSHADER cbuffer PerGeometry : register(b2) { - row_major float4x4 WorldViewProj[1] : packoffset(c0); - row_major float4x4 World[1] : packoffset(c4); - row_major float4x4 PreviousWorld[1] : packoffset(c8); - float3 EyePosition[1] : packoffset(c12); + row_major float4x4 WorldViewProj : packoffset(c0); + row_major float4x4 World : packoffset(c4); + row_major float4x4 PreviousWorld : packoffset(c8); + float3 EyePosition : packoffset(c12); float VParams : packoffset(c12.w); float4 BlendColor[3] : packoffset(c13); float2 TexCoordOff : packoffset(c16); @@ -73,8 +73,8 @@ VS_OUTPUT main(VS_INPUT input) # elif defined(HORIZFADE) - float worldHeight = mul(World[0], inputPosition).z; - float eyeHeightDelta = -EyePosition[0].z + worldHeight; + float worldHeight = mul(World, inputPosition).z; + float eyeHeightDelta = -EyePosition.z + worldHeight; vsout.TexCoord0.xy = input.TexCoord; vsout.TexCoord2.x = saturate((1.0 / 17.0) * eyeHeightDelta); @@ -113,10 +113,10 @@ VS_OUTPUT main(VS_INPUT input) # endif // OCCLUSION MOONMASK HORIZFADE - vsout.Position = mul(WorldViewProj[0], inputPosition).xyww; - vsout.WorldPosition = mul(World[0], inputPosition); - vsout.FogPosition = vsout.WorldPosition.xyz - EyePosition[0].xyz; - vsout.PreviousWorldPosition = mul(PreviousWorld[0], inputPosition); + vsout.Position = mul(WorldViewProj, inputPosition).xyww; + vsout.WorldPosition = mul(World, inputPosition); + vsout.FogPosition = vsout.WorldPosition.xyz - EyePosition.xyz; + vsout.PreviousWorldPosition = mul(PreviousWorld, inputPosition); return vsout; } diff --git a/package/Shaders/Utility.hlsl b/package/Shaders/Utility.hlsl index 937d009515..dc5aeec8fd 100644 --- a/package/Shaders/Utility.hlsl +++ b/package/Shaders/Utility.hlsl @@ -73,7 +73,7 @@ struct VS_OUTPUT #ifdef VSHADER cbuffer PerTechnique : register(b0) { - float4 HighDetailRange[1] : packoffset(c0); // loaded cells center in xy, size in zw + float4 HighDetailRange : packoffset(c0); // loaded cells center in xy, size in zw float2 ParabolaParam : packoffset(c1); // inverse radius in x, y is 1 for forward hemisphere or -1 for backward hemisphere }; @@ -85,8 +85,8 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { float4 ShadowFadeParam : packoffset(c0); - row_major float4x4 World[1] : packoffset(c1); - float4 EyePos[1] : packoffset(c5); + row_major float4x4 World : packoffset(c1); + float4 EyePos : packoffset(c5); float4 WaterParams : packoffset(c6); float4 TreeParams : packoffset(c7); }; @@ -105,7 +105,7 @@ VS_OUTPUT main(VS_INPUT input) # if defined(RENDER_SHADOWMASKDPB) || defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) vsout.PositionCS.z = ShadowFadeParam.z; # else - vsout.PositionCS.z = HighDetailRange[0].x; + vsout.PositionCS.z = HighDetailRange.x; # endif vsout.PositionCS.w = 1; # elif defined(STENCIL_ABOVE_WATER) @@ -128,7 +128,7 @@ VS_OUTPUT main(VS_INPUT input) # endif # if defined(LOD_LANDSCAPE) - positionMS = LodLandscape::AdjustLodLandscapeVertexPositionMS(positionMS, World[0], HighDetailRange[0]); + positionMS = LodLandscape::AdjustLodLandscapeVertexPositionMS(positionMS, World, HighDetailRange); # endif # if defined(SKINNED) @@ -139,7 +139,7 @@ VS_OUTPUT main(VS_INPUT input) positionCS = mul(FrameBuffer::CameraViewProj, positionWS); # else - precise float4x4 modelViewProj = mul(FrameBuffer::CameraViewProj, World[0]); + precise float4x4 modelViewProj = mul(FrameBuffer::CameraViewProj, World); positionCS = mul(modelViewProj, positionMS); # endif @@ -166,7 +166,7 @@ VS_OUTPUT main(VS_INPUT input) normalMS = normalize(mul(normalMS, transpose(boneRSMatrix))); normalVS = mul(FrameBuffer::CameraView, float4(normalMS, 0)).xyz; # else - normalVS = mul(mul(FrameBuffer::CameraView, World[0]), float4(normalMS, 0)).xyz; + normalVS = mul(mul(FrameBuffer::CameraView, World), float4(normalMS, 0)).xyz; # endif # if defined(RENDER_NORMAL_CLAMP) normalVS = max(min(normalVS, 0.1), -0.1); @@ -191,12 +191,12 @@ VS_OUTPUT main(VS_INPUT input) float falloff = 1; # if defined(RENDER_NORMAL_FALLOFF) # if defined(SKINNED) - falloff = dot(normalMS, normalize(EyePos[0].xyz - positionWS.xyz)); + falloff = dot(normalMS, normalize(EyePos.xyz - positionWS.xyz)); # else - falloff = dot(normalMS, normalize(EyePos[0].xyz - positionMS.xyz)); + falloff = dot(normalMS, normalize(EyePos.xyz - positionMS.xyz)); # endif # endif - texCoord.w = EyePos[0].w * falloff; + texCoord.w = EyePos.w * falloff; # endif vsout.TexCoord0 = texCoord; @@ -298,9 +298,9 @@ cbuffer PerGeometry : register(b2) float4 ShadowLightParam : packoffset(c3); // Falloff in x, ShadowDistance squared in z float4x3 FocusShadowMapProj[4] : packoffset(c4); # if defined(RENDER_SHADOWMASK) - float4x3 ShadowMapProj[1][3] : packoffset(c16); // 16, 19, 22 + float4x3 ShadowMapProj[3] : packoffset(c16); // 16, 19, 22 # elif defined(RENDER_SHADOWMASKSPOT) || defined(RENDER_SHADOWMASKPB) || defined(RENDER_SHADOWMASKDPB) - float4x4 ShadowMapProj[1][3] : packoffset(c16); + float4x4 ShadowMapProj[3] : packoffset(c16); # endif } @@ -453,15 +453,15 @@ PS_OUTPUT main(PS_INPUT input) shadowColor = float4(0, 0, 0, 0); if (EndSplitDistances.z >= shadowMapDepth) { - float4x3 lightProjectionMatrix = ShadowMapProj[0][0]; + float4x3 lightProjectionMatrix = ShadowMapProj[0]; float shadowMapThreshold = AlphaTestRef.y; float cascadeIndex = 0; if (2.5 < EndSplitDistances.w && EndSplitDistances.y < shadowMapDepth) { - lightProjectionMatrix = ShadowMapProj[0][2]; + lightProjectionMatrix = ShadowMapProj[2]; shadowMapThreshold = AlphaTestRef.z; cascadeIndex = 2; } else if (EndSplitDistances.x < shadowMapDepth) { - lightProjectionMatrix = ShadowMapProj[0][1]; + lightProjectionMatrix = ShadowMapProj[1]; shadowMapThreshold = AlphaTestRef.z; cascadeIndex = 1; } @@ -484,7 +484,7 @@ PS_OUTPUT main(PS_INPUT input) if (cascadeIndex < 1 && StartSplitDistances.y < shadowMapDepth) { float cascade1ShadowVisibility = 0; - float3 cascade1PositionLS = mul(transpose(ShadowMapProj[0][1]), float4(positionMS.xyz, 1)).xyz; + float3 cascade1PositionLS = mul(transpose(ShadowMapProj[1]), float4(positionMS.xyz, 1)).xyz; # if SHADOWFILTER == 0 float cascade1ShadowMapValue = TexShadowMapSampler.Sample(SampShadowMapSampler, float3(cascade1PositionLS.xy, 1)).x; @@ -520,7 +520,7 @@ PS_OUTPUT main(PS_INPUT input) shadowColor.xyzw = lerp(1.0 * !SharedData::InInterior, shadowVisibility, fadeFactor); } # elif defined(RENDER_SHADOWMASKSPOT) - float4 positionLS = mul(transpose(ShadowMapProj[0][0]), float4(positionMS.xyz, 1)); + float4 positionLS = mul(transpose(ShadowMapProj[0]), float4(positionMS.xyz, 1)); positionLS.xyz /= positionLS.w; float2 shadowMapUv = positionLS.xy * 0.5 + 0.5; float shadowBaseVisibility = 0; @@ -558,7 +558,7 @@ PS_OUTPUT main(PS_INPUT input) shadowColor.xyzw = fadeFactor * shadowVisibility; # elif defined(RENDER_SHADOWMASKPB) - float4 unadjustedPositionLS = mul(transpose(ShadowMapProj[0][0]), float4(positionMS.xyz, 1)); + float4 unadjustedPositionLS = mul(transpose(ShadowMapProj[0]), float4(positionMS.xyz, 1)); float shadowVisibility = 0; @@ -583,7 +583,7 @@ PS_OUTPUT main(PS_INPUT input) shadowColor.xyzw = fadeFactor * shadowVisibility; # elif defined(RENDER_SHADOWMASKDPB) - float3 positionLS = mul(transpose(ShadowMapProj[0][0]), float4(positionMS.xyz, 1)).xyz; + float3 positionLS = mul(transpose(ShadowMapProj[0]), float4(positionMS.xyz, 1)).xyz; bool lowerHalf = positionLS.z * 0.5 + 0.5 < 0; float3 normalizedPositionLS = normalize(positionLS); diff --git a/package/Shaders/Water.hlsl b/package/Shaders/Water.hlsl index 9b071378fe..1bb6b1de96 100644 --- a/package/Shaders/Water.hlsl +++ b/package/Shaders/Water.hlsl @@ -123,7 +123,7 @@ struct VS_OUTPUT cbuffer PerTechnique : register(b0) { - float4 QPosAdjust[1] : packoffset(c0); + float4 QPosAdjust : packoffset(c0); }; cbuffer PerMaterial : register(b1) @@ -138,9 +138,9 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { - row_major float4x4 World[1] : packoffset(c0); - row_major float4x4 PreviousWorld[1] : packoffset(c4); - row_major float4x4 WorldViewProj[1] : packoffset(c8); + row_major float4x4 World : packoffset(c0); + row_major float4x4 PreviousWorld : packoffset(c4); + row_major float4x4 WorldViewProj : packoffset(c8); float3 ObjectUV : packoffset(c12); float4 CellTexCoordOffset : packoffset(c13); }; @@ -152,8 +152,8 @@ VS_OUTPUT main(VS_INPUT input) vsout.NormalsScale = NormalsScale; float4 inputPosition = float4(input.Position.xyz, 1.0); - float4 worldPos = mul(World[0], inputPosition); - float4 worldViewPos = mul(WorldViewProj[0], inputPosition); + float4 worldPos = mul(World, inputPosition); + float4 worldViewPos = mul(WorldViewProj, inputPosition); float heightMult = min((1.0 / 10000.0) * max(worldViewPos.z - 70000, 0), 1); @@ -163,7 +163,7 @@ VS_OUTPUT main(VS_INPUT input) # if defined(STENCIL) vsout.WorldPosition = worldPos; - vsout.PreviousWorldPosition = mul(PreviousWorld[0], inputPosition); + vsout.PreviousWorldPosition = mul(PreviousWorld, inputPosition); # else # if !defined(UNIFIED_WATER) @@ -177,7 +177,7 @@ VS_OUTPUT main(VS_INPUT input) # if defined(LOD) float4 posAdjust = - ObjectUV.x ? 0.0 : (QPosAdjust[0].xyxy + worldPos.xyxy) / NormalsScale.xxyy; + ObjectUV.x ? 0.0 : (QPosAdjust.xyxy + worldPos.xyxy) / NormalsScale.xxyy; vsout.TexCoord1.xyzw = NormalsScroll0 + posAdjust; # else @@ -185,7 +185,7 @@ VS_OUTPUT main(VS_INPUT input) vsout.MPosition.xyzw = inputPosition.xyzw; # endif - float2 posAdjust = worldPos.xy + QPosAdjust[0].xy; + float2 posAdjust = worldPos.xy + QPosAdjust.xy; float2 scrollAdjust1 = posAdjust / NormalsScale.xx; float2 scrollAdjust2 = posAdjust / NormalsScale.yy; @@ -322,7 +322,7 @@ Texture2D RawSSRReflectionTex : register(t11); cbuffer PerTechnique : register(b0) { float4 VPOSOffset : packoffset(c0); // inverse main render target width and height in xy, 0 in zw - float4 PosAdjust[1] : packoffset(c1); // inverse framebuffer range in w + float4 PosAdjust : packoffset(c1); // inverse framebuffer range in w float4 CameraDataWater : packoffset(c2); float4 SunDir : packoffset(c3); float4 SunColor : packoffset(c4); @@ -348,7 +348,7 @@ cbuffer PerMaterial : register(b1) cbuffer PerGeometry : register(b2) { - float4x4 TextureProj[1] : packoffset(c0); + float4x4 TextureProj : packoffset(c0); float4 ReflectPlane[1] : packoffset(c4); float4 ProjData : packoffset(c5); float4 LightPos[8] : packoffset(c6); @@ -373,10 +373,10 @@ float GetWaterFogFade() { # if defined(EXP_HEIGHT_FOG) if (SharedData::exponentialHeightFogSettings.enabled) { - return ExponentialHeightFog::GetVanillaFogFade(PosAdjust[0].w); + return ExponentialHeightFog::GetVanillaFogFade(PosAdjust.w); } # endif - return PosAdjust[0].w; + return PosAdjust.w; } # if defined(FLOWMAP) @@ -864,7 +864,7 @@ struct DiffuseOutput DiffuseOutput GetWaterDiffuseColor(PS_INPUT input, float3 normal, float3 viewDirection, inout float4 distanceMul, float refractionsDepthFactor, float fresnel, float3 viewPosition, float depth) { # if defined(REFRACTIONS) - float4 refractionNormal = mul(transpose(TextureProj[0]), float4((VarAmounts.w * refractionsDepthFactor * normal.xy) + input.MPosition.xy, input.MPosition.z, 1)); + float4 refractionNormal = mul(transpose(TextureProj), float4((VarAmounts.w * refractionsDepthFactor * normal.xy) + input.MPosition.xy, input.MPosition.z, 1)); float2 refractionUvRaw = float2(refractionNormal.x, refractionNormal.w - refractionNormal.y) / refractionNormal.ww; float2 screenPosition = FrameBuffer::DynamicResolutionParams1.xy * (FrameBuffer::DynamicResolutionParams2.xy * input.HPosition.xy); @@ -1043,7 +1043,7 @@ PS_OUTPUT main(PS_INPUT input) [unroll] for (int lightIndex = 0; lightIndex < NUM_SPECULAR_LIGHTS; ++lightIndex) { - float3 lightVector = LightPos[lightIndex].xyz - (PosAdjust[0].xyz + input.WPosition.xyz); + float3 lightVector = LightPos[lightIndex].xyz - (PosAdjust.xyz + input.WPosition.xyz); float3 lightDirection = normalize(normalize(lightVector) - viewDirection); float lightFade = saturate(length(lightVector) / LightPos[lightIndex].w); float lightColorMul = (1 - lightFade * lightFade); diff --git a/src/CSEditor/Weather/PrecipitationWidget.cpp b/src/CSEditor/Weather/PrecipitationWidget.cpp index 8efa1d915a..17cca25148 100644 --- a/src/CSEditor/Weather/PrecipitationWidget.cpp +++ b/src/CSEditor/Weather/PrecipitationWidget.cpp @@ -235,7 +235,7 @@ void PrecipitationWidget::LoadFromGameSettings() settings.particleType = precipitation->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kParticleType).i; settings.boxSize = precipitation->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kBoxSize).f; settings.particleDensity = precipitation->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity).f; - GET_INSTANCE_MEMBER(particleTexture, precipitation) + auto& particleTexture = precipitation->GetRuntimeData().particleTexture; settings.particleTexture = particleTexture.textureName.c_str(); } @@ -276,7 +276,7 @@ void PrecipitationWidget::ApplyChanges() precipitation->GetSettingRef(DataID::kParticleType).i = settings.particleType; precipitation->GetSettingRef(DataID::kBoxSize).f = settings.boxSize; precipitation->GetSettingRef(DataID::kParticleDensity).f = settings.particleDensity; - GET_INSTANCE_MEMBER(particleTexture, precipitation) + auto& particleTexture = precipitation->GetRuntimeData().particleTexture; particleTexture.textureName = settings.particleTexture.c_str(); ApplyLiveParticleTexture(settings.particleTexture); Widget::ForceCurrentWeatherReinit(); diff --git a/src/Deferred.cpp b/src/Deferred.cpp index 56ad84ef9c..aa680f2aa3 100644 --- a/src/Deferred.cpp +++ b/src/Deferred.cpp @@ -227,9 +227,9 @@ void Deferred::StartDeferred() globals::state->UpdateSharedData(true, false); auto shadowState = globals::game::shadowState; - GET_INSTANCE_MEMBER(renderTargets, shadowState) - GET_INSTANCE_MEMBER(setRenderTargetMode, shadowState) - GET_INSTANCE_MEMBER(stateUpdateFlags, shadowState) + auto& renderTargets = shadowState->GetRuntimeData().renderTargets; + auto& setRenderTargetMode = shadowState->GetRuntimeData().setRenderTargetMode; + auto& stateUpdateFlags = shadowState->GetRuntimeData().stateUpdateFlags; // Backup original render targets for (uint i = 0; i < 4; i++) { @@ -387,8 +387,8 @@ void Deferred::EndDeferred() return; auto shadowState = globals::game::shadowState; - GET_INSTANCE_MEMBER(renderTargets, shadowState) - GET_INSTANCE_MEMBER(stateUpdateFlags, shadowState) + auto& renderTargets = shadowState->GetRuntimeData().renderTargets; + auto& stateUpdateFlags = shadowState->GetRuntimeData().stateUpdateFlags; // Do not render to our targets past this point for (uint i = 0; i < 4; i++) { diff --git a/src/Features/CSEditor.cpp b/src/Features/CSEditor.cpp index 8fd88bccac..8c96c254ab 100644 --- a/src/Features/CSEditor.cpp +++ b/src/Features/CSEditor.cpp @@ -493,7 +493,7 @@ void CSEditor::DisplayPrecipitationInfo(RE::TESWeather* weather) } auto particleDensity = weather->precipitationData->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity).f; ImGui::BulletText(T(TKEY("particle_density"), "Particle Density: %.3f"), particleDensity); - GET_INSTANCE_MEMBER(particleTexture, weather->precipitationData) + auto& particleTexture = weather->precipitationData->GetRuntimeData().particleTexture; if (!particleTexture.textureName.empty()) { ImGui::BulletText(T(TKEY("particle_texture"), "Particle Texture: %s"), particleTexture.textureName.c_str()); } else { diff --git a/src/Features/CloudShadows.cpp b/src/Features/CloudShadows.cpp index fe958a0ce1..2a3d5392d8 100644 --- a/src/Features/CloudShadows.cpp +++ b/src/Features/CloudShadows.cpp @@ -99,7 +99,7 @@ void CloudShadows::ModifySky(RE::BSRenderPass* Pass) { auto shadowState = globals::game::shadowState; - GET_INSTANCE_MEMBER(cubeMapRenderTarget, shadowState); + auto& cubeMapRenderTarget = shadowState->GetRuntimeData().cubeMapRenderTarget; if (cubeMapRenderTarget != RE::RENDER_TARGETS_CUBEMAP::kREFLECTIONS) return; diff --git a/src/Features/DynamicCubemaps.h b/src/Features/DynamicCubemaps.h index 7c249a64c1..bf94b7db0f 100644 --- a/src/Features/DynamicCubemaps.h +++ b/src/Features/DynamicCubemaps.h @@ -134,8 +134,7 @@ struct DynamicCubemaps : Feature { T("feature.dynamic_cubemaps.key_feature_1", "Real-time environment capture for realistic reflections"), T("feature.dynamic_cubemaps.key_feature_2", "Dynamic cube map generation based on camera position"), T("feature.dynamic_cubemaps.key_feature_3", "Enhanced water reflections with environmental details"), - T("feature.dynamic_cubemaps.key_feature_4", "Support for standard rendering modes"), - T("feature.dynamic_cubemaps.key_feature_5", "Optimized cubemap inference and irradiance calculation") } }; + T("feature.dynamic_cubemaps.key_feature_4", "Optimized cubemap inference and irradiance calculation") } }; }; virtual std::vector> GetShaderDefineOptions() override; diff --git a/src/Features/ExponentialHeightFog.cpp b/src/Features/ExponentialHeightFog.cpp index 57e1a1b3a3..24ec1fef68 100644 --- a/src/Features/ExponentialHeightFog.cpp +++ b/src/Features/ExponentialHeightFog.cpp @@ -440,8 +440,7 @@ void ExponentialHeightFog::Prepass() 0.0f }; - cb.clipToWorld[0] = globals::game::frameBufferCached.GetCameraViewProjUnjittered().Invert(); - cb.clipToWorld[1] = cb.clipToWorld[0]; + cb.clipToWorld = globals::game::frameBufferCached.GetCameraViewProjUnjittered().Invert(); for (uint32_t i = 0; i < std::size(cb.frameJitterOffsets); i++) { const uint32_t temporalFrame = (globals::state->frameCount - i) & 1023u; diff --git a/src/Features/ExponentialHeightFog.h b/src/Features/ExponentialHeightFog.h index 669f093cc9..93b032b591 100644 --- a/src/Features/ExponentialHeightFog.h +++ b/src/Features/ExponentialHeightFog.h @@ -83,7 +83,7 @@ struct ExponentialHeightFog : Feature DirectX::XMUINT4 gridSizeAndFlags = {}; float4 invGridSizeAndNearFade = {}; float4 gridZParams = {}; - float4x4 clipToWorld[2] = {}; + float4x4 clipToWorld = {}; float4 frameJitterOffsets[16] = {}; float4 historyParameters = {}; float4 jitterParameters = {}; // x = LightScatteringSampleJitterMultiplier, y = StateFrameIndexMod8, zw = unused diff --git a/src/Features/LightLimitFix.cpp b/src/Features/LightLimitFix.cpp index 719f9dbc4c..fbbaf86ec2 100644 --- a/src/Features/LightLimitFix.cpp +++ b/src/Features/LightLimitFix.cpp @@ -251,7 +251,7 @@ void LightLimitFix::BSLightingShader_SetupGeometry_GeometrySetupConstantPointLig if (i < a_pass->numShadowLights) { auto* shadowLight = static_cast(bsLight); - GET_INSTANCE_MEMBER(maskIndex, shadowLight); + auto& maskIndex = shadowLight->GetRuntimeData().maskIndex; light.shadowMaskIndex = maskIndex; light.lightFlags.set(LightFlags::Shadow); } @@ -265,7 +265,7 @@ void LightLimitFix::BSLightingShader_SetupGeometry_GeometrySetupConstantPointLig if (!bsLight) continue; auto* shadowLight = static_cast(bsLight); - GET_INSTANCE_MEMBER(maskIndex, shadowLight); + auto& maskIndex = shadowLight->GetRuntimeData().maskIndex; strictLightDataTemp.ShadowBitMask |= (1u << maskIndex); } } @@ -307,7 +307,7 @@ void LightLimitFix::SetLightPosition(LightLimitFix::LightData& a_light, RE::NiPo RE::NiPoint3 eyePosition; if (a_cached) { - eyePosition = eyePositionCached[0]; + eyePosition = eyePositionCached; } else { eyePosition = globals::game::shadowState->GetRuntimeData().posAdjust.getEye(0); } @@ -386,7 +386,7 @@ void LightLimitFix::UpdateLights() { auto eyePosition = globals::game::frameBufferCached.GetCameraPosAdjust(); - eyePositionCached[0] = { eyePosition.x, eyePosition.y, eyePosition.z }; + eyePositionCached = { eyePosition.x, eyePosition.y, eyePosition.z }; } eastl::vector lightsData{}; @@ -441,7 +441,7 @@ void LightLimitFix::UpdateLights() if (bsLight->IsShadowLight()) { auto* shadowLight = static_cast(bsLight); - GET_INSTANCE_MEMBER(maskIndex, shadowLight); + auto& maskIndex = shadowLight->GetRuntimeData().maskIndex; light.shadowMaskIndex = maskIndex; light.lightFlags.set(LightFlags::Shadow); } diff --git a/src/Features/LightLimitFix.h b/src/Features/LightLimitFix.h index fa3cc5ad82..647eabf281 100644 --- a/src/Features/LightLimitFix.h +++ b/src/Features/LightLimitFix.h @@ -134,7 +134,7 @@ struct LightLimitFix : OverlayFeature float lightsNear = 1; float lightsFar = 16384; - RE::NiPoint3 eyePositionCached[1]{}; + RE::NiPoint3 eyePositionCached{}; bool wasEmpty = false; bool wasWorld = false; int previousRoomIndex = -1; diff --git a/src/Features/ScreenSpaceGI.cpp b/src/Features/ScreenSpaceGI.cpp index 65c7297af3..df3534a6aa 100644 --- a/src/Features/ScreenSpaceGI.cpp +++ b/src/Features/ScreenSpaceGI.cpp @@ -696,7 +696,7 @@ void ScreenSpaceGI::DrawSSGI() auto context = globals::d3d::context; auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton(); - GET_INSTANCE_MEMBER(BSImagespaceShaderISSAOBlurH, imageSpaceManager); + auto& BSImagespaceShaderISSAOBlurH = imageSpaceManager->GetRuntimeData().BSImagespaceShaderISSAOBlurH; // Toggle vanilla SSAO static bool* enableSSAO = reinterpret_cast(reinterpret_cast(BSImagespaceShaderISSAOBlurH.get()) + 0x50LL); diff --git a/src/Features/TerrainBlending.cpp b/src/Features/TerrainBlending.cpp index 7643d95e1d..b8f2fd22db 100644 --- a/src/Features/TerrainBlending.cpp +++ b/src/Features/TerrainBlending.cpp @@ -745,7 +745,7 @@ void TerrainBlending::TerrainShaderHacks() auto dsv = terrainDepth.views[0]; context->OMSetRenderTargets(0, nullptr, dsv); auto shadowState = globals::game::shadowState; - GET_INSTANCE_MEMBER(currentVertexShader, shadowState) + auto& currentVertexShader = shadowState->GetRuntimeData().currentVertexShader; context->VSSetShader((ID3D11VertexShader*)currentVertexShader->shader, NULL, NULL); } renderAltTerrain = !renderAltTerrain; @@ -1019,9 +1019,9 @@ void TerrainBlending::RenderTerrainBlendingPasses() if (globals::state->frameAnnotations) globals::state->BeginPerfEvent("Terrain Blending - Render Passes"); - GET_INSTANCE_MEMBER(alphaBlendMode, shadowState) - GET_INSTANCE_MEMBER(alphaBlendWriteMode, shadowState) - GET_INSTANCE_MEMBER(depthStencilDepthMode, shadowState) + auto& alphaBlendMode = shadowState->GetRuntimeData().alphaBlendMode; + auto& alphaBlendWriteMode = shadowState->GetRuntimeData().alphaBlendWriteMode; + auto& depthStencilDepthMode = shadowState->GetRuntimeData().depthStencilDepthMode; // Reset alpha write and enable alpha blending alphaBlendWriteMode = 1; diff --git a/src/Features/Upscaling.cpp b/src/Features/Upscaling.cpp index 45c0ef2ce6..67fcea1dad 100644 --- a/src/Features/Upscaling.cpp +++ b/src/Features/Upscaling.cpp @@ -878,7 +878,7 @@ void Upscaling::ConfigureTAA() auto upscaleMethod = GetUpscaleMethod(); auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton(); - GET_INSTANCE_MEMBER(BSImagespaceShaderISTemporalAA, imageSpaceManager); + auto& BSImagespaceShaderISTemporalAA = imageSpaceManager->GetRuntimeData().BSImagespaceShaderISTemporalAA; // Force enable TAA if needed BSImagespaceShaderISTemporalAA->taaEnabled = upscaleMethod != UpscaleMethod::kNONE; @@ -1015,7 +1015,7 @@ void Upscaling::SetupResources() void Upscaling::ClearShaderCache() { - for (int i = 0; i < 5; ++i) { + for (int i = 0; i < 4; ++i) { encodeTexturesCS[i] = nullptr; // com_ptr automatically releases } @@ -1680,7 +1680,7 @@ void Upscaling::Main_PostProcessing::thunk(RE::ImageSpaceManager* a_this, uint32 upscaling.ApplySharpening(); auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton(); - GET_INSTANCE_MEMBER(BSImagespaceShaderISTemporalAA, imageSpaceManager); + auto& BSImagespaceShaderISTemporalAA = imageSpaceManager->GetRuntimeData().BSImagespaceShaderISTemporalAA; BSImagespaceShaderISTemporalAA->taaEnabled = upscaleMethod == UpscaleMethod::kTAA; diff --git a/src/Features/Upscaling.h b/src/Features/Upscaling.h index 3b179c244d..91ba36dea9 100644 --- a/src/Features/Upscaling.h +++ b/src/Features/Upscaling.h @@ -126,8 +126,7 @@ struct Upscaling : Feature void CreateUpscalingTextureResources(UpscaleMethod a_upscalemethod); void DestroyUpscalingTextureResources(UpscaleMethod a_upscalemethod); - winrt::com_ptr encodeTexturesCS[5]; // One for each UpscaleMethod - winrt::com_ptr encodeTexturesCSDepthOutput; // converts R24G8_TYPELESS depth to R32_FLOAT + winrt::com_ptr encodeTexturesCS[4]; // One for each UpscaleMethod (kNONE, kTAA, kFSR, kDLSS) ID3D11ComputeShader* GetEncodeTexturesCS(); winrt::com_ptr depthRefractionUpscalePS; diff --git a/src/FrameAnnotations.cpp b/src/FrameAnnotations.cpp index 49116a4170..52c51ae5da 100644 --- a/src/FrameAnnotations.cpp +++ b/src/FrameAnnotations.cpp @@ -955,7 +955,7 @@ namespace FrameAnnotations auto renderer = globals::game::renderer; for (size_t renderTargetIndex = 0; - renderTargetIndex < Util::GetRenderTargetCount(); ++renderTargetIndex) { + renderTargetIndex < RE::RENDER_TARGETS::kTOTAL; ++renderTargetIndex) { const auto renderTargetName = magic_enum::enum_name( static_cast(renderTargetIndex)); if (auto texture = renderer->GetRuntimeData().renderTargets[renderTargetIndex].texture) { @@ -976,7 +976,7 @@ namespace FrameAnnotations } for (size_t renderTargetIndex = 0; - renderTargetIndex < Util::GetDepthStencilCount(); + renderTargetIndex < RE::RENDER_TARGETS_DEPTHSTENCIL::kTOTAL; ++renderTargetIndex) { const auto renderTargetName = magic_enum::enum_name( static_cast( diff --git a/src/Globals.cpp b/src/Globals.cpp index 7a6ef3ff5f..d2944bf2aa 100644 --- a/src/Globals.cpp +++ b/src/Globals.cpp @@ -182,9 +182,9 @@ namespace globals cameraFar = (float*)(REL::RelocationID(517032, 403540).address() + 0x44); deltaTime = (float*)REL::RelocationID(523660, 410199).address(); - currentPixelShader = GET_INSTANCE_MEMBER_PTR(currentPixelShader, shadowState); - currentVertexShader = GET_INSTANCE_MEMBER_PTR(currentVertexShader, shadowState); - stateUpdateFlags = GET_INSTANCE_MEMBER_PTR(stateUpdateFlags, shadowState); + currentPixelShader = &(shadowState->GetRuntimeData().currentPixelShader); + currentVertexShader = &(shadowState->GetRuntimeData().currentVertexShader); + stateUpdateFlags = &(shadowState->GetRuntimeData().stateUpdateFlags); ui = RE::UI::GetSingleton(); calendar = RE::Calendar::GetSingleton(); diff --git a/src/Hooks.cpp b/src/Hooks.cpp index f8b9de8a6c..dc8b970cbd 100644 --- a/src/Hooks.cpp +++ b/src/Hooks.cpp @@ -238,7 +238,7 @@ namespace WaterBlendHistory { static void thunk(void* imageSpaceShader, RE::BSTriShape* shape, RE::ImageSpaceEffectParam* param) { - GET_INSTANCE_MEMBER(renderTargets, globals::game::shadowState) + auto& renderTargets = globals::game::shadowState->GetRuntimeData().renderTargets; // Clear stale coverage left by discarded non-water pixels const float clearColor[4] = { 0.f, 0.f, 0.f, 0.f }; diff --git a/src/State.cpp b/src/State.cpp index b90d7c35b4..ff35f3228f 100644 --- a/src/State.cpp +++ b/src/State.cpp @@ -200,7 +200,7 @@ void State::Reset() frameCount++; if (auto* imageSpaceManager = RE::ImageSpaceManager::GetSingleton()) { - GET_INSTANCE_MEMBER(BSImagespaceShaderApplyReflections, imageSpaceManager); + auto& BSImagespaceShaderApplyReflections = imageSpaceManager->GetRuntimeData().BSImagespaceShaderApplyReflections; // Disable reflections being applied to things other than water if (BSImagespaceShaderApplyReflections.get()) { diff --git a/src/Utils/D3D.cpp b/src/Utils/D3D.cpp index a8bf203c50..e7b4a5ba70 100644 --- a/src/Utils/D3D.cpp +++ b/src/Utils/D3D.cpp @@ -30,7 +30,7 @@ namespace Util { if (a_rtv) { if (auto r = globals::game::renderer) { - for (int i = 0; i < GetRenderTargetCount(); i++) { + for (int i = 0; i < RE::RENDER_TARGETS::kTOTAL; i++) { auto rt = r->GetRuntimeData().renderTargets[i]; if (a_rtv == rt.RTV) { return rt.SRV; @@ -45,7 +45,7 @@ namespace Util { if (a_srv) { if (auto r = globals::game::renderer) { - for (int i = 0; i < GetRenderTargetCount(); i++) { + for (int i = 0; i < RE::RENDER_TARGETS::kTOTAL; i++) { auto rt = r->GetRuntimeData().renderTargets[i]; if (a_srv == rt.SRV || a_srv == rt.SRVCopy) { return rt.RTV; @@ -62,7 +62,7 @@ namespace Util if (a_srv) { if (auto r = globals::game::renderer) { - for (int i = 0; i < GetRenderTargetCount(); i++) { + for (int i = 0; i < RE::RENDER_TARGETS::kTOTAL; i++) { auto rt = r->GetRuntimeData().renderTargets[i]; if (a_srv == rt.SRV || a_srv == rt.SRVCopy) { return std::string(magic_enum::enum_name(static_cast(i))); @@ -78,7 +78,7 @@ namespace Util using RENDER_TARGET = RE::RENDER_TARGETS::RENDER_TARGET; if (a_rtv) { if (auto r = globals::game::renderer) { - for (int i = 0; i < GetRenderTargetCount(); i++) { + for (int i = 0; i < RE::RENDER_TARGETS::kTOTAL; i++) { auto rt = r->GetRuntimeData().renderTargets[i]; if (a_rtv == rt.RTV) { return std::string(magic_enum::enum_name(static_cast(i))); diff --git a/src/Utils/D3D.h b/src/Utils/D3D.h index 06c9aa3ed5..8104442dcb 100644 --- a/src/Utils/D3D.h +++ b/src/Utils/D3D.h @@ -17,16 +17,6 @@ namespace Util void ApplyHighlightTintToTexture(ID3D11Texture2D* texture, bool isHighlighted, const std::array& highlightColor = { 1.0f, 0.5f, 0.0f, 0.3f }); HRESULT CreateOverlayTextureAndRTV(ID3D11Device* device, int width, int height, ID3D11Texture2D** outTex, ID3D11RenderTargetView** outRTV); - inline int GetRenderTargetCount() - { - return RE::RENDER_TARGETS::kTOTAL; - } - - inline int GetDepthStencilCount() - { - return RE::RENDER_TARGETS_DEPTHSTENCIL::kTOTAL; - } - HRESULT SaveTextureToFile(ID3D11Device* device, ID3D11DeviceContext* context, const std::filesystem::path& path, ID3D11Texture2D* tex); HRESULT LoadTextureFromFile(ID3D11Device* device, const std::filesystem::path& path, ID3D11Texture2D** outTex, ID3D11ShaderResourceView** outSRV); diff --git a/src/Utils/Game.h b/src/Utils/Game.h index 14fb3ee80c..45e4622db1 100644 --- a/src/Utils/Game.h +++ b/src/Utils/Game.h @@ -2,12 +2,6 @@ #pragma once -#define GET_INSTANCE_MEMBER(a_value, a_source) \ - auto& a_value = a_source->GetRuntimeData().a_value; - -#define GET_INSTANCE_MEMBER_PTR(a_value, a_source) \ - &(a_source->GetRuntimeData().a_value) - namespace Util { void StoreTransform3x4NoScale(DirectX::XMFLOAT3X4& Dest, const RE::NiTransform& Source); From e0081de82c388ff3b7bac01e30591628fc8d781a Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 00:03:32 +0100 Subject: [PATCH 13/20] fix(i18n): fix dynamic_cubemaps and light_limit_fix key numbering - zh_CN.json: rename key_feature_5 -> key_feature_4 for dynamic_cubemaps - LightLimitFix.h: remove duplicate key_feature_5 (same text as key_feature_4) - Regenerate en.json (2082 keys) Co-Authored-By: Claude Sonnet 4.6 --- package/SKSE/Plugins/CommunityShaders/Translations/en.json | 1 - .../SKSE/Plugins/CommunityShaders/Translations/zh_CN.json | 5 ++--- src/Features/LightLimitFix.h | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/en.json b/package/SKSE/Plugins/CommunityShaders/Translations/en.json index 20da806de0..d6c294423c 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/en.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/en.json @@ -856,7 +856,6 @@ "feature.light_limit_fix.key_feature_2": "Unlimited dynamic lights", "feature.light_limit_fix.key_feature_3": "Improved lighting quality", "feature.light_limit_fix.key_feature_4": "Enhanced visual realism", - "feature.light_limit_fix.key_feature_5": "Enhanced visual realism", "feature.light_limit_fix.light_limit_vis": "Light Limit Visualization", "feature.light_limit_fix.lights_vis_mode": "Lights Visualisation Mode", "feature.light_limit_fix.lights_vis_mode_tooltip": " - Visualise the light limit. Red when the \"strict\" light limit is reached (portal-strict lights).\n - Visualise the number of strict lights.\n - Visualise the number of clustered lights.\n - Visualize the Shadow Mask.\n", diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json index a15c5c3650..553addf164 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json @@ -556,7 +556,7 @@ "feature.dynamic_cubemaps.key_feature_1": "实时环境捕获,生成逼真反射", "feature.dynamic_cubemaps.key_feature_2": "基于摄像机位置的动态立方体贴图生成", "feature.dynamic_cubemaps.key_feature_3": "增强的水面反射,包含环境细节", - "feature.dynamic_cubemaps.key_feature_4": "支持标准和VR两种渲染模式", + "feature.dynamic_cubemaps.key_feature_4": "优化的立方体贴图推理与辐照度计算", "feature.dynamic_cubemaps.name": "动态立方体贴图", "feature.dynamic_cubemaps.roughness": "粗糙度", "feature.dynamic_cubemaps.screen_space_reflections": "屏幕空间反射", @@ -855,7 +855,6 @@ "feature.light_limit_fix.key_feature_2": "无限动态光源", "feature.light_limit_fix.key_feature_3": "提升光照质量", "feature.light_limit_fix.key_feature_4": "增强视觉真实感", - "feature.light_limit_fix.key_feature_5": "增强视觉真实感", "feature.light_limit_fix.light_limit_vis": "光源限制可视化", "feature.light_limit_fix.lights_vis_mode": "光源可视化模式", "feature.light_limit_fix.lights_vis_mode_tooltip": " - 可视化光源限制。当达到\"严格\"光源限制时为红色(传送门严格光源)。\n - 可视化严格光源的数量。\n - 可视化聚类光源的数量。\n - 可视化阴影遮罩。\n", @@ -2074,5 +2073,5 @@ "ui.dont_ask_again": "不再提示", "ui.search": "搜索...", "ui.search_features": "搜索功能...", - "feature.dynamic_cubemaps.key_feature_5": "优化的立方体贴图推理与辐照度计算" + "feature.light_limit_fix.key_feature_5": "增强视觉真实感" } diff --git a/src/Features/LightLimitFix.h b/src/Features/LightLimitFix.h index 647eabf281..35e160ee63 100644 --- a/src/Features/LightLimitFix.h +++ b/src/Features/LightLimitFix.h @@ -18,8 +18,7 @@ struct LightLimitFix : OverlayFeature { T("feature.light_limit_fix.key_feature_1", "Removes 4-light limit"), T("feature.light_limit_fix.key_feature_2", "Unlimited dynamic lights"), T("feature.light_limit_fix.key_feature_3", "Improved lighting quality"), - T("feature.light_limit_fix.key_feature_4", "Enhanced visual realism"), - T("feature.light_limit_fix.key_feature_5", "Enhanced visual realism") } }; + T("feature.light_limit_fix.key_feature_4", "Enhanced visual realism") } }; }; bool HasShaderDefine(RE::BSShader::Type) override { return true; }; From f957d2185d66c4c5859ae44728ce4505f83ac706 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 00:21:15 +0100 Subject: [PATCH 14/20] refactor: inline GetFlat() and suppress sk_hdr_png warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ShaderCache.h: remove GetFlat() from LightingPS/GrassPS/EffectPS — named 'Flat' to contrast with a VR variant that no longer exists; inline as default constructor directly in Get() - ScreenshotFeature.cpp: suppress C4244 double->float warning from third-party sk_hdr_png.hpp header with pragma push/pop Co-Authored-By: Claude Sonnet 4.6 --- src/Features/ScreenshotFeature.cpp | 3 +++ src/ShaderCache.h | 21 +++------------------ 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/Features/ScreenshotFeature.cpp b/src/Features/ScreenshotFeature.cpp index d7cf869caf..bf57ba97c7 100644 --- a/src/Features/ScreenshotFeature.cpp +++ b/src/Features/ScreenshotFeature.cpp @@ -17,7 +17,10 @@ #define I18N_KEY_PREFIX "feature.screenshot." #include +#pragma warning(push) +#pragma warning(disable : 4244) // double->float conversion in third-party header #include +#pragma warning(pop) #include #include diff --git a/src/ShaderCache.h b/src/ShaderCache.h index c5e73c42d1..15feb124ad 100644 --- a/src/ShaderCache.h +++ b/src/ShaderCache.h @@ -14,15 +14,10 @@ namespace ShaderConstants { static const LightingPS& Get() { - static LightingPS instance = GetFlat(); + static LightingPS instance{}; return instance; } - static LightingPS GetFlat() - { - return LightingPS{}; - } - const int32_t NumLightNumShadowLight = 0; const int32_t PointLightPosition = 1; const int32_t PointLightColor = 2; @@ -90,15 +85,10 @@ namespace ShaderConstants { static const GrassPS& Get() { - static GrassPS instance = GetFlat(); + static GrassPS instance{}; return instance; } - static GrassPS GetFlat() - { - return GrassPS{}; - } - const int32_t PBRFlags = 0; const int32_t PBRParams1 = 1; const int32_t PBRParams2 = 2; @@ -108,15 +98,10 @@ namespace ShaderConstants { static const EffectPS& Get() { - static EffectPS instance = GetFlat(); + static EffectPS instance{}; return instance; } - static EffectPS GetFlat() - { - return EffectPS{}; - } - const int32_t PropertyColor = 0; const int32_t AlphaTestRef = 1; const int32_t MembraneRimColor = 2; From 02a27e38c80f8c436e3ca6c689eaba444faa91ff Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 00:37:37 +0100 Subject: [PATCH 15/20] refactor: remove State::screenSize, read from gameViewport directly Remove the cached float2 screenSize from State. All call sites now read directly from globals::game::graphicsState->screenWidth/screenHeight (RE::BSGraphics::State) which is the authoritative game viewport. - State.h: remove float2 screenSize member - State.cpp: remove the screenSize assignment from texture dimensions; BufferDim and MipBias now read graphicsState directly - All other call sites (~13 files) updated to use graphicsState Also remove now-unused 'auto state = globals::state' local declarations left in ScreenSpaceShadows, FidelityFX, and Streamline functions where the only previous use was state->screenSize. Co-Authored-By: Claude Sonnet 4.6 --- src/Features/ExponentialHeightFog.cpp | 3 ++- src/Features/LightLimitFix.cpp | 4 ++-- src/Features/ScreenSpaceGI.cpp | 2 +- src/Features/ScreenSpaceShadows.cpp | 7 +++---- src/Features/Upscaling.cpp | 10 +++++----- src/Features/Upscaling/FidelityFX.cpp | 10 +++------- src/Features/Upscaling/RCAS/RCAS.cpp | 4 ++-- src/Features/Upscaling/Streamline.cpp | 12 +++--------- src/Features/VolumetricLighting.cpp | 6 ++---- src/Menu/ThemeManager.cpp | 4 ++-- src/State.cpp | 8 ++++---- src/State.h | 1 - src/Utils/Game.cpp | 4 ++-- 13 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/Features/ExponentialHeightFog.cpp b/src/Features/ExponentialHeightFog.cpp index 24ec1fef68..64108cdef1 100644 --- a/src/Features/ExponentialHeightFog.cpp +++ b/src/Features/ExponentialHeightFog.cpp @@ -211,7 +211,8 @@ void ExponentialHeightFog::EnsureVolumetricResources() { uint32_t pixelSize = std::clamp(settings.volumetricGridPixelSize, 4u, 64u); const uint32_t gridZ = std::clamp(settings.volumetricGridSizeZ, 16u, 160u); - auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); + float2 screenSz{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; + auto renderSize = Util::ConvertToDynamic(screenSz); auto getGridSize = [&renderSize, gridZ](uint32_t a_pixelSize) { return DirectX::XMUINT4{ diff --git a/src/Features/LightLimitFix.cpp b/src/Features/LightLimitFix.cpp index fbbaf86ec2..1031aa5865 100644 --- a/src/Features/LightLimitFix.cpp +++ b/src/Features/LightLimitFix.cpp @@ -77,7 +77,7 @@ LightLimitFix::PerFrame LightLimitFix::GetCommonBufferData() void LightLimitFix::SetupResources() { - auto screenSize = globals::state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; clusterSize[0] = ((uint)screenSize.x + 63) / 64; clusterSize[1] = ((uint)screenSize.y + 63) / 64; clusterSize[2] = 32; @@ -486,7 +486,7 @@ void LightLimitFix::UpdateStructure() lightsNear = *globals::game::cameraNear; lightsFar = *globals::game::cameraFar; - auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); + auto renderSize = Util::ConvertToDynamic(float2{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }); clusterSize[0] = ((uint)renderSize.x + 63) / 64; clusterSize[1] = ((uint)renderSize.y + 63) / 64; clusterSize[2] = 32; diff --git a/src/Features/ScreenSpaceGI.cpp b/src/Features/ScreenSpaceGI.cpp index df3534a6aa..90ef7915c4 100644 --- a/src/Features/ScreenSpaceGI.cpp +++ b/src/Features/ScreenSpaceGI.cpp @@ -732,7 +732,7 @@ void ScreenSpaceGI::DrawSSGI() auto rts = renderer->GetRuntimeData().renderTargets; auto deferred = globals::deferred; - float2 size = Util::ConvertToDynamic(globals::state->screenSize); + float2 size = Util::ConvertToDynamic(float2{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }); auto resolution = std::array{ (uint)size.x, (uint)size.y }; auto resChoices = std::array{ resolution, std::array{ resolution[0] >> 1, resolution[1] >> 1 }, std::array{ resolution[0] >> 2, resolution[1] >> 2 } diff --git a/src/Features/ScreenSpaceShadows.cpp b/src/Features/ScreenSpaceShadows.cpp index 99b7ab2197..f8c8536101 100644 --- a/src/Features/ScreenSpaceShadows.cpp +++ b/src/Features/ScreenSpaceShadows.cpp @@ -66,7 +66,7 @@ void ScreenSpaceShadows::ClearShaderCache() uint ScreenSpaceShadows::GetScaledSampleCount() { - float2 renderSize = Util::ConvertToDynamic(globals::state->screenSize); + float2 renderSize = Util::ConvertToDynamic(float2{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }); // Scale sample count based on both dimensions relative to 1920x1080 reference float2 referenceRes = { 1920.0f, 1080.0f }; @@ -106,8 +106,7 @@ ID3D11ComputeShader* ScreenSpaceShadows::GetComputeRaymarch() void ScreenSpaceShadows::DrawShadows() { ZoneScopedS(8); - auto state = globals::state; - TracyD3D11Zone(state->tracyCtx, "Screen Space Shadows"); + TracyD3D11Zone(globals::state->tracyCtx, "Screen Space Shadows"); auto context = globals::d3d::context; @@ -128,7 +127,7 @@ void ScreenSpaceShadows::DrawShadows() auto lightProjectionF = CalculateLightProjection(); - float2 renderSize = Util::ConvertToDynamic(state->screenSize); + float2 renderSize = Util::ConvertToDynamic(float2{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }); int viewportSize[2] = { (int)renderSize.x, (int)renderSize.y }; int minRenderBounds[2] = { 0, 0 }; diff --git a/src/Features/Upscaling.cpp b/src/Features/Upscaling.cpp index 67fcea1dad..bbab1a4e3c 100644 --- a/src/Features/Upscaling.cpp +++ b/src/Features/Upscaling.cpp @@ -220,7 +220,7 @@ void Upscaling::DrawSettings() // Display warning for DLSS resolution limits if (upscaleMethod == UpscaleMethod::kDLSS) { - auto screenSize = globals::state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; if (screenSize.x > streamline.MAX_RESOLUTION || screenSize.y > streamline.MAX_RESOLUTION) { Util::Text::Warning("Warning: Requested resolution %.0f x %.0f exceeds maximum supported resolution %d x %d for DLSS.", screenSize.x, screenSize.y, streamline.MAX_RESOLUTION, streamline.MAX_RESOLUTION); @@ -897,7 +897,7 @@ void Upscaling::ConfigureUpscaling(RE::BSGraphics::State* a_viewport) // Get full screen size auto state = globals::state; - auto screenSize = state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; auto screenWidth = static_cast(screenSize.x); auto screenHeight = static_cast(screenSize.y); @@ -1040,7 +1040,7 @@ void Upscaling::CopySharedD3D12Resources() { // Set up viewport for fullscreen rendering - auto screenSize = globals::state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; D3D11_VIEWPORT viewport = {}; viewport.TopLeftX = 0.0f; @@ -1379,7 +1379,7 @@ void Upscaling::Upscale() auto& normals = renderer->GetRuntimeData().renderTargets[globals::deferred->forwardRenderTargets[2]]; auto& depth = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); + auto renderSize = Util::ConvertToDynamic(float2{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }); uint32_t renderWidth = (uint32_t)renderSize.x; uint32_t renderHeight = (uint32_t)renderSize.y; @@ -1474,7 +1474,7 @@ void Upscaling::UpscaleDepth() return; } - auto screenSize = state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; if (screenSize.x <= 0.0f || screenSize.y <= 0.0f) { return; } diff --git a/src/Features/Upscaling/FidelityFX.cpp b/src/Features/Upscaling/FidelityFX.cpp index 3e202abef4..1e19197234 100644 --- a/src/Features/Upscaling/FidelityFX.cpp +++ b/src/Features/Upscaling/FidelityFX.cpp @@ -152,9 +152,7 @@ void FidelityFX::Present(bool a_useFrameGeneration, bool a_isHDR) configParameters.flags = 0; configParameters.allowAsyncWorkloads = true; - auto state = globals::state; - - auto renderSize = state->screenSize * upscaling.resolutionScale; + auto renderSize = float2{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight } * upscaling.resolutionScale; configParameters.generationRect.left = (swapChain.swapChainDesc.Width - swapChain.swapChainDesc.Width) / 2; configParameters.generationRect.top = (swapChain.swapChainDesc.Height - swapChain.swapChainDesc.Height) / 2; @@ -243,8 +241,6 @@ void FidelityFX::Present(bool a_useFrameGeneration, bool a_isHDR) void FidelityFX::CreateFSRResources() { - auto state = globals::state; - // Prevent multiple allocations if (fsrScratchBuffer) { logger::warn("[FidelityFX] FSR resources already created, skipping allocation"); @@ -270,7 +266,7 @@ void FidelityFX::CreateFSRResources() return; } - auto screenSize = state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; auto renderSize = Util::ConvertToDynamic(screenSize); uint32_t displayWidth = (uint32_t)screenSize.x; @@ -344,7 +340,7 @@ void FidelityFX::Upscale(ID3D11Resource* a_upscalingTexture, ID3D11Resource* a_r auto state = globals::state; auto& depthTexture = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - auto screenSize = state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; auto renderSize = Util::ConvertToDynamic(screenSize); auto& upscaling = globals::features::upscaling; diff --git a/src/Features/Upscaling/RCAS/RCAS.cpp b/src/Features/Upscaling/RCAS/RCAS.cpp index 46db9ef92e..576c14d714 100644 --- a/src/Features/Upscaling/RCAS/RCAS.cpp +++ b/src/Features/Upscaling/RCAS/RCAS.cpp @@ -48,8 +48,8 @@ void RCAS::ApplySharpen(ID3D11ShaderResourceView* inputSRV, ID3D11UnorderedAcces globals::profiler->BeginPass("Upscaling::RCAS"); state->BeginPerfEvent("RCAS Sharpening"); - uint32_t screenWidth = (uint32_t)state->screenSize.x; - uint32_t screenHeight = (uint32_t)state->screenSize.y; + uint32_t screenWidth = globals::game::graphicsState->screenWidth; + uint32_t screenHeight = globals::game::graphicsState->screenHeight; RCASConfig config{}; config.sharpness = sharpness; diff --git a/src/Features/Upscaling/Streamline.cpp b/src/Features/Upscaling/Streamline.cpp index bd457956a2..503210393f 100644 --- a/src/Features/Upscaling/Streamline.cpp +++ b/src/Features/Upscaling/Streamline.cpp @@ -327,11 +327,9 @@ bool Streamline::CheckFrameConstants(sl::ViewportHandle p_viewport) if (!EnsureFrameToken()) return false; - auto state = globals::state; - sl::Constants slConstants = {}; - slConstants.cameraAspectRatio = state->screenSize.x / state->screenSize.y; + slConstants.cameraAspectRatio = (float)globals::game::graphicsState->screenWidth / (float)globals::game::graphicsState->screenHeight; slConstants.cameraFOV = Util::GetVerticalFOVRad(); slConstants.cameraNear = *globals::game::cameraNear; @@ -419,10 +417,8 @@ void Streamline::SetDLSSOptions(sl::ViewportHandle p_viewport, uint32_t width) break; } - auto state = globals::state; - dlssOptions.outputWidth = width; - dlssOptions.outputHeight = (uint)state->screenSize.y; + dlssOptions.outputHeight = (uint)globals::game::graphicsState->screenHeight; // Detect HDR from kMAIN format at runtime { @@ -558,12 +554,10 @@ void Streamline::EvaluateDLSS(sl::ViewportHandle vp, void Streamline::Upscale(ID3D11Resource* a_upscalingTexture, ID3D11Resource* a_reactiveMask, ID3D11Resource* a_transparencyCompositionMask, ID3D11Resource* a_motionVectors) { - auto state = globals::state; - auto renderer = globals::game::renderer; auto& depthTexture = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; - auto screenSize = state->screenSize; + float2 screenSize{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; auto renderSize = Util::ConvertToDynamic(screenSize); // When RCAS sharpening is active, direct DLSS output to sharpenerTexture so RCAS can diff --git a/src/Features/VolumetricLighting.cpp b/src/Features/VolumetricLighting.cpp index 280427e632..60a1148d17 100644 --- a/src/Features/VolumetricLighting.cpp +++ b/src/Features/VolumetricLighting.cpp @@ -175,10 +175,8 @@ void VolumetricLighting::SetupResources() void VolumetricLighting::EarlyPrepass() { - auto renderSize = Util::ConvertToDynamic(globals::state->screenSize); - - int32_t width = static_cast(renderSize.x); - int32_t height = static_cast(renderSize.y); + int32_t width = static_cast((float)globals::game::graphicsState->screenWidth); + int32_t height = static_cast((float)globals::game::graphicsState->screenHeight); if (width != vlData.screenX || height != vlData.screenY) { blurHCS = nullptr; diff --git a/src/Menu/ThemeManager.cpp b/src/Menu/ThemeManager.cpp index dea9cbdef1..87fb28acfd 100644 --- a/src/Menu/ThemeManager.cpp +++ b/src/Menu/ThemeManager.cpp @@ -1018,9 +1018,9 @@ float ThemeManager::ResolveFontSize(const Menu& menu) // Compute dynamic size from screen resolution float dynamicSize; - if (globals::state && globals::state->screenSize.y > 0) { + if (globals::game::graphicsState && globals::game::graphicsState->screenHeight > 0) { // Use current screen height - dynamicSize = globals::state->screenSize.y * Constants::DEFAULT_FONT_RATIO; + dynamicSize = (float)globals::game::graphicsState->screenHeight * Constants::DEFAULT_FONT_RATIO; } else { // Fallback: use default font size logger::warn("ThemeManager::ResolveFontSize() - Falling back to Constants::DEFAULT_FONT_SIZE due to missing screen height."); diff --git a/src/State.cpp b/src/State.cpp index ff35f3228f..9e43113329 100644 --- a/src/State.cpp +++ b/src/State.cpp @@ -781,7 +781,6 @@ void State::SetupResources() D3D11_TEXTURE2D_DESC texDesc{}; renderer->GetRuntimeData().renderTargets[RE::RENDER_TARGETS::kMAIN].texture->GetDesc(&texDesc); - screenSize = { (float)texDesc.Width, (float)texDesc.Height }; globals::d3d::context->QueryInterface(__uuidof(pPerf), reinterpret_cast(&pPerf)); featureLevel = globals::d3d::device->GetFeatureLevel(); @@ -972,7 +971,7 @@ void State::UpdateSharedData([[maybe_unused]] bool a_inWorld, [[maybe_unused]] b data.DirLightDirection.Normalize(); data.CameraData = Util::GetCameraData(); - data.BufferDim = { screenSize.x, screenSize.y, 1.0f / screenSize.x, 1.0f / screenSize.y }; + data.BufferDim = { (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight, 1.0f / (float)globals::game::graphicsState->screenWidth, 1.0f / (float)globals::game::graphicsState->screenHeight }; data.Timer = timer; auto temporal = Util::GetTemporal(); @@ -1006,8 +1005,9 @@ void State::UpdateSharedData([[maybe_unused]] bool a_inWorld, [[maybe_unused]] b if (upscaling.loaded) { auto upscaleMethod = upscaling.GetUpscaleMethod(); if (temporal && upscaleMethod != Upscaling::UpscaleMethod::kTAA) { - auto renderSize = Util::ConvertToDynamic(screenSize, true); - data.MipBias = std::log2f(renderSize.x / screenSize.x); + float2 screenSz{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; + auto renderSize = Util::ConvertToDynamic(screenSz, true); + data.MipBias = std::log2f(renderSize.x / screenSz.x); if (upscaleMethod == Upscaling::UpscaleMethod::kDLSS) data.MipBias -= 1.0f; } else { diff --git a/src/State.h b/src/State.h index 32d811a822..bf42bd6039 100644 --- a/src/State.h +++ b/src/State.h @@ -276,7 +276,6 @@ class State uint frameCount = 0; // Skyrim constants - float2 screenSize = {}; D3D_FEATURE_LEVEL featureLevel; TracyD3D11Ctx tracyCtx = nullptr; // Tracy context diff --git a/src/Utils/Game.cpp b/src/Utils/Game.cpp index 08619347e2..641915f20a 100644 --- a/src/Utils/Game.cpp +++ b/src/Utils/Game.cpp @@ -124,7 +124,7 @@ namespace Util static float& cameraFOVDeg = (*(float*)(REL::RelocationID(513786, 388785).address())); // FOV degrees float hFOVRad = cameraFOVDeg * (3.14159265359f / 180.0f); float unitHalfWidth = tan(hFOVRad / 2); // This is same as camera frustum RL - float unitHalfHeight = unitHalfWidth / (globals::state->screenSize.x / globals::state->screenSize.y); // frustum TB + float unitHalfHeight = unitHalfWidth / ((float)globals::game::graphicsState->screenWidth / (float)globals::game::graphicsState->screenHeight); // frustum TB float vFOVRad = 2.0f * atan(unitHalfHeight); return vFOVRad; } @@ -144,7 +144,7 @@ namespace Util DispatchCount GetScreenDispatchCount(bool a_dynamic) { - float2 resolution = globals::state->screenSize; + float2 resolution{ (float)globals::game::graphicsState->screenWidth, (float)globals::game::graphicsState->screenHeight }; if (a_dynamic) ConvertToDynamic(resolution); From c5f86e0bfe01e9c9a8cc689a812f8e71ed4fee30 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 00:59:49 +0100 Subject: [PATCH 16/20] refactor: flatten VR per-eye arrays in LightData and SSGICB LightData::positionWS[2] -> positionWS: - LightLimitFix.h: PositionOpt positionWS[2] -> plain positionWS - LightLimitFix.cpp: positionWS[0].data -> positionWS.data - Common.hlsli: float4 positionWS[2] -> float4 positionWS - All shader consumers: light.positionWS[0].xyz -> light.positionWS.xyz (Effect, Lighting, Particle, RunGrass, Water, VolumetricFog, ClusterCulling) - Debug format string: remove stale positionWS[1] reference SSGICB PrevInvViewMat[2] / NDCToViewMul[2] / NDCToViewAdd[2]: - ScreenSpaceGI.h: flatten to plain float4x4 / float4 / float4 - ScreenSpaceGI.cpp: static prevInvView[2] -> plain; remove [0] indexing - common.hlsli: float4x4 PrevInvViewMat[2] -> float4x4 PrevInvViewMat - radianceDisocc.cs.hlsl: PrevInvViewMat[0] -> PrevInvViewMat Co-Authored-By: Claude Sonnet 4.6 --- .../VolumetricFogLightScatteringCS.hlsl | 2 +- .../Shaders/LightLimitFix/ClusterCullingCS.hlsl | 2 +- .../Light Limit Fix/Shaders/LightLimitFix/Common.hlsli | 2 +- .../Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli | 2 +- .../Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl | 2 +- package/Shaders/Effect.hlsl | 2 +- package/Shaders/Lighting.hlsl | 2 +- package/Shaders/Particle.hlsl | 2 +- package/Shaders/RunGrass.hlsl | 4 ++-- package/Shaders/Water.hlsl | 2 +- src/Features/LightLimitFix.cpp | 6 +++--- src/Features/LightLimitFix.h | 6 +++--- src/Features/ScreenSpaceGI.cpp | 10 +++++----- src/Features/ScreenSpaceGI.h | 6 +++--- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl index 2eb4d819cf..216922ce54 100644 --- a/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl +++ b/features/Exponential Height Fog/Shaders/ExponentialHeightFog/VolumetricFogLightScatteringCS.hlsl @@ -280,7 +280,7 @@ float3 AccumulateLocalLightScattering( if (light.lightFlags & LightLimitFix::LightFlags::Disabled) continue; - float3 toLight = light.positionWS[0].xyz - positionWS; + float3 toLight = light.positionWS.xyz - positionWS; float distanceSqr = dot(toLight, toLight); if (distanceSqr < 1e-6f) continue; diff --git a/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl b/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl index 4cff80fd16..d2b02a9173 100644 --- a/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl +++ b/features/Light Limit Fix/Shaders/LightLimitFix/ClusterCullingCS.hlsl @@ -55,7 +55,7 @@ bool LightIntersectsCluster(float3 position, float radiusSquared, ClusterAABB cl float radiusSquared = light.radius * light.radius; - float3 positionVS = FrameBuffer::WorldToView(light.positionWS[0].xyz); + float3 positionVS = FrameBuffer::WorldToView(light.positionWS.xyz); [branch] if (LightIntersectsCluster(positionVS, radiusSquared, cluster)) { diff --git a/features/Light Limit Fix/Shaders/LightLimitFix/Common.hlsli b/features/Light Limit Fix/Shaders/LightLimitFix/Common.hlsli index f2388d9ddd..38bd26679c 100644 --- a/features/Light Limit Fix/Shaders/LightLimitFix/Common.hlsli +++ b/features/Light Limit Fix/Shaders/LightLimitFix/Common.hlsli @@ -40,7 +40,7 @@ struct Light float invRadius; float fadeZone; float sizeBias; - float4 positionWS[2]; + float4 positionWS; uint4 roomFlags; uint lightFlags; uint shadowLightIndex; diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli b/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli index d87adfb493..bbcdf9f28e 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli @@ -25,7 +25,7 @@ cbuffer SSGICB : register(b1) { - float4x4 PrevInvViewMat[2]; + float4x4 PrevInvViewMat; float4 NDCToViewMul; float4 NDCToViewAdd; diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl index 2b188e533b..f243bad154 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/radianceDisocc.cs.hlsl @@ -47,7 +47,7 @@ void readHistory( return; float3 prev_pos = ScreenToViewPosition(screen_pos, prev_depth); - prev_pos = ViewToWorldPosition(prev_pos, PrevInvViewMat[0]) + FrameBuffer::CameraPreviousPosAdjust.xyz; + prev_pos = ViewToWorldPosition(prev_pos, PrevInvViewMat) + FrameBuffer::CameraPreviousPosAdjust.xyz; float3 delta_pos = curr_pos - prev_pos; // float normal_prod = dot(curr_normal, prev_normal); diff --git a/package/Shaders/Effect.hlsl b/package/Shaders/Effect.hlsl index 6942bf9992..1f641a143f 100644 --- a/package/Shaders/Effect.hlsl +++ b/package/Shaders/Effect.hlsl @@ -708,7 +708,7 @@ PS_OUTPUT main(PS_INPUT input) if (LightLimitFix::IsLightIgnored(light) || light.lightFlags & LightLimitFix::LightFlags::Shadow) { continue; } - float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS.xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index ea822742b8..5a7740508f 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -2751,7 +2751,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) continue; } - float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS.xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) diff --git a/package/Shaders/Particle.hlsl b/package/Shaders/Particle.hlsl index 9eb46ccb2b..b21cc3c28a 100644 --- a/package/Shaders/Particle.hlsl +++ b/package/Shaders/Particle.hlsl @@ -283,7 +283,7 @@ PS_OUTPUT main(PS_INPUT input) if (LightLimitFix::IsLightIgnored(light) || light.lightFlags & LightLimitFix::LightFlags::Shadow) { continue; } - float3 lightDirection = light.positionWS[0].xyz - positionWS.xyz; + float3 lightDirection = light.positionWS.xyz - positionWS.xyz; float lightDist = length(lightDirection); # if defined(ISL) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index a86f036589..d41f5258de 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -584,7 +584,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) uint clusteredLightIndex = LightLimitFix::lightList[lightOffset + i]; LightLimitFix::Light light = LightLimitFix::lights[clusteredLightIndex]; - float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS.xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) @@ -776,7 +776,7 @@ PS_OUTPUT main(PS_INPUT input) uint clusteredLightIndex = LightLimitFix::lightList[lightOffset + i]; LightLimitFix::Light light = LightLimitFix::lights[clusteredLightIndex]; - float3 lightDirection = light.positionWS[0].xyz - input.WorldPosition.xyz; + float3 lightDirection = light.positionWS.xyz - input.WorldPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) diff --git a/package/Shaders/Water.hlsl b/package/Shaders/Water.hlsl index 1bb6b1de96..899ebe588a 100644 --- a/package/Shaders/Water.hlsl +++ b/package/Shaders/Water.hlsl @@ -1114,7 +1114,7 @@ PS_OUTPUT main(PS_INPUT input) continue; } - float3 lightDirection = light.positionWS[0].xyz - input.WPosition.xyz; + float3 lightDirection = light.positionWS.xyz - input.WPosition.xyz; float lightDist = length(lightDirection); # if defined(ISL) diff --git a/src/Features/LightLimitFix.cpp b/src/Features/LightLimitFix.cpp index 1031aa5865..50bdec615a 100644 --- a/src/Features/LightLimitFix.cpp +++ b/src/Features/LightLimitFix.cpp @@ -313,9 +313,9 @@ void LightLimitFix::SetLightPosition(LightLimitFix::LightData& a_light, RE::NiPo } auto worldPos = a_initialPosition - eyePosition; - a_light.positionWS[0].data.x = worldPos.x; - a_light.positionWS[0].data.y = worldPos.y; - a_light.positionWS[0].data.z = worldPos.z; + a_light.positionWS.data.x = worldPos.x; + a_light.positionWS.data.y = worldPos.y; + a_light.positionWS.data.z = worldPos.z; } void LightLimitFix::Prepass() diff --git a/src/Features/LightLimitFix.h b/src/Features/LightLimitFix.h index 35e160ee63..b3ac4cd50a 100644 --- a/src/Features/LightLimitFix.h +++ b/src/Features/LightLimitFix.h @@ -49,7 +49,7 @@ struct LightLimitFix : OverlayFeature float invRadius; float fadeZone; float sizeBias; - PositionOpt positionWS[2]; + PositionOpt positionWS; uint128_t roomFlags = uint32_t(0); stl::enumeration lightFlags; uint32_t shadowMaskIndex = 0; @@ -258,10 +258,10 @@ struct fmt::formatter auto format(const LightLimitFix::LightData& l, format_context& ctx) const -> format_context::iterator { // ctx.out() is an output iterator to write to. - return fmt::format_to(ctx.out(), "{{address {:x} color {} radius {} posWS {} {}}}", + return fmt::format_to(ctx.out(), "{{address {:x} color {} radius {} posWS {}}}", reinterpret_cast(&l), (Vector3)l.color, l.radius, - (Vector3)l.positionWS[0].data, (Vector3)l.positionWS[1].data); + (Vector3)l.positionWS.data); } }; diff --git a/src/Features/ScreenSpaceGI.cpp b/src/Features/ScreenSpaceGI.cpp index 90ef7915c4..d3e311d3bd 100644 --- a/src/Features/ScreenSpaceGI.cpp +++ b/src/Features/ScreenSpaceGI.cpp @@ -643,18 +643,18 @@ void ScreenSpaceGI::UpdateSB() float2 dynres = Util::ConvertToDynamic(res); dynres = { floor(dynres.x), floor(dynres.y) }; - static float4x4 prevInvView[2] = {}; + static float4x4 prevInvView = {}; SSGICB data; { { auto eye = globals::game::shadowState->GetRuntimeData().cameraData.getEye(0); - data.PrevInvViewMat[0] = prevInvView[0]; - data.NDCToViewMul[0] = { 2.0f / eye.projMat(0, 0), -2.0f / eye.projMat(1, 1) }; - data.NDCToViewAdd[0] = { -1.0f / eye.projMat(0, 0), 1.0f / eye.projMat(1, 1) }; + data.PrevInvViewMat = prevInvView; + data.NDCToViewMul = { 2.0f / eye.projMat(0, 0), -2.0f / eye.projMat(1, 1), 0.0f, 0.0f }; + data.NDCToViewAdd = { -1.0f / eye.projMat(0, 0), 1.0f / eye.projMat(1, 1), 0.0f, 0.0f }; - prevInvView[0] = eye.viewMat.Invert(); + prevInvView = eye.viewMat.Invert(); } data.TexDim = res; diff --git a/src/Features/ScreenSpaceGI.h b/src/Features/ScreenSpaceGI.h index 72f853d6f3..96a05f588c 100644 --- a/src/Features/ScreenSpaceGI.h +++ b/src/Features/ScreenSpaceGI.h @@ -80,9 +80,9 @@ struct ScreenSpaceGI : Feature struct alignas(16) SSGICB { - float4x4 PrevInvViewMat[2]; - float2 NDCToViewMul[2]; - float2 NDCToViewAdd[2]; + float4x4 PrevInvViewMat; + float4 NDCToViewMul; + float4 NDCToViewAdd; float2 TexDim; float2 RcpTexDim; // From d1fa98b00f1d17c22ff51cdb4510962eabbf037f Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 01:09:57 +0100 Subject: [PATCH 17/20] refactor: rename VR-era eye position identifiers - Util::GetAverageEyePosition() -> GetEyePosition() (previously averaged left+right eye in VR; now just returns single camera eye position) - TerrainBlending::averageEyePosition -> eyePosition (same naming artifact) Co-Authored-By: Claude Sonnet 4.6 --- src/Features/DynamicCubemaps.cpp | 2 +- src/Features/GrassCollision.cpp | 4 ++-- src/Features/Skylighting.cpp | 2 +- src/Features/TerrainBlending.cpp | 4 ++-- src/Features/TerrainBlending.h | 2 +- src/Utils/Game.cpp | 4 ++-- src/Utils/Game.h | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Features/DynamicCubemaps.cpp b/src/Features/DynamicCubemaps.cpp index 696221b4d0..69dd37837e 100644 --- a/src/Features/DynamicCubemaps.cpp +++ b/src/Features/DynamicCubemaps.cpp @@ -320,7 +320,7 @@ void DynamicCubemaps::UpdateCubemapCapture(bool a_reflections) static float3 cameraPreviousPosAdjust[2] = { { 0, 0, 0 }, { 0, 0, 0 } }; updateData.CameraPreviousPosAdjust = cameraPreviousPosAdjust[index]; - auto eyePosition = Util::GetAverageEyePosition(); + auto eyePosition = Util::GetEyePosition(); cameraPreviousPosAdjust[index] = { eyePosition.x, eyePosition.y, eyePosition.z }; diff --git a/src/Features/GrassCollision.cpp b/src/Features/GrassCollision.cpp index 638970dadf..eb288c6627 100644 --- a/src/Features/GrassCollision.cpp +++ b/src/Features/GrassCollision.cpp @@ -40,7 +40,7 @@ void GrassCollision::QueueCollisions() return; eastl::vector actorCandidates{}; - RE::NiPoint3 cameraPosition = Util::GetAverageEyePosition(); + RE::NiPoint3 cameraPosition = Util::GetEyePosition(); auto addActorCandidate = [&](RE::ActorHandle a_handle) { auto actor = a_handle.get(); @@ -160,7 +160,7 @@ void GrassCollision::Update() static float2 prevCellID = { 0, 0 }; - auto eyePosNI = Util::GetAverageEyePosition(); + auto eyePosNI = Util::GetEyePosition(); static auto prevEyePosNI = eyePosNI; auto eyePos = float2{ eyePosNI.x, eyePosNI.y }; diff --git a/src/Features/Skylighting.cpp b/src/Features/Skylighting.cpp index db2694252b..6a44d86b0d 100644 --- a/src/Features/Skylighting.cpp +++ b/src/Features/Skylighting.cpp @@ -174,7 +174,7 @@ Skylighting::SkylightingCB Skylighting::GetCommonBufferData(bool a_inWorld) static float3 prevCellID = { 0, 0, 0 }; - auto eyePosNI = Util::GetAverageEyePosition(); + auto eyePosNI = Util::GetEyePosition(); auto eyePos = float3{ eyePosNI.x, eyePosNI.y, eyePosNI.z }; float3 cellSize = { diff --git a/src/Features/TerrainBlending.cpp b/src/Features/TerrainBlending.cpp index b8f2fd22db..42dc7e81f1 100644 --- a/src/Features/TerrainBlending.cpp +++ b/src/Features/TerrainBlending.cpp @@ -855,7 +855,7 @@ void TerrainBlending::Hooks::Main_RenderDepth::thunk(bool a1, bool a2) globals::game::graphicsState->SetCameraData(RE::Main::WorldRootCamera(), 1); - singleton.averageEyePosition = Util::GetAverageEyePosition(); + singleton.eyePosition = Util::GetEyePosition(); const bool tbActive = shaderCache->IsEnabled() && singleton.settings.Enabled; const bool useBlendedDepthSRV = tbActive && ShouldUseBlendedDepthSRV(); @@ -907,7 +907,7 @@ void TerrainBlending::Hooks::BSBatchRenderer__RenderPassImmediately::thunk(RE::B bool inTerrain = a_pass->shaderProperty && a_pass->shaderProperty->flags.all(RE::BSShaderProperty::EShaderPropertyFlag::kMultiTextureLandscape); if (inTerrain && a_pass->geometry) { - if ((a_pass->geometry->worldBound.center.GetDistance(singleton.averageEyePosition) - a_pass->geometry->worldBound.radius) > 1024.0f) { + if ((a_pass->geometry->worldBound.center.GetDistance(singleton.eyePosition) - a_pass->geometry->worldBound.radius) > 1024.0f) { inTerrain = false; } } diff --git a/src/Features/TerrainBlending.h b/src/Features/TerrainBlending.h index 2be155c498..49325702ab 100644 --- a/src/Features/TerrainBlending.h +++ b/src/Features/TerrainBlending.h @@ -54,7 +54,7 @@ struct TerrainBlending : Feature bool renderTerrainDepth = false; bool renderAltTerrain = false; - RE::NiPoint3 averageEyePosition; + RE::NiPoint3 eyePosition; struct RenderPass { diff --git a/src/Utils/Game.cpp b/src/Utils/Game.cpp index 641915f20a..6455a60f1d 100644 --- a/src/Utils/Game.cpp +++ b/src/Utils/Game.cpp @@ -32,7 +32,7 @@ namespace Util { if (globals::game::shadowState) { if (auto tes = RE::TES::GetSingleton()) { - auto position = GetAverageEyePosition(); + auto position = GetEyePosition(); position.x += offsetX; position.y += offsetY; if (auto cell = tes->GetCell(position)) { @@ -93,7 +93,7 @@ namespace Util return float4(1.0f, 1.0f, 1.0f, -FLT_MAX); } - RE::NiPoint3 GetAverageEyePosition() + RE::NiPoint3 GetEyePosition() { auto shadowState = globals::game::shadowState; return shadowState->GetRuntimeData().posAdjust.getEye(); diff --git a/src/Utils/Game.h b/src/Utils/Game.h index 45e4622db1..fab94ced16 100644 --- a/src/Utils/Game.h +++ b/src/Utils/Game.h @@ -11,7 +11,7 @@ namespace Util bool GetTemporal(); float GetVerticalFOVRad(); - RE::NiPoint3 GetAverageEyePosition(); + RE::NiPoint3 GetEyePosition(); float2 ConvertToDynamic(float2 a_size, bool a_ignoreLock = false); From 9fb7778dff201bc65c4c3b604c9d22dc0b65ce1a Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 01:25:13 +0100 Subject: [PATCH 18/20] refactor: final VR naming/docs cleanup - LightLimitFix.cpp: replace direct posAdjust.getEye(0) with Util::GetEyePosition() for consistency with all other callers - LightLimitFix.cpp: clarify misleading cache comment (data comes from frameBufferCached, not from cameraData) - .claude/CLAUDE.md: remove VR presets (VR, PRE-AE), SkyrimVR deployment path, VR shader validation command, VR runtime patterns, VRUtils entry, and all references to VR as a supported target Co-Authored-By: Claude Sonnet 4.6 --- .claude/CLAUDE.md | 52 +++++++--------------------------- src/Features/LightLimitFix.cpp | 4 +-- 2 files changed, 13 insertions(+), 43 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 8bc6baafde..8fc8743987 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -21,12 +21,10 @@ powershell.exe -Command "./BuildRelease.bat [PRESET_NAME]" **Available Presets** (from CMakePresets.json): -- `ALL` (default) - Builds universal binary supporting SE/AE/VR runtime detection +- `ALL` (default) - Builds universal binary supporting SE/AE runtime detection - `SE` - Skyrim Special Edition only (compile-time targeting) - `AE` - Anniversary Edition only (compile-time targeting) -- `VR` - Skyrim VR only (compile-time targeting) -- `PRE-AE` - SE + VR (excludes AE) -- `FLATRIM` - SE + AE (excludes VR) +- `FLATRIM` - SE + AE - `ALL-TRACY` - Universal binary with Tracy profiler support enabled **User Preset Template**: @@ -51,7 +49,7 @@ powershell.exe -Command "./BuildRelease.bat [PRESET_NAME]" Set `CommunityShadersOutputDir` environment variable to semicolon-separated Skyrim Data directories: ``` -CommunityShadersOutputDir=F:/MySkyrimModpack/mods/CommunityShaders;F:/SteamLibrary/steamapps/common/SkyrimVR/Data;F:/SteamLibrary/steamapps/common/Skyrim Special Edition/Data +CommunityShadersOutputDir=F:/MySkyrimModpack/mods/CommunityShaders;F:/SteamLibrary/steamapps/common/Skyrim Special Edition/Data ``` ### Shader Development and Testing @@ -66,9 +64,6 @@ cmake --build ./build/ALL --target prepare_shaders # Full shader suite validation (can be time-consuming) hlslkit-compile --shader-dir build/ALL/aio/Shaders --output-dir build/ShaderCache --config .github/configs/shader-validation.yaml --max-warnings 0 --suppress-warnings X1519 -# VR-specific validation -hlslkit-compile --shader-dir build/ALL/aio/Shaders --output-dir build/ShaderCache --config .github/configs/shader-validation-vr.yaml --max-warnings 0 --suppress-warnings X1519 - # Targeted testing for faster development (recommended during development) # Test specific base shader hlslkit-compile --shader-dir build/ALL/aio/Shaders/Lighting.hlsl --output-dir build/ShaderCache --config .github/configs/shader-validation.yaml @@ -89,7 +84,7 @@ hlslkit-generate-defines --log CommunityShaders.log hlslkit-buffer-scan --features-dir features/ # Prove a shader refactor changed no behavior (compiles base ref vs working tree, -# compares DXBC across VR x HDR_OUTPUT permutations; exit 0 identical / 2 differs) +# compares DXBC across HDR_OUTPUT permutations; exit 0 identical / 2 differs) pwsh tools/verify-shader-refactor.ps1 package/Shaders/Foo.hlsl # bash: tools/verify-shader-refactor.sh ``` @@ -201,8 +196,7 @@ Each feature follows consistent structure: ### Cross-Platform Support -**Single Binary**: Supports SE/AE/VR through CommonLibSSE-NG runtime detection -**VR Adaptations**: Specialized rendering paths in `src/Features/VR/` +**Single Binary**: Supports SE/AE through CommonLibSSE-NG runtime detection **API Abstraction**: Dual DirectX 11 support with feature-specific rendering strategies ## Critical Dependencies @@ -232,20 +226,11 @@ CommonLibSSE-NG supports multiple Skyrim versions through sophisticated runtime - `SE` - Skyrim Special Edition only - `AE` - Anniversary Edition only -- `VR` - Skyrim VR only -- `ALL` - Multi-runtime support (default for this project) +- `ALL` - Multi-runtime SE/AE support (default for this project) **Compile-Time vs Runtime Patterns**: -**Single Runtime (compile-time)**: When targeting one version, `#ifdef ENABLE_SKYRIM_VR` conditionally compiles VR-specific code: - -```cpp -#ifdef ENABLE_SKYRIM_VR - virtual void Unk_09(UI_MENU_Unk09 a_unk); // VR-only vfunc -#endif -``` - -**Multi-Runtime (runtime detection)**: When targeting ALL, uses runtime accessors: +**Multi-Runtime (runtime detection)**: When targeting ALL, uses runtime accessors for SE vs AE differences: ```cpp // Runtime member access with different offsets per version @@ -253,26 +238,16 @@ auto& GetRuntimeData() { return REL::RelocateMemberIfNewer( SKSE::RUNTIME_SSE_1_6_629, this, 0x3D8, 0x3E0); } - -// VR-specific runtime data (only exists in VR) -auto& GetVRRuntimeData() { - return REL::RelocateMember(this, 0, 0x3D8); -} - -// Runtime detection -if (REL::Module::IsVR()) { - // VR-specific code path -} ``` **Key Runtime Utilities**: - `REL::RelocateMember()` - Access members with different offsets - `REL::RelocateVirtual()` - Call virtual functions with variant vtables -- `REL::Module::IsVR()`, `IsAE()`, `IsSE()` - Runtime version detection +- `REL::Module::IsAE()`, `IsSE()` - Runtime version detection - `REL::RelocationID()` - Dynamic address resolution based on version -**Critical for Development**: When modifying classes that inherit from game objects, always check if they have runtime-specific variations and use appropriate accessor patterns. +**Critical for Development**: When modifying classes that inherit from game objects, always check if they have runtime-specific variations (SE vs AE) and use appropriate accessor patterns. ## Core Architecture @@ -302,7 +277,6 @@ All graphics features are globally accessible for cross-feature coordination: - Materials: `extendedMaterials`, `hairSpecular`, `subsurfaceScattering` - Effects: `screenSpaceGI`, `screenSpaceShadows`, `waterEffects`, `wetnessEffects` - Environment: `cloudShadows`, `dynamicCubemaps`, `weatherEditor`, `skySync` -- VR: `vr` - VR-specific adaptations and coordinate transformations ### Shared Utilities (`src/Utils/`) @@ -311,7 +285,6 @@ Common functionality organized by domain: - `UI.h/cpp` - ImGui utilities, input mapping, and UI helper functions - `D3D.h/cpp` - DirectX utilities and helper functions - `Game.h/cpp` - Skyrim-specific game state and object utilities -- `VRUtils.h/cpp` - VR-specific utilities and coordinate transformations - `FileSystem.h/cpp` - File I/O and path manipulation helpers - `Format.h/cpp` - String formatting and conversion utilities - `Serialize.h/cpp` - JSON serialization helpers @@ -391,7 +364,6 @@ Feature versions are automatically extracted from `.ini` files and compiled into - **Deferred Rendering Impact**: Features hook into Skyrim's rendering pipeline, adding GPU workload - **Feature Toggles**: Users can disable individual features at boot if performance is impacted (`Disable at Boot` buttons) - **A/B Testing Framework**: Built-in performance comparison system for measuring feature impact -- **VR Performance**: VR has higher performance requirements; some features may need different settings - **Tracy Profiler**: Optional build-time integration (`TRACY_SUPPORT`) for detailed performance analysis **Shader Performance Patterns**: @@ -405,7 +377,6 @@ Feature versions are automatically extracted from `.ini` files and compiled into - **In-Game Profiling**: Use Tracy integration to measure actual frame impact - **Feature Isolation**: Test features individually to identify performance bottlenecks -- **Cross-Edition Impact**: SE/AE/VR may have different performance characteristics for the same feature ### Development Performance @@ -431,7 +402,7 @@ Feature versions are automatically extracted from `.ini` files and compiled into - **Performance Concerns**: If code could impact rendering performance, suggest optimizations or user toggles - **Security Risks**: Flag potential crashes from unvalidated user input, malformed configs, or unsafe DirectX operations -- **Runtime Compatibility**: Warn when code might break SE/AE/VR compatibility or suggest `REL::RelocateMember()` patterns +- **Runtime Compatibility**: Warn when code might break SE/AE compatibility or suggest `REL::RelocateMember()` patterns - **Buffer Conflicts**: Highlight potential GPU register conflicts and recommend hlslkit buffer scanning - **Graphics Best Practices**: Suggest more idiomatic DirectX/HLSL patterns when appropriate @@ -536,7 +507,7 @@ Full details: [Developers wiki — Patch Release Process](https://github.com/com ### Testing and Validation - **Build Verification**: Always test builds after significant refactoring - this codebase has complex dependencies -- **Cross-Edition Testing**: Changes may affect SE/AE/VR differently due to engine differences +- **Cross-Edition Testing**: Changes may affect SE/AE differently due to engine differences - **Memory Management**: Pay attention to smart pointer usage and RAII patterns when modifying existing code ### Security and Input Validation @@ -567,7 +538,6 @@ Full details: [Developers wiki — Patch Release Process](https://github.com/com - **Include Dependencies**: New features often require adding includes (ShaderCache.h, imgui_stdlib.h, etc.) - **Forward Declarations**: Use forward declarations in headers when possible, full includes in .cpp files -- **VR Considerations**: VR has different rendering requirements - check VR-specific code paths when modifying graphics features - **Feature Versioning**: Feature .ini files use semantic versioning - increment appropriately when changing settings structure - **Performance Impact**: Always consider GPU workload when adding new rendering features - provide toggle options for users - **Buffer Conflicts**: Check hlslkit buffer scanning to avoid GPU register conflicts that cause rendering issues diff --git a/src/Features/LightLimitFix.cpp b/src/Features/LightLimitFix.cpp index 50bdec615a..e127ddce10 100644 --- a/src/Features/LightLimitFix.cpp +++ b/src/Features/LightLimitFix.cpp @@ -309,7 +309,7 @@ void LightLimitFix::SetLightPosition(LightLimitFix::LightData& a_light, RE::NiPo if (a_cached) { eyePosition = eyePositionCached; } else { - eyePosition = globals::game::shadowState->GetRuntimeData().posAdjust.getEye(0); + eyePosition = Util::GetEyePosition(); } auto worldPos = a_initialPosition - eyePosition; @@ -382,7 +382,7 @@ void LightLimitFix::UpdateLights() auto shadowSceneNode = smState->shadowSceneNode[0]; - // Cache data since cameraData can become invalid in first-person + // Cache camera position from the FrameBuffer snapshot; shadowState::posAdjust can be stale in first-person { auto eyePosition = globals::game::frameBufferCached.GetCameraPosAdjust(); From ecede44112ee412abbb48f1f39188823e8bf70b9 Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 01:39:53 +0100 Subject: [PATCH 19/20] refactor: remove dead VR code in REL::Relocate calls and helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Strip dead VR third argument from 32 REL::Relocate(se, ae, vr) calls across 14 files — with ENABLE_SKYRIM_VR=OFF the third arg compiled away but was still dead code clutter. VR-only REL::Relocate(0, 0, vr) expressions replaced: - TerrainBlending.cpp: VR-only kCallerRva* constants → removed; allowlists now explicitly empty (auto-broad fallback handles SE/AE) - ShadowmapCascadeRasterizerFix.h: REL::Relocate(0,0,vr) → static_cast(0) (INI/GameSetting fallback on SE/AE) Other fixes: - ScreenSpaceGI.cpp: cameraData.getEye(0) → getEye() (remove explicit VR-awareness from the default-arg call) - Globals.h: remove empty 'namespace llf {}' stub Co-Authored-By: Claude Sonnet 4.6 --- src/Deferred.h | 6 ++-- .../ShadowmapCascadeCullingFix.cpp | 2 +- .../ShadowmapCascadeRasterizerFix.cpp | 2 +- .../ShadowmapCascadeRasterizerFix.h | 2 +- src/Features/GrassCollision.h | 2 +- src/Features/HDRDisplay.cpp | 2 +- src/Features/InteriorSun.cpp | 8 ++--- src/Features/LightLimitFix.h | 2 +- src/Features/ScreenSpaceGI.cpp | 2 +- src/Features/TerrainBlending.cpp | 26 ++++------------ src/Features/TerrainBlending.h | 2 +- src/Features/UnifiedWater.cpp | 2 +- src/Features/Upscaling.cpp | 8 ++--- src/Features/VolumetricShadows.cpp | 2 +- src/Globals.h | 3 -- src/Hooks.cpp | 30 +++++++++---------- 16 files changed, 41 insertions(+), 60 deletions(-) diff --git a/src/Deferred.h b/src/Deferred.h index bda7412c6d..b18002d4bd 100644 --- a/src/Deferred.h +++ b/src/Deferred.h @@ -122,11 +122,11 @@ class Deferred { stl::write_vfunc<0x35, BSCubeMapCamera_RenderCubemap>(RE::VTABLE_BSCubeMapCamera[0]); - stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x2EC, 0x2EC, 0x248)); + stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x2EC, 0x2EC)); - stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x831, 0x841, 0x791)); + stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x831, 0x841)); stl::write_thunk_call(REL::RelocationID(99938, 106583).address() + REL::Relocate(0x8E, 0x84)); - stl::write_thunk_call(REL::RelocationID(99938, 106583).address() + REL::Relocate(0x319, 0x308, 0x321)); + stl::write_thunk_call(REL::RelocationID(99938, 106583).address() + REL::Relocate(0x319, 0x308)); stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x944, 0x954)); diff --git a/src/EngineFixes/ShadowmapCascadeCullingFix.cpp b/src/EngineFixes/ShadowmapCascadeCullingFix.cpp index aed49dde1d..1b537a3ac7 100644 --- a/src/EngineFixes/ShadowmapCascadeCullingFix.cpp +++ b/src/EngineFixes/ShadowmapCascadeCullingFix.cpp @@ -4,7 +4,7 @@ void ShadowmapCascadeCullingFix::Install() { gfSplitOverlap = reinterpret_cast(REL::RelocationID(513805, 391863).address()); - stl::write_thunk_call(REL::RelocationID(101499, 108496).address() + REL::Relocate(0x1B12, 0x1C02, 0x1C82)); + stl::write_thunk_call(REL::RelocationID(101499, 108496).address() + REL::Relocate(0x1B12, 0x1C02)); } void ShadowmapCascadeCullingFix::BSShadowDirectionalLight_SetFrameCamera_BuildCascadeCameraCullingPlanes::thunk(RE::BSShadowDirectionalLight* dirLight, RE::NiFrustumPlanes& outPlanes, FrustumSplit& frustumSplit, uint32_t splitCornerIndices[8], uint32_t numSplitCornerIndices, RE::NiPoint3& lightDir, RE::NiPoint3& cameraPos, uint32_t cornerOffsetIndex) diff --git a/src/EngineFixes/ShadowmapCascadeRasterizerFix.cpp b/src/EngineFixes/ShadowmapCascadeRasterizerFix.cpp index 2b6881b659..d5f334360f 100644 --- a/src/EngineFixes/ShadowmapCascadeRasterizerFix.cpp +++ b/src/EngineFixes/ShadowmapCascadeRasterizerFix.cpp @@ -3,7 +3,7 @@ void ShadowmapRasterizerFix::Install() { // This function is called once per cascade to begin the updating and rendering process - stl::write_thunk_call(REL::RelocationID(101495, 108489).address() + REL::Relocate(0xC6, 0xC6, 0xF6)); + stl::write_thunk_call(REL::RelocationID(101495, 108489).address() + REL::Relocate(0xC6, 0xC6)); gRasterStates = reinterpret_cast(REL::RelocationID(524748, 411363).address()); diff --git a/src/EngineFixes/ShadowmapCascadeRasterizerFix.h b/src/EngineFixes/ShadowmapCascadeRasterizerFix.h index 82c4997341..3d0cfa5a5b 100644 --- a/src/EngineFixes/ShadowmapCascadeRasterizerFix.h +++ b/src/EngineFixes/ShadowmapCascadeRasterizerFix.h @@ -54,6 +54,6 @@ struct ShadowmapRasterizerFix : EngineFix "Controls the number of shadow map cascades used for directional lighting. " "Higher values provide better shadow quality but use more GPU resources. " "Maximum of 3 cascades supported. ", - REL::Relocate(0, 0, 0x1ed6350), 2, 1, 3 } }, + static_cast(0), 2, 1, 3 } }, }; }; diff --git a/src/Features/GrassCollision.h b/src/Features/GrassCollision.h index 7d2dee667e..e133077b71 100644 --- a/src/Features/GrassCollision.h +++ b/src/Features/GrassCollision.h @@ -104,7 +104,7 @@ struct GrassCollision : Feature static void Install() { stl::write_vfunc<0x6, BSGrassShader_SetupGeometry>(RE::VTABLE_BSGrassShader[0]); - stl::write_thunk_call(REL::RelocationID(35565, 36564).address() + REL::Relocate(0x748, 0xC26, 0x7EE)); + stl::write_thunk_call(REL::RelocationID(35565, 36564).address() + REL::Relocate(0x748, 0xC26)); logger::info("[GRASS COLLISION] Installed hooks"); } }; diff --git a/src/Features/HDRDisplay.cpp b/src/Features/HDRDisplay.cpp index 836723f9e0..545b0a950b 100644 --- a/src/Features/HDRDisplay.cpp +++ b/src/Features/HDRDisplay.cpp @@ -606,7 +606,7 @@ void HDRDisplay::PostPostLoad() if (!globals::features::upscaling.loaded) { logger::info("[HDR Display] Installing HDR pipeline hooks (Upscaling not loaded)"); stl::detour_thunk(REL::RelocationID(79947, 82084)); - stl::write_thunk_call(REL::RelocationID(100430, 107148).address() + REL::Relocate(0x1F0, 0x1E7, 0x206)); + stl::write_thunk_call(REL::RelocationID(100430, 107148).address() + REL::Relocate(0x1F0, 0x1E7)); } } diff --git a/src/Features/InteriorSun.cpp b/src/Features/InteriorSun.cpp index ffe817f8fb..3bb494d6bc 100644 --- a/src/Features/InteriorSun.cpp +++ b/src/Features/InteriorSun.cpp @@ -51,9 +51,9 @@ void InteriorSun::PostPostLoad() stl::write_thunk_call(REL::RelocationID(100852, 107642).address() + REL::Relocate(0x29E, 0x28F)); // Hooks and patch to enable directional lighting for interiors - stl::write_thunk_call(REL::RelocationID(35562, 36561).address() + REL::Relocate(0x399, 0x37D, 0x639)); - stl::write_thunk_call(REL::RelocationID(35562, 36561).address() + REL::Relocate(0x3AE, 0x392, 0x64E)); - REL::safe_fill(REL::RelocationID(35562, 36561).address() + REL::Relocate(0x397, 0x37B, 0x637), REL::NOP, 2); + stl::write_thunk_call(REL::RelocationID(35562, 36561).address() + REL::Relocate(0x399, 0x37D)); + stl::write_thunk_call(REL::RelocationID(35562, 36561).address() + REL::Relocate(0x3AE, 0x392)); + REL::safe_fill(REL::RelocationID(35562, 36561).address() + REL::Relocate(0x397, 0x37B), REL::NOP, 2); // Hook for overriding the rooms and portals passed to the directional light culling step to fix light leaking through unrendered geometry stl::detour_thunk(REL::RelocationID(101498, 108492)); @@ -67,7 +67,7 @@ void InteriorSun::PostPostLoad() gInteriorShadowDistance = reinterpret_cast(REL::RelocationID(513755, 391724).address()); // Patches BSShadowDirectionalLight::SetFrameCamera to read the correct shadow distance value in interior cells - const std::uintptr_t address = REL::RelocationID(101499, 108496).address() + REL::Relocate(0xD62, 0xE6C, 0xE72); + const std::uintptr_t address = REL::RelocationID(101499, 108496).address() + REL::Relocate(0xD62, 0xE6C); const std::int32_t displacement = static_cast(reinterpret_cast(gShadowDistance) - (address + 8)); REL::safe_write(address + 4, &displacement, sizeof(displacement)); diff --git a/src/Features/LightLimitFix.h b/src/Features/LightLimitFix.h index b3ac4cd50a..07205ffab6 100644 --- a/src/Features/LightLimitFix.h +++ b/src/Features/LightLimitFix.h @@ -222,7 +222,7 @@ struct LightLimitFix : OverlayFeature stl::write_vfunc<0x6, BSWaterShader_SetupGeometry>(RE::VTABLE_BSWaterShader[0]); stl::write_thunk_call(REL::RelocationID(100994, 107781).address() + 0x92); - stl::write_thunk_call(REL::RelocationID(100997, 107784).address() + REL::Relocate(0x139, 0x12A, 0x133)); + stl::write_thunk_call(REL::RelocationID(100997, 107784).address() + REL::Relocate(0x139, 0x12A)); stl::write_thunk_call(REL::RelocationID(101296, 108283).address() + REL::Relocate(0xB7, 0x7E)); logger::info("[LLF] Installed hooks"); diff --git a/src/Features/ScreenSpaceGI.cpp b/src/Features/ScreenSpaceGI.cpp index d3e311d3bd..1e4c1b2df7 100644 --- a/src/Features/ScreenSpaceGI.cpp +++ b/src/Features/ScreenSpaceGI.cpp @@ -648,7 +648,7 @@ void ScreenSpaceGI::UpdateSB() SSGICB data; { { - auto eye = globals::game::shadowState->GetRuntimeData().cameraData.getEye(0); + auto eye = globals::game::shadowState->GetRuntimeData().cameraData.getEye(); data.PrevInvViewMat = prevInvView; data.NDCToViewMul = { 2.0f / eye.projMat(0, 0), -2.0f / eye.projMat(1, 1), 0.0f, 0.0f }; diff --git a/src/Features/TerrainBlending.cpp b/src/Features/TerrainBlending.cpp index 42dc7e81f1..f3c67b7d57 100644 --- a/src/Features/TerrainBlending.cpp +++ b/src/Features/TerrainBlending.cpp @@ -52,27 +52,11 @@ namespace constexpr uint32_t kShadowmaskDepthDescriptor0 = 0x262002u; constexpr uint32_t kShadowmaskDepthDescriptor1 = 0x1062002u; - // Module RVAs from _ReturnAddress() at hooked engine callsites. - // Ownership: - // - Shared slot2 + depth-override callers: 0x1351AD4, 0xDBDD68 - // - Depth-override-only caller: 0x1349B7F - const uint32_t kCallerRvaSlot2AndDepthOverrideA = static_cast(REL::Relocate(0u, 0u, 0x1351AD4u)); - const uint32_t kCallerRvaSlot2AndDepthOverrideB = static_cast(REL::Relocate(0u, 0u, 0xDBDD68u)); - const uint32_t kCallerRvaDepthOverrideOnly = static_cast(REL::Relocate(0u, 0u, 0x1349B7Fu)); - - // Slot2 rewrite allowlist (PS slot 2 = shadowmask depth SRV override path). - // Includes only callsites validated for shadowmask slot2 rebinding. - const std::array kSlot2CallerAllowlistRvas = { - kCallerRvaSlot2AndDepthOverrideA, - kCallerRvaSlot2AndDepthOverrideB - }; - // Descriptor-scoped OM depth override allowlist (0x1062002 only). - // Contains the two shared callers above plus one depth-override-only caller. - const std::array kDepthOverrideCallerAllowlistRvas = { - kCallerRvaSlot2AndDepthOverrideB, - kCallerRvaSlot2AndDepthOverrideA, - kCallerRvaDepthOverrideOnly - }; + // Allowlists of module RVAs for _ReturnAddress()-based hook dispatch. + // Previously contained VR-specific callsite addresses; now empty so the + // auto-broad fallback paths handle all dispatch in SE/AE. + const std::array kSlot2CallerAllowlistRvas = {}; + const std::array kDepthOverrideCallerAllowlistRvas = {}; constexpr bool kEnableAutoBroadSlot2Fallback = true; constexpr uint64_t kSlot2AutoFallbackRejectThreshold = 5; constexpr bool kEnableAutoBroadDepthOverrideFallback = true; diff --git a/src/Features/TerrainBlending.h b/src/Features/TerrainBlending.h index 49325702ab..04f8c6bb06 100644 --- a/src/Features/TerrainBlending.h +++ b/src/Features/TerrainBlending.h @@ -149,7 +149,7 @@ struct TerrainBlending : Feature static void Install() { // To know when we are rendering z-prepass depth vs shadows depth - stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x395, 0x395, 0x2EE)); + stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x395, 0x395)); // To know when shadowmask phase ends (for releasing engine hook overrides) stl::detour_thunk(REL::RelocationID(100422, 107140)); diff --git a/src/Features/UnifiedWater.cpp b/src/Features/UnifiedWater.cpp index d3121345be..9e719a4cd3 100644 --- a/src/Features/UnifiedWater.cpp +++ b/src/Features/UnifiedWater.cpp @@ -350,7 +350,7 @@ void UnifiedWater::PostPostLoad() stl::detour_thunk(REL::RelocationID(13170, 13315)); stl::detour_thunk(REL::RelocationID(20029, 20463)); - stl::write_thunk_call(REL::RelocationID(31388, 32179).address() + REL::Relocate(0x360, 0x3BC, 0x35B)); + stl::write_thunk_call(REL::RelocationID(31388, 32179).address() + REL::Relocate(0x360, 0x3BC)); stl::write_vfunc<0x4, BSWaterShaderMaterial_ComputeCRC32>(RE::VTABLE_BSWaterShaderMaterial[0]); stl::detour_thunk(REL::RelocationID(30934, 31737)); diff --git a/src/Features/Upscaling.cpp b/src/Features/Upscaling.cpp index bbab1a4e3c..75c53d51c7 100644 --- a/src/Features/Upscaling.cpp +++ b/src/Features/Upscaling.cpp @@ -550,13 +550,13 @@ void Upscaling::PostPostLoad() stl::detour_thunk(REL::RelocationID(79947, 82084)); // Calculates resolution and jitter - stl::write_thunk_call(REL::RelocationID(75460, 77245).address() + REL::Relocate(0xE5, isGOG ? 0x133 : 0xE2, 0x104)); + stl::write_thunk_call(REL::RelocationID(75460, 77245).address() + REL::Relocate(0xE5, isGOG ? 0x133 : 0xE2)); // Disables the original dynamic resolution system - REL::safe_write(REL::RelocationID(35556, 36555).address() + REL::Relocate(0x2D, 0x2D, 0x25), REL::NOP5, sizeof(REL::NOP5)); + REL::safe_write(REL::RelocationID(35556, 36555).address() + REL::Relocate(0x2D, 0x2D), REL::NOP5, sizeof(REL::NOP5)); // Performs upscaling in between volumetric lighting and post processing - stl::write_thunk_call(REL::RelocationID(100430, 107148).address() + REL::Relocate(0x1F0, 0x1E7, 0x206)); + stl::write_thunk_call(REL::RelocationID(100430, 107148).address() + REL::Relocate(0x1F0, 0x1E7)); // Patches RSSetScissorRect calls to use dynamic resolution stl::detour_thunk(REL::RelocationID(75564, 77365)); @@ -565,7 +565,7 @@ void Upscaling::PostPostLoad() stl::detour_thunk(REL::RelocationID(26455, 27041)); // Patches precipitation camera to not use dynamic resolution - stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x3A1, 0x3A1, 0x2FA)); + stl::write_thunk_call(REL::RelocationID(35560, 36559).address() + REL::Relocate(0x3A1, 0x3A1)); // Forces FXAA off stl::detour_thunk(REL::RelocationID(98974, 105626)); diff --git a/src/Features/VolumetricShadows.cpp b/src/Features/VolumetricShadows.cpp index 34459618ed..b59bf36c94 100644 --- a/src/Features/VolumetricShadows.cpp +++ b/src/Features/VolumetricShadows.cpp @@ -372,7 +372,7 @@ struct CreateDepthStencil_VolumetricLighting void VolumetricShadows::PostPostLoad() { - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x9DC, 0x9DC, 0xC60)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x9DC, 0x9DC)); } bool VolumetricShadows::HasShaderDefine(RE::BSShader::Type) diff --git a/src/Globals.h b/src/Globals.h index 7376389bde..e1780a14e0 100644 --- a/src/Globals.h +++ b/src/Globals.h @@ -98,9 +98,6 @@ namespace globals extern TruePBR truePBR; extern Skin skin; - namespace llf - { - } } struct FrameBuffer diff --git a/src/Hooks.cpp b/src/Hooks.cpp index dc8b970cbd..9abd07fc9c 100644 --- a/src/Hooks.cpp +++ b/src/Hooks.cpp @@ -390,7 +390,7 @@ struct BSShaderRenderTargets_Create */ static inline Util::GameSetting iNumFocusShadow{ "Number of Focus Shadows (INI)", "Controls the number of focus shadows.", - REL::Relocate(0, 0, 0x1ed6368), 4, 0, 4 }; + static_cast(0), 4, 0, 4 }; static void thunk() { @@ -859,7 +859,7 @@ namespace Hooks // This input hook also drives per-frame Reflex update (see BSInputDeviceManager_PollInputDevices::thunk). logger::info("Hooking BSInputDeviceManager::PollInputDevices"); - stl::write_thunk_call(REL::RelocationID(67315, 68617).address() + REL::Relocate(0x7B, 0x7B, 0x81)); + stl::write_thunk_call(REL::RelocationID(67315, 68617).address() + REL::Relocate(0x7B, 0x7B)); logger::info("Hooking BSShader::LoadShaders"); stl::detour_thunk(REL::RelocationID(101339, 108326)); @@ -883,19 +883,19 @@ namespace Hooks stl::detour_thunk(REL::RelocationID(100458, 107175)); logger::info("Hooking BSShaderRenderTargets::Create::CreateRenderTarget(s)"); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x3F0, 0x3F3, 0x548)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x406, 0x409, 0x55E)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x41C, 0x41F, 0x574)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x458, 0x45B, 0x5B0)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x46B, 0x46E, 0x5C3)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x4F0, 0x4EF, 0x64E)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x3F0, 0x3F3)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x406, 0x409)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x41C, 0x41F)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x458, 0x45B)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x46B, 0x46E)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x4F0, 0x4EF)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x503, 0x502, 0x661)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0xB19, 0xB19, 0xE06)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x503, 0x502)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0xB19, 0xB19)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x1245, 0x123B, 0x1917)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0xA25, 0xA25, 0xCD2)); - stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0xA59, 0xA59, 0xD13)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0x1245, 0x123B)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0xA25, 0xA25)); + stl::write_thunk_call(REL::RelocationID(100458, 107175).address() + REL::Relocate(0xA59, 0xA59)); #ifdef TRACY_ENABLE stl::write_thunk_call(REL::RelocationID(35551, 36544).address() + REL::Relocate(0x11F, 0x160)); @@ -912,7 +912,7 @@ namespace Hooks stl::detour_thunk(REL::RelocationID(75532, 77329)); logger::info("Hooking TESWaterReflections::Update_Actor::GetLOSPosition for Sky Reflection Fix"); - stl::write_thunk_call(REL::RelocationID(31373, 32160).address() + REL::Relocate(0x1AD, 0x1CA, 0x1ed)); + stl::write_thunk_call(REL::RelocationID(31373, 32160).address() + REL::Relocate(0x1AD, 0x1CA)); logger::info("Hooking Sky::UpdateColors"); stl::detour_thunk(REL::RelocationID(25686, 26233)); @@ -945,7 +945,7 @@ namespace Hooks } } - stl::write_thunk_call(REL::RelocationID(100565, 107300).address() + REL::Relocate(0x523, 0xB0E, 0x5FE)); + stl::write_thunk_call(REL::RelocationID(100565, 107300).address() + REL::Relocate(0x523, 0xB0E)); } void InstallEarlyHooks() From 7ceb37d323010254792c398d2a55de38a6ca312a Mon Sep 17 00:00:00 2001 From: doodlum <15017472+doodlum@users.noreply.github.com> Date: Sat, 6 Jun 2026 17:09:07 +0100 Subject: [PATCH 20/20] refactor: final VR reference cleanup Remove remaining VR references from docs, CI scripts, tools, and translation files: - Fix stale zh_CN.json orphan key (light_limit_fix.key_feature_5) - Remove VR from AI/Copilot instructions, README, coderabbit example - Clean generate-shader-configs.ps1 of SkyrimVR detection - Update verify-shader-refactor.ps1 default permutations (drop VR) - Fix DispatchEye -> Dispatch in ScreenSpaceShadows; remove dead eyeName param - Remove stale VR comments from SSGI shaders and TerrainBlending - Update Overrides/README.md feature list (remove VR entry) - Sync containerbuild.ps1 path replace with cleaned template Co-Authored-By: Claude Opus 4.6 --- .coderabbit.yaml | 2 +- .github/configs/README.md | 12 +++------ .github/configs/generate-shader-configs.ps1 | 26 +++---------------- .github/copilot-instructions.md | 8 +++--- AI-INSTRUCTIONS.md | 8 +++--- README.md | 2 -- containerbuild.ps1 | 2 +- docs/development/README.md | 2 +- docs/development/shader-workflow.md | 2 +- .../Shaders/ScreenSpaceGI/common.hlsli | 4 +-- .../Shaders/ScreenSpaceGI/gi.cs.hlsl | 8 +++--- .../CommunityShaders/Overrides/README.md | 1 - .../CommunityShaders/Translations/zh_CN.json | 3 +-- src/Features/ScreenSpaceShadows.cpp | 20 ++++++-------- src/Features/TerrainBlending.cpp | 2 -- tools/verify-shader-refactor.ps1 | 8 +++--- 16 files changed, 36 insertions(+), 74 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 0765e27928..ba8f7d5925 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -12,7 +12,7 @@ reviews: Length: 50 characters limit for title, 72 for body Style: lowercase description, no ending period Examples: - - feat(vr): add cross-eye sampling + - feat(ssgi): add temporal denoising - fix(water): resolve flowmap bug - docs: update shader documentation diff --git a/.github/configs/README.md b/.github/configs/README.md index 3dc2f95584..cd403162c8 100644 --- a/.github/configs/README.md +++ b/.github/configs/README.md @@ -5,29 +5,27 @@ This directory contains configuration files used by the CI/CD pipeline for build ## Files - `shader-validation.yaml`: Configuration for shader compilation validation using hlslkit (Skyrim SE) -- `shader-validation-vr.yaml`: VR Configuration for shader compilation validation using hlslkit (Skyrim VR) ## Generating Configuration Files These configuration files can be regenerated using the `generate-shader-configs.ps1` script in this directory. This script requires: -1. A valid Skyrim installation (SE and/or VR) +1. A valid Skyrim Special Edition installation 2. The [hlslkit](https://github.com/alandtse/hlslkit) package installed (`pip install hlslkit`) 3. Community Shaders to be run once with specific settings to generate the required log data ### Prerequisites -Before running the generation script, you must run each version of Skyrim (SE and VR) **once** with the following Community Shaders settings: +Before running the generation script, you must run Skyrim SE **once** with the following Community Shaders settings: 1. **Set Debug Log Level**: In the Community Shaders menu, set the log level to "Debug" or "Trace" 2. **Clear Disk Cache**: Clear the shader disk cache before running 3. **Enable Disk Cache**: Ensure disk cache is enabled and will be saved 4. **Run the Game**: Launch and wait for compilation to complete to generate shader compilation logs -The required log files will be created at: +The required log file will be created at: - **Skyrim SE**: `%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SKSE\CommunityShaders.log` -- **Skyrim VR**: `%USERPROFILE%\Documents\My Games\Skyrim VR\SKSE\CommunityShaders.log` ### Running the Script @@ -52,11 +50,7 @@ The script will: You can also generate the files manually using hlslkit: ```bash -# For Skyrim SE hlslkit-generate --log "%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SKSE\CommunityShaders.log" --output .\.github\configs\shader-validation.yaml - -# For Skyrim VR -hlslkit-generate --log "%USERPROFILE%\Documents\My Games\Skyrim VR\SKSE\CommunityShaders.log" --output .\.github\configs\shader-validation-vr.yaml ``` ## Usage in CI/CD diff --git a/.github/configs/generate-shader-configs.ps1 b/.github/configs/generate-shader-configs.ps1 index b93f1924b1..f8c78cb408 100644 --- a/.github/configs/generate-shader-configs.ps1 +++ b/.github/configs/generate-shader-configs.ps1 @@ -4,9 +4,9 @@ Generates shader validation configuration files for Community Shaders. .DESCRIPTION - This script generates shader-validation.yaml and shader-validation-vr.yaml files by analyzing - Community Shaders log files from Skyrim installations. It requires hlslkit to be installed - and both Skyrim Special Edition and/or Skyrim VR to have been run with specific settings. + This script generates shader-validation.yaml by analyzing Community Shaders log files from + Skyrim Special Edition installations. It requires hlslkit to be installed and Skyrim Special + Edition to have been run with specific settings. .PARAMETER OutputDir Directory where the generated YAML files will be saved. Defaults to current directory. @@ -88,33 +88,15 @@ function Find-SkyrimPaths { } } - # Check for Skyrim VR - $vrPath = Join-Path $myGamesPath "Skyrim VR" - if (Test-Path $vrPath) { - $paths += @{ - Name = "Skyrim VR" - Path = $vrPath - LogPath = Join-Path $vrPath "SKSE\CommunityShaders.log" - ConfigName = "shader-validation-vr.yaml" - Type = "VR" - } - } - # Check CommunityShadersOutputDir environment variable $outputDir = $env:CommunityShadersOutputDir if ($outputDir -and (Test-Path $outputDir)) { Write-Host "Found CommunityShadersOutputDir: $outputDir" -ForegroundColor Yellow - # Try to detect if this is a Skyrim installation by looking for common files $skyrimExe = Get-ChildItem -Path $outputDir -Recurse -Name "SkyrimSE.exe" -ErrorAction SilentlyContinue | Select-Object -First 1 - $skyrimVRExe = Get-ChildItem -Path $outputDir -Recurse -Name "SkyrimVR.exe" -ErrorAction SilentlyContinue | Select-Object -First 1 - if ($skyrimExe) { Write-Host "Detected Skyrim SE installation in CommunityShadersOutputDir" -ForegroundColor Green } - if ($skyrimVRExe) { - Write-Host "Detected Skyrim VR installation in CommunityShadersOutputDir" -ForegroundColor Green - } } return $paths @@ -207,7 +189,7 @@ if ($LogFile) { $skyrimPaths = Find-SkyrimPaths if ($skyrimPaths.Count -eq 0) { - Write-Error "No Skyrim installations found. Please ensure Skyrim SE or VR is installed." + Write-Error "No Skyrim installations found. Please ensure Skyrim Special Edition is installed." exit 1 } diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c0c3b0e730..46eee01327 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -13,7 +13,7 @@ This file provides Copilot-specific guidance while avoiding duplication of the c ## Project Overview -SKSE64 plugin providing modular DirectX 11 graphics enhancements for Skyrim SE/AE/VR. Features runtime shader compilation, 25+ graphics features, and cross-platform Skyrim variant support. +SKSE64 plugin providing modular DirectX 11 graphics enhancements for Skyrim SE/AE. Features runtime shader compilation, 25+ graphics features, and cross-platform Skyrim variant support. ## Environment and Build Essentials @@ -31,7 +31,7 @@ SKSE64 plugin providing modular DirectX 11 graphics enhancements for Skyrim SE/A ### Primary Build Command (Windows) ```powershell -# ALL preset is primary - other presets (SE, AE, VR) are legacy +# ALL preset is primary - other presets (SE, AE) are legacy ./BuildRelease.bat ALL # Universal binary (recommended) ./BuildRelease.bat # Same as ALL (default) ``` @@ -60,7 +60,7 @@ git submodule update --init --recursive # If not cloned with --recursive **Flag potential problems before they occur:** - **Performance Impact**: Graphics features affect rendering performance - suggest user toggles -- **Runtime Compatibility**: Warn about SE/AE/VR compatibility issues, suggest `REL::RelocateMember()` patterns +- **Runtime Compatibility**: Warn about SE/AE compatibility issues, suggest `REL::RelocateMember()` patterns - **Buffer Conflicts**: Highlight GPU register conflicts, recommend hlslkit buffer scanning - **Security Risks**: Validate user input, prevent DirectX crashes from malformed configurations @@ -68,7 +68,7 @@ git submodule update --init --recursive # If not cloned with --recursive - **Complete Solutions**: No TODO/FIXME placeholders - provide fully functional code - **Performance Conscious**: Always consider GPU workload and user experience -- **Cross-Platform**: Ensure changes work across SE/AE/VR variants using runtime detection +- **Cross-Platform**: Ensure changes work across SE/AE variants using runtime detection - **Error Handling**: Include proper resource management and graceful degradation ## Architecture Quick Reference diff --git a/AI-INSTRUCTIONS.md b/AI-INSTRUCTIONS.md index 56b9ddfe66..9f26a29050 100644 --- a/AI-INSTRUCTIONS.md +++ b/AI-INSTRUCTIONS.md @@ -8,7 +8,7 @@ This file provides guidance for AI assistants working with the Skyrim Community - Build commands and development setup - Architecture overview and critical dependencies (CommonLibSSE-NG) -- Runtime targeting system for SE/AE/VR compatibility +- Runtime targeting system for SE/AE compatibility - Core architecture including Globals system and feature registry - Shader architecture (base shaders in `package/Shaders/`, feature shaders, compute shader patterns) - Development workflows and best practices @@ -18,7 +18,7 @@ This file provides guidance for AI assistants working with the Skyrim Community ### Project Type -SKSE plugin providing advanced DirectX 11 graphics modifications for Skyrim SE/AE/VR. +SKSE plugin providing advanced DirectX 11 graphics modifications for Skyrim SE/AE. ### Essential Commands @@ -28,7 +28,7 @@ SKSE plugin providing advanced DirectX 11 graphics modifications for Skyrim SE/A ### Build Options -**Runtime Presets**: `ALL` (universal), `SE`, `AE`, `VR`, `PRE-AE`, `FLATRIM`, `ALL-TRACY` +**Runtime Presets**: `ALL` (universal), `SE`, `AE`, `ALL-TRACY` **CMake Options** (set in user preset): @@ -50,6 +50,6 @@ For full details about manual packaging targets (Package-Core, Package-AIO-Manua **Act as an experienced graphics programming and Skyrim modding expert.** -**Key Focus**: Performance impact awareness, runtime compatibility (SE/AE/VR), complete working solutions, DirectX/HLSL best practices. +**Key Focus**: Performance impact awareness, runtime compatibility (SE/AE), complete working solutions, DirectX/HLSL best practices. For detailed explanations, examples, and comprehensive guidance, refer to `.claude/CLAUDE.md`. diff --git a/README.md b/README.md index 9a8128f28d..0b977f67f1 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,6 @@ Install them manually only if you want them in everywhere. - [Address Library for SKSE](https://www.nexusmods.com/skyrimspecialedition/mods/32444) - Needed for SSE/AE -- [VR Address Library for SKSEVR](https://www.nexusmods.com/skyrimspecialedition/mods/58101) - - Needed for VR ## Build Instructions diff --git a/containerbuild.ps1 b/containerbuild.ps1 index 80390fbb43..463e9aeaa6 100644 --- a/containerbuild.ps1 +++ b/containerbuild.ps1 @@ -9,7 +9,7 @@ Write-Host "Starting build..." if (-Not (Test-Path -Path "CMakeUserPresets.json")) { Copy-Item -Path "CMakeUserPresets.json.template" -Destination "CMakeUserPresets.json" - (Get-Content -Path "CMakeUserPresets.json") -replace 'F:/MySkyrimModpack/mods/CommunityShaders;F:/SteamLibrary/steamapps/common/SkyrimVR/Data;F:/SteamLibrary/steamapps/common/Skyrim Special Edition/Data', 'C:/skyrim-community-shaders/build' | Set-Content -Path "CMakeUserPresets.json" + (Get-Content -Path "CMakeUserPresets.json") -replace 'F:/MySkyrimModpack/mods/CommunityShaders;F:/SteamLibrary/steamapps/common/Skyrim Special Edition/Data', 'C:/skyrim-community-shaders/build' | Set-Content -Path "CMakeUserPresets.json" Write-Host "CMakeUserPresets.json created and modified." } else { Write-Host "CMakeUserPresets.json already exists. No action taken." diff --git a/docs/development/README.md b/docs/development/README.md index 92cc9e7fff..d0701a2689 100644 --- a/docs/development/README.md +++ b/docs/development/README.md @@ -36,7 +36,7 @@ Use `tools/new-worktree.ps1` when creating a new worktree for development. The s Examples: - `pwsh ./tools/new-worktree.ps1 -Name reproj_fixes` -- `pwsh ./tools/new-worktree.ps1 -Name vr-debug -StartPoint dev` +- `pwsh ./tools/new-worktree.ps1 -Name shader-debug -StartPoint dev` - `pwsh ./tools/new-worktree.ps1 -Name clean-build -NoSubmodules` If you want a Git-native command, install the optional repo-local alias: diff --git a/docs/development/shader-workflow.md b/docs/development/shader-workflow.md index bf58da9431..1a95e89f84 100644 --- a/docs/development/shader-workflow.md +++ b/docs/development/shader-workflow.md @@ -17,7 +17,7 @@ pwsh tools/verify-shader-refactor.ps1 package/Shaders/Foo.hlsl # or tools/veri `tools/verify-shader-refactor.ps1` (bash wrapper: `tools/verify-shader-refactor.sh`) compiles a shader from a base git ref and from the working tree across the -`VR` × `HDR_OUTPUT` permutations, then compares the compiled bytecode. The base +`HDR_OUTPUT` permutations, then compares the compiled bytecode. The base ref's whole include tree is materialized (via `git archive`), so the base compiles against base-ref `.hlsli` headers and the working tree against working headers — a refactor that also edits a shared header is compared correctly, not masked: diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli b/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli index bbcdf9f28e..86bf0747c8 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/common.hlsli @@ -86,8 +86,8 @@ float2 filterInf(float2 v) { return float2(filterInf(v.x), filterInf(v.y)); } float3 filterInf(float3 v) { return float3(filterInf(v.x), filterInf(v.y), filterInf(v.z)); } float4 filterInf(float4 v) { return float4(filterInf(v.x), filterInf(v.y), filterInf(v.z), filterInf(v.w)); } -// screenPos - normalised position in FrameDim, one eye only -// uv - normalised position in FrameDim, both eye +// screenPos - normalised position in FrameDim +// uv - normalised position in FrameDim // texCoord - texture coordinate #ifdef HALF_RES diff --git a/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl b/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl index 28c4aea445..0ad32a8ace 100644 --- a/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl +++ b/features/Screen Space GI/Shaders/ScreenSpaceGI/gi.cs.hlsl @@ -105,8 +105,7 @@ void CalculateGI( ////////////////////////////////////////////////////////////////// - // Use mono screen-space position for noise indexing so both eyes - // sample the same noise for corresponding world positions. + // Use screen-space position for noise indexing. uint2 noiseCoord = uint2(normalizedScreenPos * OUT_FRAME_DIM); const float2 localNoise = SpatioTemporalNoise(noiseCoord, FrameIndex); const float noiseSlice = localNoise.x; @@ -203,10 +202,9 @@ void CalculateGI( float SZ = srcWorkingDepth.SampleLevel(samplerPointClamp, sampleUV * frameScale, mipLevel); - // Reconstruct sample in current eye's viewspace for correct horizon angles. + // Reconstruct sample viewspace position for correct horizon angles. float3 samplePos = ScreenToViewPosition(sampleScreenPos, SZ); - // For cross-eye samples, reject if the depth differs too much from the - // center pixel -- the other eye may see a different surface due to occlusion. + // Reject if the depth differs too much from the center pixel. float3 sampleDelta = samplePos - pixCenterPos; float3 sampleHorizonVec = normalize(sampleDelta); diff --git a/package/SKSE/Plugins/CommunityShaders/Overrides/README.md b/package/SKSE/Plugins/CommunityShaders/Overrides/README.md index a39e0cc4aa..907a6317af 100644 --- a/package/SKSE/Plugins/CommunityShaders/Overrides/README.md +++ b/package/SKSE/Plugins/CommunityShaders/Overrides/README.md @@ -111,7 +111,6 @@ To create feature-specific overrides, you need to use the correct feature short - `TerrainHelper` - Terrain Helper - `TerrainShadows` - Terrain Shadows - `VolumetricLighting` - Volumetric Lighting -- `VR` - VR - `WaterEffects` - Water Effects - `PerformanceOverlay` - Performance Overlay - `WetnessEffects` - Wetness Effects diff --git a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json index 553addf164..a5ce43434a 100644 --- a/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json +++ b/package/SKSE/Plugins/CommunityShaders/Translations/zh_CN.json @@ -2072,6 +2072,5 @@ "ui.copy": "复制", "ui.dont_ask_again": "不再提示", "ui.search": "搜索...", - "ui.search_features": "搜索功能...", - "feature.light_limit_fix.key_feature_5": "增强视觉真实感" + "ui.search_features": "搜索功能..." } diff --git a/src/Features/ScreenSpaceShadows.cpp b/src/Features/ScreenSpaceShadows.cpp index f8c8536101..cf3b6621ca 100644 --- a/src/Features/ScreenSpaceShadows.cpp +++ b/src/Features/ScreenSpaceShadows.cpp @@ -155,15 +155,11 @@ void ScreenSpaceShadows::DrawShadows() float2 dynamicRes = { viewport->GetRuntimeData().dynamicResolutionWidthRatio, viewport->GetRuntimeData().dynamicResolutionHeightRatio }; // Shared dispatch logic - auto DispatchEye = [&](const char* eyeName, ID3D11ComputeShader* shader, const float* lightProj, - float invTexSizeX, float invTexSizeY) { - std::string timerName = eyeName ? std::format("ScreenSpaceShadows::RayMarch({})", eyeName) : "ScreenSpaceShadows::RayMarch"; - globals::profiler->BeginPass(timerName); - - if (globals::state->frameAnnotations && eyeName) { - std::string eventName = std::format("SSS - Ray March ({})", eyeName); - globals::state->BeginPerfEvent(eventName); - } else if (globals::state->frameAnnotations) { + auto Dispatch = [&](ID3D11ComputeShader* shader, const float* lightProj, + float invTexSizeX, float invTexSizeY) { + globals::profiler->BeginPass("ScreenSpaceShadows::RayMarch"); + + if (globals::state->frameAnnotations) { globals::state->BeginPerfEvent("SSS - Ray March"); } @@ -175,7 +171,7 @@ void ScreenSpaceShadows::DrawShadows() auto dispatchData = dispatchList.Dispatch[i]; { - TracyD3D11Zone(globals::state->tracyCtx, "SSS - DispatchEye CB"); + TracyD3D11Zone(globals::state->tracyCtx, "SSS - Dispatch CB"); RaymarchCB data{}; data.LightCoordinate[0] = dispatchList.LightCoordinate_Shader[0]; @@ -200,7 +196,7 @@ void ScreenSpaceShadows::DrawShadows() } { - TracyD3D11Zone(globals::state->tracyCtx, "SSS - DispatchEye Sweep"); + TracyD3D11Zone(globals::state->tracyCtx, "SSS - Dispatch Sweep"); context->Dispatch(dispatchData.WaveCount[0], dispatchData.WaveCount[1], dispatchData.WaveCount[2]); } } @@ -215,7 +211,7 @@ void ScreenSpaceShadows::DrawShadows() float InvTexSizeX = 1.0f / (float)viewportSize[0]; float InvTexSizeY = 1.0f / (float)viewportSize[1]; - DispatchEye(nullptr, GetComputeRaymarch(), lightProjectionF.data(), InvTexSizeX, InvTexSizeY); + Dispatch(GetComputeRaymarch(), lightProjectionF.data(), InvTexSizeX, InvTexSizeY); ID3D11ShaderResourceView* views[1]{ nullptr }; context->CSSetShaderResources(0, 1, views); diff --git a/src/Features/TerrainBlending.cpp b/src/Features/TerrainBlending.cpp index f3c67b7d57..b5e467eeac 100644 --- a/src/Features/TerrainBlending.cpp +++ b/src/Features/TerrainBlending.cpp @@ -53,8 +53,6 @@ namespace constexpr uint32_t kShadowmaskDepthDescriptor1 = 0x1062002u; // Allowlists of module RVAs for _ReturnAddress()-based hook dispatch. - // Previously contained VR-specific callsite addresses; now empty so the - // auto-broad fallback paths handle all dispatch in SE/AE. const std::array kSlot2CallerAllowlistRvas = {}; const std::array kDepthOverrideCallerAllowlistRvas = {}; constexpr bool kEnableAutoBroadSlot2Fallback = true; diff --git a/tools/verify-shader-refactor.ps1 b/tools/verify-shader-refactor.ps1 index c18954f977..5d5613cf44 100644 --- a/tools/verify-shader-refactor.ps1 +++ b/tools/verify-shader-refactor.ps1 @@ -17,7 +17,7 @@ (e.g. register reorder) can be eyeballed. A refactor that is Tier-1 IDENTICAL on the swept permutations needs no further proof. - Note: the default sweep (VR x HDR_OUTPUT) is strong evidence, not the full build + Note: the default sweep (HDR_OUTPUT x stage) is strong evidence, not the full build matrix from shader-validation.yaml. Pass -Permutations for exotic define combos. .PARAMETER Shader @@ -31,7 +31,7 @@ .PARAMETER Permutations Optional explicit permutation list; each entry is a space-separated define set, - e.g. -Permutations "PSHADER","PSHADER VR". Overrides the auto sweep. + e.g. -Permutations "PSHADER","PSHADER HDR_OUTPUT". Overrides the auto sweep. .PARAMETER Entry Shader entry point. Default: main. @@ -111,9 +111,7 @@ try { if (-not $Permutations -or $Permutations.Count -eq 0) { $Permutations = @( "$stageDefine", - "$stageDefine VR", - "$stageDefine HDR_OUTPUT", - "$stageDefine VR HDR_OUTPUT" + "$stageDefine HDR_OUTPUT" ) }