Hob
  1 / 2    
[url]http://store.steampowered.com/app/404680/Hob/[/url] Zelda meets Rime in this one. With shadows off, 3D looks really good. A few issues, but nothing too distracting. An absolutely gorgeous game from the developers of the Torchlight series (Runic Games.)
http://store.steampowered.com/app/404680/Hob/

Zelda meets Rime in this one. With shadows off, 3D looks really good. A few issues, but nothing too distracting.

An absolutely gorgeous game from the developers of the Torchlight series (Runic Games.)

#1
Posted 09/26/2017 08:12 PM   
I noticed that Torchlight 1 and 2 were never fixed. This game is running on the same engine which is based on Ogre3D. I wasn't sure if it was running on OpenGL or DirectX, but since you got 3D to kick in it looks like it's DirectX. I've been looking forward to this game for a while, i'll probably give it a hot this weekend.
I noticed that Torchlight 1 and 2 were never fixed. This game is running on the same engine which is based on Ogre3D. I wasn't sure if it was running on OpenGL or DirectX, but since you got 3D to kick in it looks like it's DirectX.

I've been looking forward to this game for a while, i'll probably give it a hot this weekend.

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#2
Posted 09/26/2017 08:35 PM   
I am about 80 minutes in and think it is brilliant - the look and quality of Rime for me (and Rime is one of my favorites of 2017), but gameplay more like Zelda. It is DX11 - CM kicks in as well.
I am about 80 minutes in and think it is brilliant - the look and quality of Rime for me (and Rime is one of my favorites of 2017), but gameplay more like Zelda.

It is DX11 - CM kicks in as well.

#3
Posted 09/26/2017 09:27 PM   
[img]https://forums.geforce.com/cmd/default/download-comment-attachment/73766/[/img] [img]https://forums.geforce.com/cmd/default/download-comment-attachment/73767/[/img] [img]https://forums.geforce.com/cmd/default/download-comment-attachment/73768/[/img]
Image

Image

Image

Acer H5360 (1280x720@120Hz) - ASUS VG248QE with GSync mod - 3D Vision 1&2 - Driver 372.54
GTX 970 - i5-4670K@4.2GHz - 12GB RAM - Win7x64+evilKB2670838 - 4 Disk X25 RAID
SAGER NP9870-S - GTX 980 - i7-6700K - Win10 Pro 1607
Latest 3Dmigoto Release
Bo3b's School for ShaderHackers

#4
Posted 09/28/2017 03:58 AM   
Looks amazing!
Looks amazing!

#5
Posted 09/28/2017 01:29 PM   
[quote="bo3b"][img]https://forums.geforce.com/cmd/default/download-comment-attachment/73766/[/img] [img]https://forums.geforce.com/cmd/default/download-comment-attachment/73767/[/img] [img]https://forums.geforce.com/cmd/default/download-comment-attachment/73768/[/img][/quote] Those Screenshots look pretty promising. Did you fix any of the shaders or did you just disable the shadows? I played for about 30 minutes yesterday in 2D and it look like a really neat game. if one of the more experienced shader hackers are not looking at fixing it, I might give it a shot when i have some free time (Divinity 2 is eating up most of it right now).
bo3b said:Image

Image

Image


Those Screenshots look pretty promising. Did you fix any of the shaders or did you just disable the shadows? I played for about 30 minutes yesterday in 2D and it look like a really neat game. if one of the more experienced shader hackers are not looking at fixing it, I might give it a shot when i have some free time (Divinity 2 is eating up most of it right now).

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#6
Posted 09/29/2017 08:32 PM   
Fun game - I just like puzzles (for the most part) so playing Easy on the battles. Great Part?-- Good Native Surround, which is rare these days, and yes playing with no shadows. Works for me. @TheBigDogma, thanks for letting us know of the game :-)
Fun game - I just like puzzles (for the most part) so playing Easy on the battles. Great Part?-- Good Native Surround, which is rare these days, and yes playing with no shadows. Works for me.

@TheBigDogma, thanks for letting us know of the game :-)

#7
Posted 09/29/2017 09:04 PM   
NP - glad you are enjoying it. While I don't have the background to fix 'em, I can at least be the person willing to take a flyer on a new game to let the community know of its existence, if it works/identify the problems in 3D and give initial opinions on the type/quality of the game... In my humble opinion... LOL
NP - glad you are enjoying it. While I don't have the background to fix 'em, I can at least be the person willing to take a flyer on a new game to let the community know of its existence, if it works/identify the problems in 3D and give initial opinions on the type/quality of the game...

In my humble opinion... LOL

#8
Posted 09/29/2017 09:10 PM   
I'm in the process of fixing this game and managed to get the shadows almost working. The issue i'm running into is that the shadows look ok towards the center of the screen but the further things are from the center the more they start to deviate. The game is deriving it's position from a depth map. I suspect that the fov/projection matrix is throwing off the calculated depth. I've tried applying stereo correction using three different methods and I get near identical results. Method 3 seems to be the most accurate. Here's the shader the modified code start at line 173: [code] // ---- Created with 3Dmigoto v1.2.65 on Fri Oct 06 23:26:26 2017 cbuffer _Globals : register(b0) { row_major float4x4 constMat_worldViewInverse : packoffset(c0); row_major float4x4 constMat_world : packoffset(c4); float4 const_fogColorAndDensity : packoffset(c8); float4 const_fogColor2AndLerp : packoffset(c9); float4 const_fogHeightParams : packoffset(c10); float4 const_Parameters : packoffset(c11); float const_NearClip : packoffset(c12); row_major float4x4 constMat_inverseViewMainCam : packoffset(c13); row_major float4x4 constMat_inverseViewMainCam2 : packoffset(c17); row_major float4x4 constMat_viewMainCam2 : packoffset(c21); row_major float4x4 const_camMatrix : packoffset(c25); float4 const_blurParams : packoffset(c29); } cbuffer AutoConstantParamsGlobal : register(b1) { row_major float4x4 constMat_proj : packoffset(c0); row_major float4x4 constMat_inverseProjMainCam : packoffset(c4); row_major float4x4 constMat_view : packoffset(c8); row_major float4x4 constMat_viewInv : packoffset(c12); row_major float4x4 constMat_viewProj : packoffset(c16); row_major float4x4 constMat_shadow : packoffset(c20); float const_Time : packoffset(c24); float const_PCGamma : packoffset(c24.y); } cbuffer UberShaderSharedShadowParams : register(b2) { row_major float4x4 constMat_viewToShadow : packoffset(c0); float const_DefaultShadow : packoffset(c4); float4 const_CloudSettings : packoffset(c5); float4 const_CloudDirection : packoffset(c6); } cbuffer UberShaderSharedParams : register(b3) { int const_numLights : packoffset(c0); int4 const_firstLightByType : packoffset(c1); float4 const_lightPos[64] : packoffset(c2); float4 const_lightMaxInfluenceRadius[64] : packoffset(c66); float4 const_lightDir[64] : packoffset(c130); float4 const_lightColor[64] : packoffset(c194); int4 const_elightType[64] : packoffset(c258); } cbuffer UberShaderLightGlobals : register(b4) { float3 const_globalLightDir : packoffset(c0); float4 const_globalLightColor : packoffset(c1); float3 const_globalLightDirWorld : packoffset(c2); float4 const_globalFogParams : packoffset(c3); float4 const_globalFogParams2 : packoffset(c4); float4 const_globalFogParams3 : packoffset(c5); float4 const_globalFogParams4 : packoffset(c6); float4 const_globalFogParams5 : packoffset(c7); float4 const_globalFogParams6 : packoffset(c8); float3 const_globalAmbientTop : packoffset(c9); float3 const_globalAmbientBottom : packoffset(c10); float4 const_CamPosWorldSpace : packoffset(c11); float4 const_LockOnData : packoffset(c12); float4 const_LockOnData2 : packoffset(c13); int const_ShaderQuality : packoffset(c14); } cbuffer UberShaderLightZoneFogs : register(b5) { int const_FogMode : packoffset(c0); int const_zoneIds[10] : packoffset(c1); int const_numFogs : packoffset(c10.y); float4 const_ZoneAABBs[10] : packoffset(c11); float4 const_ZoneAABBs2[10] : packoffset(c21); float4 const_ZoneFogColors[10] : packoffset(c31); float4 const_ZoneFogParams[10] : packoffset(c41); float4 const_ZoneCloudSettings[10] : packoffset(c51); float4 const_ZoneAmbientTop[10] : packoffset(c61); float4 const_ZoneAmbientBottom[10] : packoffset(c71); float4 const_ZoneLightColor[10] : packoffset(c81); int const_FXNumFogs : packoffset(c91); float4 const_FXZoneAABBs[6] : packoffset(c92); float4 const_FXZoneAABBs2[6] : packoffset(c98); float4 const_FXZoneFogColors[6] : packoffset(c104); float4 const_FXZoneFogParams[6] : packoffset(c110); float4 const_FXZoneCloudSettings[6] : packoffset(c116); float4 const_FXZoneBluriness[6] : packoffset(c122); float4 const_FXZoneAmbientTop[6] : packoffset(c128); float4 const_FXZoneAmbientBottom[6] : packoffset(c134); float4 const_FXZoneLightColor[6] : packoffset(c140); } cbuffer UberShaderSharedFxVolumeParams : register(b6) { int const_numFxVolumes : packoffset(c0); float4 const_fxVolumePos[6] : packoffset(c1); float4 const_fxVolumeSize[6] : packoffset(c7); float4 const_fxBlurriness[6] : packoffset(c13); float4 const_fxVolumeExtraParams[6] : packoffset(c19); float4 const_fxVolumeExtraParams2[6] : packoffset(c25); } SamplerState CloudShadowMainLightSample_s : register(s5); SamplerComparisonState SampleShadowMapForLightPass_s : register(s3); Texture2D<float4> DepthMap : register(t0); Texture2D<uint4> NormalSpecMap : register(t1); Texture2D<float4> DiffuseFlagsGlossMap : register(t2); Texture2D<float4> ShadowMaskMap2D : register(t3); Texture2D<float4> SpecLineMap2D : register(t4); Texture2D<float4> CloudShadowMainLight2D : register(t5); // 3Dmigoto declarations #define cmp - Texture1D<float4> IniParams : register(t120); Texture2D<float4> StereoParams : register(t125); void main( float4 v0 : SV_POSITION0, float4 v1 : TEXCOORD0, float3 v2 : TEXCOORD2, out float4 o0 : SV_TARGET0) { float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20; uint4 bitmask, uiDest; float4 fDest; r0.xy = (int2)v0.xy; r0.zw = float2(0,0); r1.xyzw = DepthMap.Load(r0.xyw).xyzw; float4 depth = r1; r1.y = dot(v1.xyz, v1.xyz); r1.y = rsqrt(r1.y); r1.yzw = v1.xyz * r1.yyy; r2.xyz = r1.yzw * r1.xxx; r2.xyz = float3(250,250,250) * r2.xyz; r2.w = dot(r2.xyz, r2.xyz); r2.w = rsqrt(r2.w); r3.xyz = r2.xyz * r2.www; r4.xy = cmp(float2(2,0.999989986) < r1.xx); r1.yzw = float3(500,500,500) * r1.yzw; r5.xyz = r4.xxx ? r1.yzw : r2.xyz; r6.xyzw = NormalSpecMap.Load(r0.xyw).xyzw; r1.yz = (uint2)r6.xy; r1.yz = r1.yz * float2(3.05180438e-005,3.05180438e-005) + float2(-1,-1); r1.yz = r1.yz * float2(4,4) + float2(-2,-2); r1.w = dot(r1.yz, r1.yz); r7.zw = -r1.ww * float2(0.25,0.5) + float2(1,1); r1.w = max(9.99999975e-006, r7.z); r1.w = sqrt(r1.w); r7.xy = r1.yz * r1.ww; r8.x = (uint)r6.w >> 11; r8.y = (uint)r6.w >> 5; r8.z = (uint)r6.z >> 1; r1.yz = (int2)r8.yz & int2(63,3); r1.w = (int)r6.w & 31; r8.x = (uint)r8.x; r8.yz = (uint2)r1.yw; r4.xzw = float3(0.0322580636,0.0158730168,0.0322580636) * r8.xyz; r4.xzw = log2(r4.xzw); r4.xzw = float3(2.23333335,2.23333335,2.23333335) * r4.xzw; r4.xzw = exp2(r4.xzw); r1.y = dot(r7.xyw, r7.xyw); r1.y = rsqrt(r1.y); r6.xyw = r7.xyw * r1.yyy; r7.xyzw = DiffuseFlagsGlossMap.Load(r0.xyw).xyzw; r0.xyzw = SpecLineMap2D.Load(r0.xyz).xyzw; r5.w = 1; // I'm assuming that r5 is in view space since it's later transformed by constMat_inverseViewMainCam2 and constMat_viewToShadow matrices float4 stereo = StereoParams.Load(0); // method 1 convert r5 to screen space, apply stereo correction, revert back to view space. //r5 = mul(constMat_proj,r5); //r5.x -= stereo.x * (r5.z - stereo.y); //r5 = mul(constMat_inverseProjMainCam,r5); // method 2 calculate stereo correction from depth * farclip(250), convert to view space. apply correction. //float4 temp = float4(stereo.x * (depth.x*250 - stereo.y), 0, 0, 1); //temp = mul(constMat_inverseProjMainCam,temp); //r5.x-=temp.x/temp.w; // method 3 apply stereo correction/ constMat_proj._m00 in view space r5.x += stereo.x * (r5.z + stereo.y)/constMat_proj._m00; r8.x = dot(constMat_inverseViewMainCam2._m00_m01_m02_m03, r5.xyzw); r8.y = dot(constMat_inverseViewMainCam2._m10_m11_m12_m13, r5.xyzw); r8.z = dot(constMat_inverseViewMainCam2._m20_m21_m22_m23, r5.xyzw); r1.yw = cmp(float2(0,0) < const_globalFogParams6.xw); r9.xy = const_globalFogParams6.yw * const_globalFogParams6.xw; r10.w = r9.x * 4 + 1; r3.w = sqrt(r10.w); r10.xyz = r3.www * r0.xyz; r11.xyz = r0.xyz; r11.w = 1; r10.xyzw = r1.yyyy ? r10.xyzw : r11.xyzw; r0.x = dot(constMat_viewToShadow._m00_m01_m02_m03, r5.xyzw); r0.y = dot(constMat_viewToShadow._m10_m11_m12_m13, r5.xyzw); r0.z = dot(constMat_viewToShadow._m20_m21_m22_m23, r5.xyzw); r0.z = -0.000250000012 + r0.z; ShadowMaskMap2D.GetDimensions(0, fDest.x, fDest.y, fDest.z); r11.xyzw = fDest.xyzw; r9.xz = float2(1,1) / r11.xy; r11.xyzw = r9.xzxz * float4(0.949886084,-1.1073817,-0.196300924,-2.0994606) + r0.xyxy; r3.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x; r3.w = r5.w + r3.w; r11.xyzw = r9.xzxz * float4(2.15324783,-0.323505372,0.0236708559,0.0111014554) + r0.xyxy; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x; r3.w = r5.w + r3.w; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x; r3.w = r5.w + r3.w; r11.xyzw = r9.xzxz * float4(1.24742198,0.5429281,-0.148218974,1.22262907) + r0.xyxy; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x; r3.w = r5.w + r3.w; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x; r3.w = r5.w + r3.w; r11.xyzw = r9.xzxz * float4(1.05310702,1.92213535,-0.560414135,-0.809013486) + r0.xyxy; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x; r3.w = r5.w + r3.w; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x; r3.w = r5.w + r3.w; r11.xyzw = r9.xzxz * float4(-1.33767915,0.871231675,-1.40126014,-1.39552164) + r0.xyxy; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x; r3.w = r5.w + r3.w; r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x; r3.w = r5.w + r3.w; r9.xz = r9.xz * float2(-1.45771122,-0.236581624) + r0.xy; r0.z = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r9.xz, r0.z).x; r0.z = r3.w + r0.z; r3.w = 0.0909090936 * r0.z; r9.xz = float2(-0.899999976,-0.899999976) + r0.yx; r9.xz = saturate(float2(12.5,12.5) * r9.xz); r0.z = -r0.z * 0.0909090936 + const_DefaultShadow; r0.z = r9.x * r0.z + r3.w; r3.w = const_DefaultShadow + -r0.z; r0.z = r9.z * r3.w + r0.z; r0.xy = float2(0.100000001,0.100000001) + -r0.yx; r0.xy = saturate(float2(12.5,12.5) * r0.xy); r3.w = const_DefaultShadow + -r0.z; r0.x = r0.x * r3.w + r0.z; r0.z = const_DefaultShadow + -r0.x; r0.x = r0.y * r0.z + r0.x; r0.y = cmp(0.00100000005 < r0.x); r0.z = saturate(dot(const_globalLightDir.xyz, r6.xyw)); r9.xzw = r7.xyz * r0.zzz; r11.xyz = -r2.xyz * r2.www + const_globalLightDir.xyz; r3.w = dot(r11.xyz, r11.xyz); r3.w = rsqrt(r3.w); r11.xyz = r11.xyz * r3.www; r3.w = saturate(dot(r11.xyz, r6.xyw)); r5.w = 11 * r7.w; r5.w = exp2(r5.w); r3.w = log2(r3.w); r3.w = r5.w * r3.w; r3.w = exp2(r3.w); r11.x = 4 + r5.w; r11.x = 0.125 * r11.x; r3.w = r11.x * r3.w; r11.yzw = r3.www * r10.xyz; r11.yzw = r11.yzw * r0.zzz; r12.xyz = -r7.xyz * r0.zzz + float3(0.800000012,0.800000012,0.800000012); r13.xyz = -r7.xyz * r0.zzz + float3(2,2,2); r12.xyz = float3(1,1,1) / r12.xyz; r12.xyz = saturate(r13.xyz * r12.xyz); r13.xyz = r12.xyz * float3(-2,-2,-2) + float3(3,3,3); r12.xyz = r12.xyz * r12.xyz; r12.xyz = r13.xyz * r12.xyz + float3(1,1,1); r9.xzw = r11.yzw * r12.xyz + r9.xzw; r9.xzw = r0.yyy ? r9.xzw : 0; r9.xzw = r9.xzw * r0.xxx; r0.yz = (int2)const_firstLightByType.yz + int2(-1,-1); r11.yzw = float3(0,0,0); r3.w = const_firstLightByType.x; while (true) { r12.x = cmp((int)r0.y < (int)r3.w); if (r12.x != 0) break; r12.xyz = const_lightPos[r3.w].xyz + -r5.xyz; r12.w = dot(r12.xyz, r12.xyz); r12.w = sqrt(r12.w); r13.x = cmp(const_lightMaxInfluenceRadius[r3.w].x < r12.w); if (r13.x != 0) { r13.x = (int)r3.w + 1; r3.w = r13.x; continue; } else { r13.x = r3.w; } r13.y = -const_lightPos[r3.w].w + r12.w; r13.y = max(0, r13.y); r13.y = r13.y / const_lightPos[r3.w].w; r13.y = 1 + r13.y; r13.y = r13.y * r13.y; r13.y = 1 / r13.y; r13.y = -0.0199999996 + r13.y; r13.y = 1.02040815 * r13.y; r13.y = max(0, r13.y); r13.z = const_elightType[r13.x].y ? r0.x : 1; r13.w = cmp(0 < r13.y); r14.x = cmp(0.00499999989 < r13.z); r13.w = r13.w ? r14.x : 0; if (r13.w != 0) { r12.xyz = r12.xyz / r12.www; r14.xyz = const_lightColor[r13.x].xyz * const_lightColor[r13.x].www; r14.xyz = r14.xyz * r13.yyy; r12.w = saturate(dot(r12.xyz, r6.xyw)); r15.xyz = r14.xyz * r7.xyz; r16.xyz = r15.xyz * r12.www; r12.xyz = -r2.xyz * r2.www + r12.xyz; r13.y = dot(r12.xyz, r12.xyz); r13.y = rsqrt(r13.y); r12.xyz = r13.yyy * r12.xyz; r12.x = saturate(dot(r12.xyz, r6.xyw)); r12.x = log2(r12.x); r12.x = r12.x * r5.w; r12.x = exp2(r12.x); r12.x = r12.x * r11.x; r12.xyz = r12.xxx * r10.xyz; r14.xyz = r12.www * r14.xyz; r12.xyz = r14.xyz * r12.xyz; r14.xyz = -r15.xyz * r12.www + float3(0.800000012,0.800000012,0.800000012); r15.xyz = -r15.xyz * r12.www + float3(2,2,2); r14.xyz = float3(1,1,1) / r14.xyz; r14.xyz = saturate(r15.xyz * r14.xyz); r15.xyz = r14.xyz * float3(-2,-2,-2) + float3(3,3,3); r14.xyz = r14.xyz * r14.xyz; r14.xyz = r15.xyz * r14.xyz + float3(1,1,1); r12.xyz = r12.xyz * r14.xyz + r16.xyz; r11.yzw = r12.xyz * r13.zzz + r11.yzw; } r3.w = (int)r13.x + 1; } r12.xyz = r11.yzw; r0.y = const_firstLightByType.y; while (true) { r3.w = cmp((int)r0.z < (int)r0.y); if (r3.w != 0) break; r13.xyz = const_lightPos[r0.y].xyz + -r5.xyz; r3.w = dot(r13.xyz, r13.xyz); r3.w = sqrt(r3.w); r12.w = cmp(const_lightMaxInfluenceRadius[r0.y].x < r3.w); if (r12.w != 0) { r12.w = (int)r0.y + 1; r0.y = r12.w; continue; } else { r12.w = r0.y; } r13.xyz = r13.xyz / r3.www; r13.w = const_elightType[r12.w].y ? r0.x : 1; r14.x = dot(-r13.xyz, const_lightDir[r12.w].xyz); r14.y = cmp(const_lightDir[r12.w].w < r14.x); r14.z = cmp(0.00499999989 < r13.w); r14.y = r14.z ? r14.y : 0; if (r14.y != 0) { r3.w = -const_lightPos[r0.y].w + r3.w; r3.w = max(0, r3.w); r3.w = r3.w / const_lightPos[r0.y].w; r3.w = 1 + r3.w; r3.w = r3.w * r3.w; r3.w = 1 / r3.w; r3.w = -0.0199999996 + r3.w; r3.w = 1.02040815 * r3.w; r3.w = max(0, r3.w); r14.x = saturate(-const_lightDir[r12.w].w + r14.x); r14.y = -const_lightDir[r12.w].w + 1; r14.x = r14.x / r14.y; r3.w = r14.x * r3.w; r14.x = cmp(0 < r3.w); if (r14.x != 0) { r14.xyz = const_lightColor[r12.w].xyz * const_lightColor[r12.w].www; r14.xyz = r14.xyz * r3.www; r3.w = saturate(dot(r13.xyz, r6.xyw)); r15.xyz = r14.xyz * r7.xyz; r16.xyz = r15.xyz * r3.www; r13.xyz = -r2.xyz * r2.www + r13.xyz; r14.w = dot(r13.xyz, r13.xyz); r14.w = rsqrt(r14.w); r13.xyz = r14.www * r13.xyz; r13.x = saturate(dot(r13.xyz, r6.xyw)); r13.x = log2(r13.x); r13.x = r13.x * r5.w; r13.x = exp2(r13.x); r13.x = r13.x * r11.x; r13.xyz = r13.xxx * r10.xyz; r14.xyz = r3.www * r14.xyz; r13.xyz = r14.xyz * r13.xyz; r14.xyz = -r15.xyz * r3.www + float3(0.800000012,0.800000012,0.800000012); r15.xyz = -r15.xyz * r3.www + float3(2,2,2); r14.xyz = float3(1,1,1) / r14.xyz; r14.xyz = saturate(r15.xyz * r14.xyz); r15.xyz = r14.xyz * float3(-2,-2,-2) + float3(3,3,3); r14.xyz = r14.xyz * r14.xyz; r14.xyz = r15.xyz * r14.xyz + float3(1,1,1); r13.xyz = r13.xyz * r14.xyz + r16.xyz; r12.xyz = r13.xyz * r13.www + r12.xyz; } } r0.y = (int)r12.w + 1; } r0.x = const_numLights + -1; r2.xyz = float3(0,0,0); r11.xyz = float3(0,0,0); r0.y = 1; r0.z = const_firstLightByType.z; while (true) { r2.w = cmp((int)r0.x < (int)r0.z); if (r2.w != 0) break; r13.xyz = const_lightPos[r0.z].xyz + -r5.xyz; r2.w = dot(r13.xyz, r13.xyz); r2.w = sqrt(r2.w); r3.w = cmp(const_lightMaxInfluenceRadius[r0.z].x < r2.w); if (r3.w != 0) { r3.w = (int)r0.z + 1; r0.z = r3.w; continue; } else { r3.w = r0.z; } r2.w = r2.w / const_lightPos[r0.z].w; r2.w = 1 + -r2.w; r2.w = max(0, r2.w); r2.w = r2.w * r2.w; r2.w = r2.w * r2.w; r5.w = cmp(0 < r2.w); if (r5.w != 0) { r13.xyz = -const_lightColor[r3.w].xyz * const_lightColor[r3.w].www; r13.xyz = r13.xyz * r2.www; r2.xyz = max(r13.xyz, r2.xyz); r13.xyz = const_lightColor[r3.w].xyz * const_lightColor[r3.w].www; r13.xyz = r13.xyz * r2.www; r11.xyz = max(r13.xyz, r11.xyz); if (const_elightType[r3.w].y != 0) { r2.w = const_lightColor[r3.w].w * r2.w + 1; r2.w = min(r2.w, r0.y); r0.y = max(0, r2.w); } } r0.z = (int)r3.w + 1; } if (r1.z != 0) { r0.x = (uint)r6.z >> 3; r0.x = (int)r0.x & 31; r0.x = (uint)r0.x; r0.z = cmp((int)r1.z == 1); r5.xyz = r0.zzz ? float3(1.75,-1.75,0.00400000019) : float3(1.45000005,-1.45000005,0.000699999975); r13.xy = v0.xy; r13.zw = float2(0,0); r14.xy = r13.xy + r5.yy; r14.zw = float2(0,0); r14.xyzw = (int4)r14.xyzw; r14.xyzw = DepthMap.Load(r14.xyz).xyzw; r5.w = 0; r15.xyzw = r13.xyww + r5.wyww; r15.xyzw = (int4)r15.xyzw; r15.xyzw = DepthMap.Load(r15.xyz).xyzw; r16.xyzw = r13.xyww + r5.xyww; r16.xyzw = (int4)r16.xyzw; r16.xyzw = DepthMap.Load(r16.xyz).xyzw; r17.xyzw = r13.xyww + r5.xwww; r17.xyzw = (int4)r17.xyzw; r17.xyzw = DepthMap.Load(r17.xyz).xyzw; r18.xyzw = r13.xyww + r5.ywww; r18.xyzw = (int4)r18.xyzw; r18.xyzw = DepthMap.Load(r18.xyz).xyzw; r19.xyzw = r13.xyww + r5.yxww; r19.xyzw = (int4)r19.xyzw; r19.xyzw = DepthMap.Load(r19.xyz).xyzw; r20.xyzw = r13.xyww + r5.wxww; r20.xyzw = (int4)r20.xyzw; r20.xyzw = DepthMap.Load(r20.xyz).xyzw; r13.xyzw = r13.xyzw + r5.xxww; r13.xyzw = (int4)r13.xyzw; r13.xyzw = DepthMap.Load(r13.xyz).xyzw; r0.z = max(r15.x, r14.x); r0.z = max(r0.z, r16.x); r0.z = max(r0.z, r17.x); r0.z = max(r0.z, r18.x); r0.z = max(r0.z, r19.x); r0.z = max(r0.z, r20.x); r0.z = max(r0.z, r13.x); r0.z = r0.z + -r1.x; r0.z = cmp(r5.z < r0.z); r1.z = cmp(15.6549997 < r0.x); r5.xy = float2(0.0645161271,0.645161271) * r0.xx; r0.x = r1.z ? r5.y : r5.x; r5.xyz = r0.zzz ? r0.xxx : float3(1,1,1); } else { r5.xyz = float3(1,1,1); } r12.xyz = r12.xyz * r5.xyz; r9.xzw = r9.xzw * r10.www; r0.x = r1.x * 250 + -const_globalFogParams2.x; r0.x = max(0, r0.x); r0.x = const_globalFogParams.w * r0.x; r0.x = r0.x * r0.x; r0.x = 1.44269502 * r0.x; r0.x = exp2(r0.x); r0.x = 1 / r0.x; r0.x = 1 + -r0.x; r0.z = const_globalFogParams2.z + -r8.y; r0.z = saturate(r0.z / const_globalFogParams3.w); r13.xyz = const_globalFogParams3.xyz + -const_globalFogParams.xyz; r13.xyz = r0.zzz * r13.xyz + const_globalFogParams.xyz; r0.x = abs(const_globalFogParams2.y) * r0.x; r0.z = const_CamPosWorldSpace.y + const_globalFogParams2.z; r0.z = r0.z + -r8.y; r0.z = r0.z / const_globalFogParams2.w; r0.z = max(0, r0.z); r0.z = r0.z * r0.z; r0.z = 1.44269502 * r0.z; r0.z = exp2(r0.z); r0.z = 1 / r0.z; r0.z = 1 + -r0.z; r0.x = max(r0.x, r0.z); r0.z = r1.x * 250 + -const_globalFogParams5.x; r0.z = max(0, r0.z); r1.z = 250 + -const_globalFogParams5.x; r0.z = r0.z / r1.z; r0.z = saturate(const_globalFogParams4.w * r0.z); r14.xy = float2(1,0); while (true) { r1.z = cmp((int)r14.y >= const_numFxVolumes); if (r1.z != 0) break; r1.z = cmp(const_fxBlurriness[r14.y].w < 0.5); if (r1.z != 0) { r15.xyz = -const_fxVolumePos[r14.y].xyz + r8.xyz; r15.xyz = saturate(abs(r15.xyz) / const_fxVolumeSize[r14.y].xyz); r15.xyz = log2(r15.xyz); r15.xyz = const_fxBlurriness[r14.y].xyz * r15.xyz; r15.xyz = exp2(r15.xyz); r1.z = max(r15.x, r15.y); r1.z = max(r1.z, r15.z); r1.z = 1 + -r1.z; r2.w = dot(r15.xyz, r15.xyz); r2.w = sqrt(r2.w); r2.w = min(1, r2.w); r2.w = 1 + -r2.w; r2.w = r2.w + -r1.z; r1.z = const_fxVolumeSize[r14.y].w * r2.w + r1.z; r1.z = r1.z * -const_fxVolumePos[r14.y].w + 1; r14.x = r14.x * r1.z; } r14.y = (int)r14.y + 1; } r1.z = saturate(-1 + r14.x); r14.x = saturate(r14.x); r2.w = dot(r3.xyz, r6.xyw); r2.w = r2.w + r2.w; r14.yzw = r6.xyw * -r2.www + r3.xyz; r2.w = dot(constMat_viewInv._m10_m11_m12, r14.yzw); r3.w = dot(constMat_viewInv._m10_m11_m12, r6.xyw); r2.xyz = saturate(float3(1,1,1) + -r2.xyz); r2.xyz = r9.xzw * r2.xyz; r5.w = r1.x * 250 + -230; r5.w = saturate(0.0500000007 * r5.w); r9.xzw = float3(1,1,1) + -r11.xyz; r9.xzw = saturate(r5.www * r9.xzw + r11.xyz); r11.xy = const_globalLightDirWorld.xz / -const_globalLightDirWorld.yy; r8.w = 1; r11.xy = r11.xy * r8.wy; r5.w = const_numFogs + 1; r14.yzw = float3(0.289999992,0.649999976,127) * const_Time; r15.x = sin(r14.y); r15.y = cos(r14.z); r16.x = r8.y; r16.y = -1; r11.xy = r16.xy * r11.xy; r11.xy = r8.xz * float2(1,-1) + r11.xy; r6.z = r0.y * 0.5 + 0.5; r16.xyz = r10.xyz * r6.zzz; r2.w = 1 + r2.w; r2.w = 0.5 * r2.w; r3.w = 1 + r3.w; r3.w = 0.5 * r3.w; r10.xyz = -r10.xyz * r6.zzz + float3(1,1,1); r3.x = saturate(dot(-r3.xyz, r6.xyw)); r3.x = 1 + -r3.x; r3.y = r3.x * r3.x; r3.y = r3.y * r3.y; r3.x = r3.x * r3.y; r6.xyw = float3(0,0,0); r3.yz = float2(0,1.40129846e-045); while (true) { r10.w = cmp((int)r3.z < (int)r5.w); r11.z = cmp((int)r3.z < 10); r10.w = r10.w ? r11.z : 0; if (r10.w == 0) break; r11.zw = -const_ZoneAABBs[r3.z].xy + r8.xz; r14.yz = const_ZoneAABBs[r3.z].zw * float2(0.514999986,0.514999986); r11.zw = abs(r11.zw) / abs(r14.yz); r11.zw = min(float2(1,1), r11.zw); r11.zw = float2(1,1) + -r11.zw; r10.w = const_ZoneAmbientTop[r3.z].w * 9; r11.zw = saturate(r11.zw * r10.ww); r10.w = min(r11.z, r11.w); r11.z = const_ZoneAABBs2[r3.z].z * r10.w; r11.w = cmp(0.00100000005 < r11.z); r14.yz = const_ZoneCloudSettings[r3.z].ww * r15.xy; r12.w = const_ZoneCloudSettings[r3.z].y * const_Time; r15.zw = const_CloudDirection.xy * r12.ww; r17.xy = r11.xy / const_ZoneCloudSettings[r3.z].xx; r14.yz = r14.yz * float2(0.00999999978,0.00999999978) + r15.zw; r14.yz = r17.xy + r14.yz; r17.xyzw = CloudShadowMainLight2D.Sample(CloudShadowMainLightSample_s, r14.yz).xyzw; if (r11.w != 0) { r11.w = cmp(0.100000001 < const_ZoneCloudSettings[r3.z].z); if (r11.w != 0) { r11.w = r17.x + -r17.y; r11.w = const_ZoneCloudSettings[r3.z].w * r11.w + r17.y; r11.w = -1 + r11.w; r17.xyz = const_ZoneCloudSettings[r3.z].zzz * r11.www + float3(1,1,1); } else { r17.xyz = float3(1,1,1); } r18.xyz = float3(1,1,1) + -r17.xyz; r17.xyz = r9.xzw * r18.xyz + r17.xyz; r17.xyz = r17.xyz * r2.xyz; r17.xyz = const_ZoneLightColor[r3.z].xyz * r17.xyz; r17.xyz = r17.xyz * const_ZoneLightColor[r3.z].www + r12.xyz; r18.xyz = const_ZoneAmbientBottom[r3.z].xyz * r6.zzz; r19.xyz = const_ZoneAmbientTop[r3.z].xyz * r0.yyy + -r18.xyz; r20.xyz = r2.www * r19.xyz + r18.xyz; r18.xyz = r3.www * r19.xyz + r18.xyz; r19.xyz = r20.xyz * r10.xyz; r19.xyz = r19.xyz * r3.xxx; r20.xyz = r20.xyz * r16.xyz; r19.xyz = float3(0.25,0.25,0.25) * r19.xyz; r18.xyz = r18.xyz * r7.xyz + r19.xyz; r19.xyz = r20.xyz * float3(0.100000001,0.100000001,0.100000001) + r19.xyz; r19.xyz = r19.xyz + -r18.xyz; r18.xyz = r7.www * r19.xyz + r18.xyz; r17.xyz = r18.xyz + r17.xyz; r17.xyz = r17.xyz * r5.xyz; r6.xyw = r17.xyz * r11.zzz + r6.xyw; r3.y = r10.w * const_ZoneAABBs2[r3.z].z + r3.y; } r3.z = (int)r3.z + 1; } r3.z = cmp(r3.y < 0.99000001); r11.zw = const_ZoneCloudSettings[0].ww * r15.xy; r5.w = const_ZoneCloudSettings[0].y * const_Time; r14.yz = const_CloudDirection.xy * r5.ww; r15.zw = r11.xy / const_ZoneCloudSettings[0].xx; r11.zw = r11.zw * float2(0.00999999978,0.00999999978) + r14.yz; r11.zw = r15.zw + r11.zw; r17.xyzw = CloudShadowMainLight2D.Sample(CloudShadowMainLightSample_s, r11.zw).xyzw; if (r3.z != 0) { r3.z = cmp(0.100000001 < const_ZoneCloudSettings[0].z); if (r3.z != 0) { r3.z = r17.x + -r17.y; r3.z = const_ZoneCloudSettings[0].w * r3.z + r17.y; r3.z = -1 + r3.z; r17.xyz = const_ZoneCloudSettings[0].zzz * r3.zzz + float3(1,1,1); } else { r17.xyz = float3(1,1,1); } r18.xyz = float3(1,1,1) + -r17.xyz; r9.xzw = r9.xzw * r18.xyz + r17.xyz; r9.xzw = r9.xzw * r2.xyz; r9.xzw = const_ZoneLightColor[0].xyz * r9.xzw; r9.xzw = r9.xzw * const_ZoneLightColor[0].www + r12.xyz; r17.xyz = const_ZoneAmbientBottom[0].xyz * r6.zzz; r18.xyz = const_ZoneAmbientTop[0].xyz * r0.yyy + -r17.xyz; r19.xyz = r2.www * r18.xyz + r17.xyz; r17.xyz = r3.www * r18.xyz + r17.xyz; r18.xyz = r19.xyz * r10.xyz; r18.xyz = r18.xyz * r3.xxx; r19.xyz = r19.xyz * r16.xyz; r18.xyz = float3(0.25,0.25,0.25) * r18.xyz; r17.xyz = r17.xyz * r7.xyz + r18.xyz; r18.xyz = r19.xyz * float3(0.100000001,0.100000001,0.100000001) + r18.xyz; r18.xyz = r18.xyz + -r17.xyz; r17.xyz = r7.www * r18.xyz + r17.xyz; r9.xzw = r17.xyz + r9.xzw; r9.xzw = r9.xzw * r5.xyz; r3.z = 1 + -r3.y; r6.xyw = r9.xzw * r3.zzz + r6.xyw; r3.y = 1; } r6.xyw = r6.xyw / r3.yyy; r9.xzw = r6.xyw; r3.yz = float2(0,0); while (true) { r5.w = cmp((int)r3.z < const_FXNumFogs); r10.w = cmp((int)r3.z < 6); r5.w = r5.w ? r10.w : 0; if (r5.w == 0) break; r17.xz = -const_FXZoneAABBs[r3.z].xy; r17.y = -const_FXZoneAABBs2[r3.z].x; r17.xyz = r17.xyz + r8.xyz; r18.xz = const_FXZoneAABBs[r3.z].zw * float2(0.514999986,0.514999986); r18.y = const_FXZoneAABBs2[r3.z].y * 0.514999986; r17.xyz = abs(r17.xyz) / abs(r18.xyz); r17.xyz = min(float3(1,1,1), r17.xyz); r17.xyz = float3(1,1,1) + -r17.xyz; r17.xyz = log2(r17.xyz); r17.xyz = const_FXZoneBluriness[r3.z].xyz * r17.xyz; r17.xyz = exp2(r17.xyz); r5.w = min(r17.y, r17.z); r5.w = min(r17.x, r5.w); r10.w = const_FXZoneAABBs2[r3.z].z * r5.w; r11.z = cmp(0.00999999978 < r10.w); r14.yz = const_FXZoneCloudSettings[r3.z].ww * r15.xy; r11.w = const_FXZoneCloudSettings[r3.z].y * const_Time; r15.zw = const_CloudDirection.xy * r11.ww; r17.xy = r11.xy / const_FXZoneCloudSettings[r3.z].xx; r14.yz = r14.yz * float2(0.00999999978,0.00999999978) + r15.zw; r14.yz = r17.xy + r14.yz; r17.xyzw = CloudShadowMainLight2D.Sample(CloudShadowMainLightSample_s, r14.yz).xyzw; if (r11.z != 0) { r3.y = r5.w * const_FXZoneAABBs2[r3.z].z + r3.y; r5.w = cmp(0.100000001 < const_FXZoneCloudSettings[r3.z].z); if (r5.w != 0) { r5.w = r17.x + -r17.y; r5.w = const_FXZoneCloudSettings[r3.z].w * r5.w + r17.y; r5.w = -1 + r5.w; r17.xyz = const_FXZoneCloudSettings[r3.z].zzz * r5.www + float3(1,1,1); } else { r17.xyz = float3(1,1,1); } r17.xyz = r17.xyz * r2.xyz; r17.xyz = const_FXZoneLightColor[r3.z].xyz * r17.xyz; r17.xyz = r17.xyz * const_FXZoneLightColor[r3.z].www + r12.xyz; r18.xyz = const_FXZoneAmbientBottom[r3.z].xyz * r6.zzz; r19.xyz = const_FXZoneAmbientTop[r3.z].xyz * r0.yyy + -r18.xyz; r20.xyz = r2.www * r19.xyz + r18.xyz; r18.xyz = r3.www * r19.xyz + r18.xyz; r19.xyz = r20.xyz * r10.xyz; r19.xyz = r19.xyz * r3.xxx; r20.xyz = r20.xyz * r16.xyz; r19.xyz = float3(0.25,0.25,0.25) * r19.xyz; r18.xyz = r18.xyz * r7.xyz + r19.xyz; r19.xyz = r20.xyz * float3(0.100000001,0.100000001,0.100000001) + r19.xyz; r19.xyz = r19.xyz + -r18.xyz; r18.xyz = r7.www * r19.xyz + r18.xyz; r17.xyz = r18.xyz + r17.xyz; r17.xyz = r17.xyz * r5.xyz; r9.xzw = r17.xyz * r10.www + r9.xzw; } r3.z = (int)r3.z + 1; } r0.y = 1 + r3.y; r2.xyz = r9.xzw / r0.yyy; r0.x = r1.z + r0.x; r0.x = min(1, r0.x); r0.x = r0.x * r14.x; r3.xyz = r13.xyz + -r2.xyz; r2.xyz = r0.xxx * r3.xyz + r2.xyz; r0.x = max(0, const_globalFogParams5.w); r0.x = r0.x * 10 + 1; r3.xyz = const_globalFogParams4.xyz * r0.xxx; r0.y = 0.150000006 * r1.z; r0.y = saturate(r0.z * const_globalFogParams5.y + r0.y); r0.y = 0.800000012 * r0.y; r0.z = r14.x * 0.5 + 0.5; r0.y = r0.y * r0.z; r5.xyz = const_globalFogParams4.xyz * r0.xxx + -r2.xyz; r0.xyz = r0.yyy * r5.xyz + r2.xyz; r0.xyz = r4.yyy ? r3.xyz : r0.xyz; r2.xy = -const_LockOnData.wy + r8.wy; r2.x = saturate(r2.x); r1.z = v2.y * 2 + -1; r1.z = 0.409999996 + -abs(r1.z); r1.z = saturate(11.7647057 * r1.z); r2.z = r1.z * -2 + 3; r1.z = r1.z * r1.z; r1.z = r2.z * r1.z; r2.y = saturate(0.0833333358 * r2.y); r2.y = 1 + -r2.y; r2.y = rsqrt(r2.y); r2.y = 1 / r2.y; r2.x = r2.x * r2.y; r1.z = r1.z * 0.899999976 + 0.100000001; r2.yzw = r0.xyz * r1.zzz + -r0.xyz; r0.xyz = r2.xxx * r2.yzw + r0.xyz; r0.w = r0.w * 6 + 1; r0.xyz = r4.xzw * r0.www + r0.xyz; r2.xyz = const_globalFogParams6.zzz * r13.xyz; r0.w = r1.x * r1.x; r0.w = const_globalFogParams6.x * r0.w; r0.w = saturate(const_globalFogParams6.y * r0.w); r2.xyz = r2.xyz * float3(20,20,20) + -r0.xyz; r2.xyz = r0.www * r2.xyz + r0.xyz; r0.xyz = r1.yyy ? r2.xyz : r0.xyz; r1.xyz = float3(-0.300000012,-0.800000012,-0.300000012) + r0.xyz; r1.xyz = saturate(float3(1.21212125,6.66666651,1.21212125) * r1.xyz); r2.xyz = r1.xyz * float3(-2,-2,-2) + float3(3,3,3); r1.xyz = r1.xyz * r1.xyz; r1.xyz = r2.xyz * r1.xyz + float3(-0.00999999978,-0.0500000007,-0.00999999978); r1.xyz = const_globalFogParams6.www * r1.xyz; r1.xyz = r1.xyz * float3(2,2,2) + r0.xyz; r1.xyz = max(float3(0,0,0), r1.xyz); r2.xy = float2(3179,3179) * v0.xy; r2.xy = (int2)r2.xy; r0.w = (int)r14.w; r0.w = (uint)r0.w << 16; r2.y = (uint)r2.y << 8; r0.w = (int)r0.w + (int)r2.y; r0.w = (int)r0.w + (int)r2.x; r2.x = (uint)r0.w << 13; r0.w = (int)r0.w ^ (int)r2.x; r2.x = (int)r0.w * (int)r0.w; r2.x = mad((int)r2.x, 0x00003d73, 0x000c0ae5); r0.w = mad((int)r0.w, (int)r2.x, 0x5208dd0d); r0.w = (int)r0.w & 0x7fffffff; r0.w = (int)r0.w; r2.xyz = float3(1.62981448e-010,6.98491915e-012,1.86264518e-010) * r0.www; r0.w = r9.y * r9.y; r2.xyz = r2.xyz * r0.www; r1.xyz = r2.xyz * float3(0.25,0.25,0.25) + r1.xyz; r0.xyz = r1.www ? r1.xyz : r0.xyz; r0.w = cmp(0.5 < const_globalFogParams5.z); r1.x = cmp(1 >= const_globalFogParams5.z); r0.w = r0.w ? r1.x : 0; r1.x = cmp(r8.y < -40); r0.w = r0.w ? r1.x : 0; if (r0.w != 0) { r0.w = cmp(const_ShaderQuality >= 3); if (r0.w != 0) { r1.xyz = float3(0.0500000007,-0.100000001,0.0375000015) * const_Time; r1.xyz = r8.xyz * float3(0.075000003,0.0500000007,0.075000003) + r1.xyz; r0.w = dot(r1.xyz, float3(0.333333343,0.333333343,0.333333343)); r2.xyz = r1.xyz + r0.www; r2.xyz = floor(r2.xyz); r1.xyz = -r2.xyz + r1.xyz; r0.w = dot(r2.xyz, float3(0.166666672,0.166666672,0.166666672)); r1.xyz = r1.xyz + r0.www; r3.xyz = cmp(r1.zxy >= r1.xyz); r4.xyz = r3.yzx ? float3(1,1,1) : 0; r3.xyz = r3.xyz ? float3(0,0,0) : float3(1,1,1); r5.xyz = min(r4.xyz, r3.xyz); r3.xyz = max(r4.yzx, r3.yzx); r4.xyz = -r5.xyz + r1.xyz; r4.xyz = float3(0.166666672,0.166666672,0.166666672) + r4.xyz; r6.xyz = -r3.zxy + r1.xyz; r6.xyz = float3(0.333333343,0.333333343,0.333333343) + r6.xyz; r7.xyz = float3(-0.5,-0.5,-0.5) + r1.xyz; r9.xyz = float3(0.00346020772,0.00346020772,0.00346020772) * r2.xyz; r9.xyz = floor(r9.xyz); r2.xyz = -r9.xyz * float3(289,289,289) + r2.xyz; r9.xw = float2(0,1); r9.y = r5.z; r9.z = r3.y; r9.xyzw = r9.xyzw + r2.zzzz; r10.xyzw = r9.xyzw * float4(34,34,34,34) + float4(1,1,1,1); r9.xyzw = r10.xyzw * r9.xyzw; r10.xyzw = float4(0.00346020772,0.00346020772,0.00346020772,0.00346020772) * r9.xyzw; r10.xyzw = floor(r10.xyzw); r9.xyzw = -r10.xyzw * float4(289,289,289,289) + r9.xyzw; r9.xyzw = r9.xyzw + r2.yyyy; r10.xw = float2(0,1); r10.y = r5.y; r10.z = r3.x; r9.xyzw = r10.xyzw + r9.xyzw; r10.xyzw = r9.xyzw * float4(34,34,34,34) + float4(1,1,1,1); r9.xyzw = r10.xyzw * r9.xyzw; r10.xyzw = float4(0.00346020772,0.00346020772,0.00346020772,0.00346020772) * r9.xyzw; r10.xyzw = floor(r10.xyzw); r9.xyzw = -r10.xyzw * float4(289,289,289,289) + r9.xyzw; r2.xyzw = r9.xyzw + r2.xxxx; r3.xw = float2(0,1); r3.y = r5.x; r2.xyzw = r3.xyzw + r2.xyzw; r3.xyzw = r2.xyzw * float4(34,34,34,34) + float4(1,1,1,1); r2.xyzw = r3.xyzw * r2.xyzw; r3.xyzw = float4(0.00346020772,0.00346020772,0.00346020772,0.00346020772) * r2.xyzw; r3.xyzw = floor(r3.xyzw); r2.xyzw = -r3.xyzw * float4(289,289,289,289) + r2.xyzw; r3.xyzw = float4(0.0204081628,0.0204081628,0.0204081628,0.0204081628) * r2.xyzw; r3.xyzw = floor(r3.xyzw); r2.xyzw = -r3.xyzw * float4(49,49,49,49) + r2.xyzw; r3.xyzw = float4(0.142857149,0.142857149,0.142857149,0.142857149) * r2.xyzw; r3.xyzw = floor(r3.xyzw); r2.xyzw = -r3.xyzw * float4(7,7,7,7) + r2.xyzw; r3.xyzw = r3.xyzw * float4(0.285714298,0.285714298,0.285714298,0.285714298) + float4(-0.928571403,-0.928571403,-0.928571403,-0.928571403); r2.xyzw = r2.xzyw * float4(0.285714298,0.285714298,0.285714298,0.285714298) + float4(-0.928571403,-0.928571403,-0.928571403,-0.928571403); r5.xyzw = float4(1,1,1,1) + -abs(r3.xyzw); r5.xyzw = r5.xywz + -abs(r2.xzwy); r9.xz = floor(r3.xy); r9.yw = floor(r2.xz); r9.xyzw = r9.xyzw * float4(2,2,2,2) + float4(1,1,1,1); r10.xz = floor(r3.zw); r10.yw = floor(r2.yw); r10.xyzw = r10.xyzw * float4(2,2,2,2) + float4(1,1,1,1); r11.xyzw = cmp(float4(0,0,0,0) >= r5.xywz); r11.xyzw = r11.xyzw ? float4(-1,-1,-1,-1) : float4(-0,-0,-0,-0); r12.xz = r3.xy; r12.yw = r2.xz; r9.xyzw = r9.zwxy * r11.yyxx + r12.zwxy; r2.xz = r3.zw; r2.xyzw = r10.xyzw * r11.zzww + r2.xyzw; r3.xy = r9.zw; r3.z = r5.x; r10.x = dot(r3.xyz, r3.xyz); r9.z = r5.y; r10.y = dot(r9.xyz, r9.xyz); r11.xy = r2.xy; r11.z = r5.w; r10.z = dot(r11.xyz, r11.xyz); r5.xy = r2.zw; r10.w = dot(r5.xyz, r5.xyz); r2.xyzw = -r10.xyzw * float4(0.853734732,0.853734732,0.853734732,0.853734732) + float4(1.79284286,1.79284286,1.79284286,1.79284286); r3.xyz = r3.xyz * r2.xxx; r9.xyz = r9.xyz * r2.yyy; r2.xyz = r11.xyz * r2.zzz; r5.xyz = r5.xyz * r2.www; r10.x = dot(r1.xyz, r1.xyz); r10.y = dot(r4.xyz, r4.xyz); r10.z = dot(r6.xyz, r6.xyz); r10.w = dot(r7.xyz, r7.xyz); r10.xyzw = float4(0.600000024,0.600000024,0.600000024,0.600000024) + -r10.xyzw; r10.xyzw = max(float4(0,0,0,0), r10.xyzw); r10.xyzw = r10.xyzw * r10.xyzw; r10.xyzw = r10.xyzw * r10.xyzw; r1.x = dot(r3.xyz, r1.xyz); r1.y = dot(r9.xyz, r4.xyz); r1.z = dot(r2.xyz, r6.xyz); r1.w = dot(r5.xyz, r7.xyz); r0.w = dot(r10.xyzw, r1.xyzw); r1.xyzw = float4(40,94,64,48.5) + r8.yxyz; r0.w = r0.w * 21 + 0.5; r0.w = r0.w * 40 + 12.5; r0.w = saturate(-r1.x / r0.w); r1.xyz = float3(0.0135135138,0.015625,0.0357142873) * abs(r1.yzw); r1.xyz = r1.xyz * r1.xyz; r1.x = dot(r1.xyz, r1.xyz); r1.x = sqrt(r1.x); r0.w = r0.w * r0.w; r1.x = min(1, r1.x); r0.w = r1.x * r0.w; r1.xyz = const_globalFogParams4.xyz * float3(3,3,3) + -r0.xyz; r0.xyz = r0.www * r1.xyz + r0.xyz; } else { r0.w = 40 + r8.y; r0.w = saturate(-0.0444444455 * r0.w); r0.w = r0.w * r0.w; r1.xyz = const_globalFogParams4.xyz * float3(3,3,3) + -r0.xyz; r0.xyz = r0.www * r1.xyz + r0.xyz; } } o0.xyz = r0.xyz; o0.w = 0; return; } [/code]
I'm in the process of fixing this game and managed to get the shadows almost working. The issue i'm running into is that the shadows look ok towards the center of the screen but the further things are from the center the more they start to deviate. The game is deriving it's position from a depth map. I suspect that the fov/projection matrix is throwing off the calculated depth. I've tried applying stereo correction using three different methods and I get near identical results. Method 3 seems to be the most accurate. Here's the shader the modified code start at line 173:
// ---- Created with 3Dmigoto v1.2.65 on Fri Oct 06 23:26:26 2017

cbuffer _Globals : register(b0)
{
row_major float4x4 constMat_worldViewInverse : packoffset(c0);
row_major float4x4 constMat_world : packoffset(c4);
float4 const_fogColorAndDensity : packoffset(c8);
float4 const_fogColor2AndLerp : packoffset(c9);
float4 const_fogHeightParams : packoffset(c10);
float4 const_Parameters : packoffset(c11);
float const_NearClip : packoffset(c12);
row_major float4x4 constMat_inverseViewMainCam : packoffset(c13);
row_major float4x4 constMat_inverseViewMainCam2 : packoffset(c17);
row_major float4x4 constMat_viewMainCam2 : packoffset(c21);
row_major float4x4 const_camMatrix : packoffset(c25);
float4 const_blurParams : packoffset(c29);
}

cbuffer AutoConstantParamsGlobal : register(b1)
{
row_major float4x4 constMat_proj : packoffset(c0);
row_major float4x4 constMat_inverseProjMainCam : packoffset(c4);
row_major float4x4 constMat_view : packoffset(c8);
row_major float4x4 constMat_viewInv : packoffset(c12);
row_major float4x4 constMat_viewProj : packoffset(c16);
row_major float4x4 constMat_shadow : packoffset(c20);
float const_Time : packoffset(c24);
float const_PCGamma : packoffset(c24.y);
}

cbuffer UberShaderSharedShadowParams : register(b2)
{
row_major float4x4 constMat_viewToShadow : packoffset(c0);
float const_DefaultShadow : packoffset(c4);
float4 const_CloudSettings : packoffset(c5);
float4 const_CloudDirection : packoffset(c6);
}

cbuffer UberShaderSharedParams : register(b3)
{
int const_numLights : packoffset(c0);
int4 const_firstLightByType : packoffset(c1);
float4 const_lightPos[64] : packoffset(c2);
float4 const_lightMaxInfluenceRadius[64] : packoffset(c66);
float4 const_lightDir[64] : packoffset(c130);
float4 const_lightColor[64] : packoffset(c194);
int4 const_elightType[64] : packoffset(c258);
}

cbuffer UberShaderLightGlobals : register(b4)
{
float3 const_globalLightDir : packoffset(c0);
float4 const_globalLightColor : packoffset(c1);
float3 const_globalLightDirWorld : packoffset(c2);
float4 const_globalFogParams : packoffset(c3);
float4 const_globalFogParams2 : packoffset(c4);
float4 const_globalFogParams3 : packoffset(c5);
float4 const_globalFogParams4 : packoffset(c6);
float4 const_globalFogParams5 : packoffset(c7);
float4 const_globalFogParams6 : packoffset(c8);
float3 const_globalAmbientTop : packoffset(c9);
float3 const_globalAmbientBottom : packoffset(c10);
float4 const_CamPosWorldSpace : packoffset(c11);
float4 const_LockOnData : packoffset(c12);
float4 const_LockOnData2 : packoffset(c13);
int const_ShaderQuality : packoffset(c14);
}

cbuffer UberShaderLightZoneFogs : register(b5)
{
int const_FogMode : packoffset(c0);
int const_zoneIds[10] : packoffset(c1);
int const_numFogs : packoffset(c10.y);
float4 const_ZoneAABBs[10] : packoffset(c11);
float4 const_ZoneAABBs2[10] : packoffset(c21);
float4 const_ZoneFogColors[10] : packoffset(c31);
float4 const_ZoneFogParams[10] : packoffset(c41);
float4 const_ZoneCloudSettings[10] : packoffset(c51);
float4 const_ZoneAmbientTop[10] : packoffset(c61);
float4 const_ZoneAmbientBottom[10] : packoffset(c71);
float4 const_ZoneLightColor[10] : packoffset(c81);
int const_FXNumFogs : packoffset(c91);
float4 const_FXZoneAABBs[6] : packoffset(c92);
float4 const_FXZoneAABBs2[6] : packoffset(c98);
float4 const_FXZoneFogColors[6] : packoffset(c104);
float4 const_FXZoneFogParams[6] : packoffset(c110);
float4 const_FXZoneCloudSettings[6] : packoffset(c116);
float4 const_FXZoneBluriness[6] : packoffset(c122);
float4 const_FXZoneAmbientTop[6] : packoffset(c128);
float4 const_FXZoneAmbientBottom[6] : packoffset(c134);
float4 const_FXZoneLightColor[6] : packoffset(c140);
}

cbuffer UberShaderSharedFxVolumeParams : register(b6)
{
int const_numFxVolumes : packoffset(c0);
float4 const_fxVolumePos[6] : packoffset(c1);
float4 const_fxVolumeSize[6] : packoffset(c7);
float4 const_fxBlurriness[6] : packoffset(c13);
float4 const_fxVolumeExtraParams[6] : packoffset(c19);
float4 const_fxVolumeExtraParams2[6] : packoffset(c25);
}

SamplerState CloudShadowMainLightSample_s : register(s5);
SamplerComparisonState SampleShadowMapForLightPass_s : register(s3);
Texture2D<float4> DepthMap : register(t0);
Texture2D<uint4> NormalSpecMap : register(t1);
Texture2D<float4> DiffuseFlagsGlossMap : register(t2);
Texture2D<float4> ShadowMaskMap2D : register(t3);
Texture2D<float4> SpecLineMap2D : register(t4);
Texture2D<float4> CloudShadowMainLight2D : register(t5);


// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
float4 v0 : SV_POSITION0,
float4 v1 : TEXCOORD0,
float3 v2 : TEXCOORD2,
out float4 o0 : SV_TARGET0)
{
float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20;
uint4 bitmask, uiDest;
float4 fDest;

r0.xy = (int2)v0.xy;
r0.zw = float2(0,0);
r1.xyzw = DepthMap.Load(r0.xyw).xyzw;
float4 depth = r1;
r1.y = dot(v1.xyz, v1.xyz);
r1.y = rsqrt(r1.y);
r1.yzw = v1.xyz * r1.yyy;
r2.xyz = r1.yzw * r1.xxx;
r2.xyz = float3(250,250,250) * r2.xyz;
r2.w = dot(r2.xyz, r2.xyz);
r2.w = rsqrt(r2.w);
r3.xyz = r2.xyz * r2.www;
r4.xy = cmp(float2(2,0.999989986) < r1.xx);
r1.yzw = float3(500,500,500) * r1.yzw;

r5.xyz = r4.xxx ? r1.yzw : r2.xyz;
r6.xyzw = NormalSpecMap.Load(r0.xyw).xyzw;
r1.yz = (uint2)r6.xy;
r1.yz = r1.yz * float2(3.05180438e-005,3.05180438e-005) + float2(-1,-1);
r1.yz = r1.yz * float2(4,4) + float2(-2,-2);
r1.w = dot(r1.yz, r1.yz);
r7.zw = -r1.ww * float2(0.25,0.5) + float2(1,1);
r1.w = max(9.99999975e-006, r7.z);
r1.w = sqrt(r1.w);
r7.xy = r1.yz * r1.ww;
r8.x = (uint)r6.w >> 11;
r8.y = (uint)r6.w >> 5;
r8.z = (uint)r6.z >> 1;
r1.yz = (int2)r8.yz & int2(63,3);
r1.w = (int)r6.w & 31;
r8.x = (uint)r8.x;
r8.yz = (uint2)r1.yw;
r4.xzw = float3(0.0322580636,0.0158730168,0.0322580636) * r8.xyz;
r4.xzw = log2(r4.xzw);
r4.xzw = float3(2.23333335,2.23333335,2.23333335) * r4.xzw;
r4.xzw = exp2(r4.xzw);
r1.y = dot(r7.xyw, r7.xyw);
r1.y = rsqrt(r1.y);
r6.xyw = r7.xyw * r1.yyy;
r7.xyzw = DiffuseFlagsGlossMap.Load(r0.xyw).xyzw;
r0.xyzw = SpecLineMap2D.Load(r0.xyz).xyzw;
r5.w = 1;

// I'm assuming that r5 is in view space since it's later transformed by constMat_inverseViewMainCam2 and constMat_viewToShadow matrices
float4 stereo = StereoParams.Load(0);

// method 1 convert r5 to screen space, apply stereo correction, revert back to view space.
//r5 = mul(constMat_proj,r5);
//r5.x -= stereo.x * (r5.z - stereo.y);
//r5 = mul(constMat_inverseProjMainCam,r5);

// method 2 calculate stereo correction from depth * farclip(250), convert to view space. apply correction.
//float4 temp = float4(stereo.x * (depth.x*250 - stereo.y), 0, 0, 1);
//temp = mul(constMat_inverseProjMainCam,temp);
//r5.x-=temp.x/temp.w;

// method 3 apply stereo correction/ constMat_proj._m00 in view space
r5.x += stereo.x * (r5.z + stereo.y)/constMat_proj._m00;

r8.x = dot(constMat_inverseViewMainCam2._m00_m01_m02_m03, r5.xyzw);
r8.y = dot(constMat_inverseViewMainCam2._m10_m11_m12_m13, r5.xyzw);
r8.z = dot(constMat_inverseViewMainCam2._m20_m21_m22_m23, r5.xyzw);
r1.yw = cmp(float2(0,0) < const_globalFogParams6.xw);
r9.xy = const_globalFogParams6.yw * const_globalFogParams6.xw;
r10.w = r9.x * 4 + 1;
r3.w = sqrt(r10.w);
r10.xyz = r3.www * r0.xyz;
r11.xyz = r0.xyz;
r11.w = 1;
r10.xyzw = r1.yyyy ? r10.xyzw : r11.xyzw;

r0.x = dot(constMat_viewToShadow._m00_m01_m02_m03, r5.xyzw);
r0.y = dot(constMat_viewToShadow._m10_m11_m12_m13, r5.xyzw);
r0.z = dot(constMat_viewToShadow._m20_m21_m22_m23, r5.xyzw);
r0.z = -0.000250000012 + r0.z;
ShadowMaskMap2D.GetDimensions(0, fDest.x, fDest.y, fDest.z);
r11.xyzw = fDest.xyzw;
r9.xz = float2(1,1) / r11.xy;
r11.xyzw = r9.xzxz * float4(0.949886084,-1.1073817,-0.196300924,-2.0994606) + r0.xyxy;
r3.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x;
r3.w = r5.w + r3.w;
r11.xyzw = r9.xzxz * float4(2.15324783,-0.323505372,0.0236708559,0.0111014554) + r0.xyxy;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x;
r3.w = r5.w + r3.w;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x;
r3.w = r5.w + r3.w;
r11.xyzw = r9.xzxz * float4(1.24742198,0.5429281,-0.148218974,1.22262907) + r0.xyxy;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x;
r3.w = r5.w + r3.w;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x;
r3.w = r5.w + r3.w;
r11.xyzw = r9.xzxz * float4(1.05310702,1.92213535,-0.560414135,-0.809013486) + r0.xyxy;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x;
r3.w = r5.w + r3.w;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x;
r3.w = r5.w + r3.w;
r11.xyzw = r9.xzxz * float4(-1.33767915,0.871231675,-1.40126014,-1.39552164) + r0.xyxy;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.xy, r0.z).x;
r3.w = r5.w + r3.w;
r5.w = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r11.zw, r0.z).x;
r3.w = r5.w + r3.w;
r9.xz = r9.xz * float2(-1.45771122,-0.236581624) + r0.xy;
r0.z = ShadowMaskMap2D.SampleCmpLevelZero(SampleShadowMapForLightPass_s, r9.xz, r0.z).x;
r0.z = r3.w + r0.z;
r3.w = 0.0909090936 * r0.z;
r9.xz = float2(-0.899999976,-0.899999976) + r0.yx;
r9.xz = saturate(float2(12.5,12.5) * r9.xz);
r0.z = -r0.z * 0.0909090936 + const_DefaultShadow;
r0.z = r9.x * r0.z + r3.w;
r3.w = const_DefaultShadow + -r0.z;
r0.z = r9.z * r3.w + r0.z;
r0.xy = float2(0.100000001,0.100000001) + -r0.yx;
r0.xy = saturate(float2(12.5,12.5) * r0.xy);
r3.w = const_DefaultShadow + -r0.z;
r0.x = r0.x * r3.w + r0.z;
r0.z = const_DefaultShadow + -r0.x;
r0.x = r0.y * r0.z + r0.x;
r0.y = cmp(0.00100000005 < r0.x);
r0.z = saturate(dot(const_globalLightDir.xyz, r6.xyw));
r9.xzw = r7.xyz * r0.zzz;
r11.xyz = -r2.xyz * r2.www + const_globalLightDir.xyz;
r3.w = dot(r11.xyz, r11.xyz);
r3.w = rsqrt(r3.w);
r11.xyz = r11.xyz * r3.www;
r3.w = saturate(dot(r11.xyz, r6.xyw));
r5.w = 11 * r7.w;
r5.w = exp2(r5.w);
r3.w = log2(r3.w);
r3.w = r5.w * r3.w;
r3.w = exp2(r3.w);
r11.x = 4 + r5.w;
r11.x = 0.125 * r11.x;
r3.w = r11.x * r3.w;
r11.yzw = r3.www * r10.xyz;
r11.yzw = r11.yzw * r0.zzz;
r12.xyz = -r7.xyz * r0.zzz + float3(0.800000012,0.800000012,0.800000012);
r13.xyz = -r7.xyz * r0.zzz + float3(2,2,2);
r12.xyz = float3(1,1,1) / r12.xyz;
r12.xyz = saturate(r13.xyz * r12.xyz);
r13.xyz = r12.xyz * float3(-2,-2,-2) + float3(3,3,3);
r12.xyz = r12.xyz * r12.xyz;
r12.xyz = r13.xyz * r12.xyz + float3(1,1,1);
r9.xzw = r11.yzw * r12.xyz + r9.xzw;
r9.xzw = r0.yyy ? r9.xzw : 0;
r9.xzw = r9.xzw * r0.xxx;
r0.yz = (int2)const_firstLightByType.yz + int2(-1,-1);
r11.yzw = float3(0,0,0);
r3.w = const_firstLightByType.x;
while (true) {
r12.x = cmp((int)r0.y < (int)r3.w);
if (r12.x != 0) break;
r12.xyz = const_lightPos[r3.w].xyz + -r5.xyz;
r12.w = dot(r12.xyz, r12.xyz);
r12.w = sqrt(r12.w);
r13.x = cmp(const_lightMaxInfluenceRadius[r3.w].x < r12.w);
if (r13.x != 0) {
r13.x = (int)r3.w + 1;
r3.w = r13.x;
continue;
} else {
r13.x = r3.w;
}
r13.y = -const_lightPos[r3.w].w + r12.w;
r13.y = max(0, r13.y);
r13.y = r13.y / const_lightPos[r3.w].w;
r13.y = 1 + r13.y;
r13.y = r13.y * r13.y;
r13.y = 1 / r13.y;
r13.y = -0.0199999996 + r13.y;
r13.y = 1.02040815 * r13.y;
r13.y = max(0, r13.y);
r13.z = const_elightType[r13.x].y ? r0.x : 1;
r13.w = cmp(0 < r13.y);
r14.x = cmp(0.00499999989 < r13.z);
r13.w = r13.w ? r14.x : 0;
if (r13.w != 0) {
r12.xyz = r12.xyz / r12.www;
r14.xyz = const_lightColor[r13.x].xyz * const_lightColor[r13.x].www;
r14.xyz = r14.xyz * r13.yyy;
r12.w = saturate(dot(r12.xyz, r6.xyw));
r15.xyz = r14.xyz * r7.xyz;
r16.xyz = r15.xyz * r12.www;
r12.xyz = -r2.xyz * r2.www + r12.xyz;
r13.y = dot(r12.xyz, r12.xyz);
r13.y = rsqrt(r13.y);
r12.xyz = r13.yyy * r12.xyz;
r12.x = saturate(dot(r12.xyz, r6.xyw));
r12.x = log2(r12.x);
r12.x = r12.x * r5.w;
r12.x = exp2(r12.x);
r12.x = r12.x * r11.x;
r12.xyz = r12.xxx * r10.xyz;
r14.xyz = r12.www * r14.xyz;
r12.xyz = r14.xyz * r12.xyz;
r14.xyz = -r15.xyz * r12.www + float3(0.800000012,0.800000012,0.800000012);
r15.xyz = -r15.xyz * r12.www + float3(2,2,2);
r14.xyz = float3(1,1,1) / r14.xyz;
r14.xyz = saturate(r15.xyz * r14.xyz);
r15.xyz = r14.xyz * float3(-2,-2,-2) + float3(3,3,3);
r14.xyz = r14.xyz * r14.xyz;
r14.xyz = r15.xyz * r14.xyz + float3(1,1,1);
r12.xyz = r12.xyz * r14.xyz + r16.xyz;
r11.yzw = r12.xyz * r13.zzz + r11.yzw;
}
r3.w = (int)r13.x + 1;
}
r12.xyz = r11.yzw;
r0.y = const_firstLightByType.y;
while (true) {
r3.w = cmp((int)r0.z < (int)r0.y);
if (r3.w != 0) break;
r13.xyz = const_lightPos[r0.y].xyz + -r5.xyz;
r3.w = dot(r13.xyz, r13.xyz);
r3.w = sqrt(r3.w);
r12.w = cmp(const_lightMaxInfluenceRadius[r0.y].x < r3.w);
if (r12.w != 0) {
r12.w = (int)r0.y + 1;
r0.y = r12.w;
continue;
} else {
r12.w = r0.y;
}
r13.xyz = r13.xyz / r3.www;
r13.w = const_elightType[r12.w].y ? r0.x : 1;
r14.x = dot(-r13.xyz, const_lightDir[r12.w].xyz);
r14.y = cmp(const_lightDir[r12.w].w < r14.x);
r14.z = cmp(0.00499999989 < r13.w);
r14.y = r14.z ? r14.y : 0;
if (r14.y != 0) {
r3.w = -const_lightPos[r0.y].w + r3.w;
r3.w = max(0, r3.w);
r3.w = r3.w / const_lightPos[r0.y].w;
r3.w = 1 + r3.w;
r3.w = r3.w * r3.w;
r3.w = 1 / r3.w;
r3.w = -0.0199999996 + r3.w;
r3.w = 1.02040815 * r3.w;
r3.w = max(0, r3.w);
r14.x = saturate(-const_lightDir[r12.w].w + r14.x);
r14.y = -const_lightDir[r12.w].w + 1;
r14.x = r14.x / r14.y;
r3.w = r14.x * r3.w;
r14.x = cmp(0 < r3.w);
if (r14.x != 0) {
r14.xyz = const_lightColor[r12.w].xyz * const_lightColor[r12.w].www;
r14.xyz = r14.xyz * r3.www;
r3.w = saturate(dot(r13.xyz, r6.xyw));
r15.xyz = r14.xyz * r7.xyz;
r16.xyz = r15.xyz * r3.www;
r13.xyz = -r2.xyz * r2.www + r13.xyz;
r14.w = dot(r13.xyz, r13.xyz);
r14.w = rsqrt(r14.w);
r13.xyz = r14.www * r13.xyz;
r13.x = saturate(dot(r13.xyz, r6.xyw));
r13.x = log2(r13.x);
r13.x = r13.x * r5.w;
r13.x = exp2(r13.x);
r13.x = r13.x * r11.x;
r13.xyz = r13.xxx * r10.xyz;
r14.xyz = r3.www * r14.xyz;
r13.xyz = r14.xyz * r13.xyz;
r14.xyz = -r15.xyz * r3.www + float3(0.800000012,0.800000012,0.800000012);
r15.xyz = -r15.xyz * r3.www + float3(2,2,2);
r14.xyz = float3(1,1,1) / r14.xyz;
r14.xyz = saturate(r15.xyz * r14.xyz);
r15.xyz = r14.xyz * float3(-2,-2,-2) + float3(3,3,3);
r14.xyz = r14.xyz * r14.xyz;
r14.xyz = r15.xyz * r14.xyz + float3(1,1,1);
r13.xyz = r13.xyz * r14.xyz + r16.xyz;
r12.xyz = r13.xyz * r13.www + r12.xyz;
}
}
r0.y = (int)r12.w + 1;
}
r0.x = const_numLights + -1;
r2.xyz = float3(0,0,0);
r11.xyz = float3(0,0,0);
r0.y = 1;
r0.z = const_firstLightByType.z;
while (true) {
r2.w = cmp((int)r0.x < (int)r0.z);
if (r2.w != 0) break;
r13.xyz = const_lightPos[r0.z].xyz + -r5.xyz;
r2.w = dot(r13.xyz, r13.xyz);
r2.w = sqrt(r2.w);
r3.w = cmp(const_lightMaxInfluenceRadius[r0.z].x < r2.w);
if (r3.w != 0) {
r3.w = (int)r0.z + 1;
r0.z = r3.w;
continue;
} else {
r3.w = r0.z;
}
r2.w = r2.w / const_lightPos[r0.z].w;
r2.w = 1 + -r2.w;
r2.w = max(0, r2.w);
r2.w = r2.w * r2.w;
r2.w = r2.w * r2.w;
r5.w = cmp(0 < r2.w);
if (r5.w != 0) {
r13.xyz = -const_lightColor[r3.w].xyz * const_lightColor[r3.w].www;
r13.xyz = r13.xyz * r2.www;
r2.xyz = max(r13.xyz, r2.xyz);
r13.xyz = const_lightColor[r3.w].xyz * const_lightColor[r3.w].www;
r13.xyz = r13.xyz * r2.www;
r11.xyz = max(r13.xyz, r11.xyz);
if (const_elightType[r3.w].y != 0) {
r2.w = const_lightColor[r3.w].w * r2.w + 1;
r2.w = min(r2.w, r0.y);
r0.y = max(0, r2.w);
}
}
r0.z = (int)r3.w + 1;
}
if (r1.z != 0) {
r0.x = (uint)r6.z >> 3;
r0.x = (int)r0.x & 31;
r0.x = (uint)r0.x;
r0.z = cmp((int)r1.z == 1);
r5.xyz = r0.zzz ? float3(1.75,-1.75,0.00400000019) : float3(1.45000005,-1.45000005,0.000699999975);
r13.xy = v0.xy;
r13.zw = float2(0,0);
r14.xy = r13.xy + r5.yy;
r14.zw = float2(0,0);
r14.xyzw = (int4)r14.xyzw;
r14.xyzw = DepthMap.Load(r14.xyz).xyzw;
r5.w = 0;
r15.xyzw = r13.xyww + r5.wyww;
r15.xyzw = (int4)r15.xyzw;
r15.xyzw = DepthMap.Load(r15.xyz).xyzw;
r16.xyzw = r13.xyww + r5.xyww;
r16.xyzw = (int4)r16.xyzw;
r16.xyzw = DepthMap.Load(r16.xyz).xyzw;
r17.xyzw = r13.xyww + r5.xwww;
r17.xyzw = (int4)r17.xyzw;
r17.xyzw = DepthMap.Load(r17.xyz).xyzw;
r18.xyzw = r13.xyww + r5.ywww;
r18.xyzw = (int4)r18.xyzw;
r18.xyzw = DepthMap.Load(r18.xyz).xyzw;
r19.xyzw = r13.xyww + r5.yxww;
r19.xyzw = (int4)r19.xyzw;
r19.xyzw = DepthMap.Load(r19.xyz).xyzw;
r20.xyzw = r13.xyww + r5.wxww;
r20.xyzw = (int4)r20.xyzw;
r20.xyzw = DepthMap.Load(r20.xyz).xyzw;
r13.xyzw = r13.xyzw + r5.xxww;
r13.xyzw = (int4)r13.xyzw;
r13.xyzw = DepthMap.Load(r13.xyz).xyzw;
r0.z = max(r15.x, r14.x);
r0.z = max(r0.z, r16.x);
r0.z = max(r0.z, r17.x);
r0.z = max(r0.z, r18.x);
r0.z = max(r0.z, r19.x);
r0.z = max(r0.z, r20.x);
r0.z = max(r0.z, r13.x);
r0.z = r0.z + -r1.x;
r0.z = cmp(r5.z < r0.z);
r1.z = cmp(15.6549997 < r0.x);
r5.xy = float2(0.0645161271,0.645161271) * r0.xx;
r0.x = r1.z ? r5.y : r5.x;
r5.xyz = r0.zzz ? r0.xxx : float3(1,1,1);
} else {
r5.xyz = float3(1,1,1);
}
r12.xyz = r12.xyz * r5.xyz;
r9.xzw = r9.xzw * r10.www;
r0.x = r1.x * 250 + -const_globalFogParams2.x;
r0.x = max(0, r0.x);
r0.x = const_globalFogParams.w * r0.x;
r0.x = r0.x * r0.x;
r0.x = 1.44269502 * r0.x;
r0.x = exp2(r0.x);
r0.x = 1 / r0.x;
r0.x = 1 + -r0.x;
r0.z = const_globalFogParams2.z + -r8.y;
r0.z = saturate(r0.z / const_globalFogParams3.w);
r13.xyz = const_globalFogParams3.xyz + -const_globalFogParams.xyz;
r13.xyz = r0.zzz * r13.xyz + const_globalFogParams.xyz;
r0.x = abs(const_globalFogParams2.y) * r0.x;
r0.z = const_CamPosWorldSpace.y + const_globalFogParams2.z;
r0.z = r0.z + -r8.y;
r0.z = r0.z / const_globalFogParams2.w;
r0.z = max(0, r0.z);
r0.z = r0.z * r0.z;
r0.z = 1.44269502 * r0.z;
r0.z = exp2(r0.z);
r0.z = 1 / r0.z;
r0.z = 1 + -r0.z;
r0.x = max(r0.x, r0.z);
r0.z = r1.x * 250 + -const_globalFogParams5.x;
r0.z = max(0, r0.z);
r1.z = 250 + -const_globalFogParams5.x;
r0.z = r0.z / r1.z;
r0.z = saturate(const_globalFogParams4.w * r0.z);
r14.xy = float2(1,0);
while (true) {
r1.z = cmp((int)r14.y >= const_numFxVolumes);
if (r1.z != 0) break;
r1.z = cmp(const_fxBlurriness[r14.y].w < 0.5);
if (r1.z != 0) {
r15.xyz = -const_fxVolumePos[r14.y].xyz + r8.xyz;
r15.xyz = saturate(abs(r15.xyz) / const_fxVolumeSize[r14.y].xyz);
r15.xyz = log2(r15.xyz);
r15.xyz = const_fxBlurriness[r14.y].xyz * r15.xyz;
r15.xyz = exp2(r15.xyz);
r1.z = max(r15.x, r15.y);
r1.z = max(r1.z, r15.z);
r1.z = 1 + -r1.z;
r2.w = dot(r15.xyz, r15.xyz);
r2.w = sqrt(r2.w);
r2.w = min(1, r2.w);
r2.w = 1 + -r2.w;
r2.w = r2.w + -r1.z;
r1.z = const_fxVolumeSize[r14.y].w * r2.w + r1.z;
r1.z = r1.z * -const_fxVolumePos[r14.y].w + 1;
r14.x = r14.x * r1.z;
}
r14.y = (int)r14.y + 1;
}
r1.z = saturate(-1 + r14.x);
r14.x = saturate(r14.x);
r2.w = dot(r3.xyz, r6.xyw);
r2.w = r2.w + r2.w;
r14.yzw = r6.xyw * -r2.www + r3.xyz;
r2.w = dot(constMat_viewInv._m10_m11_m12, r14.yzw);
r3.w = dot(constMat_viewInv._m10_m11_m12, r6.xyw);
r2.xyz = saturate(float3(1,1,1) + -r2.xyz);
r2.xyz = r9.xzw * r2.xyz;
r5.w = r1.x * 250 + -230;
r5.w = saturate(0.0500000007 * r5.w);
r9.xzw = float3(1,1,1) + -r11.xyz;
r9.xzw = saturate(r5.www * r9.xzw + r11.xyz);
r11.xy = const_globalLightDirWorld.xz / -const_globalLightDirWorld.yy;
r8.w = 1;
r11.xy = r11.xy * r8.wy;
r5.w = const_numFogs + 1;
r14.yzw = float3(0.289999992,0.649999976,127) * const_Time;
r15.x = sin(r14.y);
r15.y = cos(r14.z);
r16.x = r8.y;
r16.y = -1;
r11.xy = r16.xy * r11.xy;
r11.xy = r8.xz * float2(1,-1) + r11.xy;
r6.z = r0.y * 0.5 + 0.5;
r16.xyz = r10.xyz * r6.zzz;
r2.w = 1 + r2.w;
r2.w = 0.5 * r2.w;
r3.w = 1 + r3.w;
r3.w = 0.5 * r3.w;
r10.xyz = -r10.xyz * r6.zzz + float3(1,1,1);
r3.x = saturate(dot(-r3.xyz, r6.xyw));
r3.x = 1 + -r3.x;
r3.y = r3.x * r3.x;
r3.y = r3.y * r3.y;
r3.x = r3.x * r3.y;
r6.xyw = float3(0,0,0);
r3.yz = float2(0,1.40129846e-045);
while (true) {
r10.w = cmp((int)r3.z < (int)r5.w);
r11.z = cmp((int)r3.z < 10);
r10.w = r10.w ? r11.z : 0;
if (r10.w == 0) break;
r11.zw = -const_ZoneAABBs[r3.z].xy + r8.xz;
r14.yz = const_ZoneAABBs[r3.z].zw * float2(0.514999986,0.514999986);
r11.zw = abs(r11.zw) / abs(r14.yz);
r11.zw = min(float2(1,1), r11.zw);
r11.zw = float2(1,1) + -r11.zw;
r10.w = const_ZoneAmbientTop[r3.z].w * 9;
r11.zw = saturate(r11.zw * r10.ww);
r10.w = min(r11.z, r11.w);
r11.z = const_ZoneAABBs2[r3.z].z * r10.w;
r11.w = cmp(0.00100000005 < r11.z);
r14.yz = const_ZoneCloudSettings[r3.z].ww * r15.xy;
r12.w = const_ZoneCloudSettings[r3.z].y * const_Time;
r15.zw = const_CloudDirection.xy * r12.ww;
r17.xy = r11.xy / const_ZoneCloudSettings[r3.z].xx;
r14.yz = r14.yz * float2(0.00999999978,0.00999999978) + r15.zw;
r14.yz = r17.xy + r14.yz;
r17.xyzw = CloudShadowMainLight2D.Sample(CloudShadowMainLightSample_s, r14.yz).xyzw;
if (r11.w != 0) {
r11.w = cmp(0.100000001 < const_ZoneCloudSettings[r3.z].z);
if (r11.w != 0) {
r11.w = r17.x + -r17.y;
r11.w = const_ZoneCloudSettings[r3.z].w * r11.w + r17.y;
r11.w = -1 + r11.w;
r17.xyz = const_ZoneCloudSettings[r3.z].zzz * r11.www + float3(1,1,1);
} else {
r17.xyz = float3(1,1,1);
}
r18.xyz = float3(1,1,1) + -r17.xyz;
r17.xyz = r9.xzw * r18.xyz + r17.xyz;
r17.xyz = r17.xyz * r2.xyz;
r17.xyz = const_ZoneLightColor[r3.z].xyz * r17.xyz;
r17.xyz = r17.xyz * const_ZoneLightColor[r3.z].www + r12.xyz;
r18.xyz = const_ZoneAmbientBottom[r3.z].xyz * r6.zzz;
r19.xyz = const_ZoneAmbientTop[r3.z].xyz * r0.yyy + -r18.xyz;
r20.xyz = r2.www * r19.xyz + r18.xyz;
r18.xyz = r3.www * r19.xyz + r18.xyz;
r19.xyz = r20.xyz * r10.xyz;
r19.xyz = r19.xyz * r3.xxx;
r20.xyz = r20.xyz * r16.xyz;
r19.xyz = float3(0.25,0.25,0.25) * r19.xyz;
r18.xyz = r18.xyz * r7.xyz + r19.xyz;
r19.xyz = r20.xyz * float3(0.100000001,0.100000001,0.100000001) + r19.xyz;
r19.xyz = r19.xyz + -r18.xyz;
r18.xyz = r7.www * r19.xyz + r18.xyz;
r17.xyz = r18.xyz + r17.xyz;
r17.xyz = r17.xyz * r5.xyz;
r6.xyw = r17.xyz * r11.zzz + r6.xyw;
r3.y = r10.w * const_ZoneAABBs2[r3.z].z + r3.y;
}
r3.z = (int)r3.z + 1;
}
r3.z = cmp(r3.y < 0.99000001);
r11.zw = const_ZoneCloudSettings[0].ww * r15.xy;
r5.w = const_ZoneCloudSettings[0].y * const_Time;
r14.yz = const_CloudDirection.xy * r5.ww;
r15.zw = r11.xy / const_ZoneCloudSettings[0].xx;
r11.zw = r11.zw * float2(0.00999999978,0.00999999978) + r14.yz;
r11.zw = r15.zw + r11.zw;
r17.xyzw = CloudShadowMainLight2D.Sample(CloudShadowMainLightSample_s, r11.zw).xyzw;
if (r3.z != 0) {
r3.z = cmp(0.100000001 < const_ZoneCloudSettings[0].z);
if (r3.z != 0) {
r3.z = r17.x + -r17.y;
r3.z = const_ZoneCloudSettings[0].w * r3.z + r17.y;
r3.z = -1 + r3.z;
r17.xyz = const_ZoneCloudSettings[0].zzz * r3.zzz + float3(1,1,1);
} else {
r17.xyz = float3(1,1,1);
}
r18.xyz = float3(1,1,1) + -r17.xyz;
r9.xzw = r9.xzw * r18.xyz + r17.xyz;
r9.xzw = r9.xzw * r2.xyz;
r9.xzw = const_ZoneLightColor[0].xyz * r9.xzw;
r9.xzw = r9.xzw * const_ZoneLightColor[0].www + r12.xyz;
r17.xyz = const_ZoneAmbientBottom[0].xyz * r6.zzz;
r18.xyz = const_ZoneAmbientTop[0].xyz * r0.yyy + -r17.xyz;
r19.xyz = r2.www * r18.xyz + r17.xyz;
r17.xyz = r3.www * r18.xyz + r17.xyz;
r18.xyz = r19.xyz * r10.xyz;
r18.xyz = r18.xyz * r3.xxx;
r19.xyz = r19.xyz * r16.xyz;
r18.xyz = float3(0.25,0.25,0.25) * r18.xyz;
r17.xyz = r17.xyz * r7.xyz + r18.xyz;
r18.xyz = r19.xyz * float3(0.100000001,0.100000001,0.100000001) + r18.xyz;
r18.xyz = r18.xyz + -r17.xyz;
r17.xyz = r7.www * r18.xyz + r17.xyz;
r9.xzw = r17.xyz + r9.xzw;
r9.xzw = r9.xzw * r5.xyz;
r3.z = 1 + -r3.y;
r6.xyw = r9.xzw * r3.zzz + r6.xyw;
r3.y = 1;
}
r6.xyw = r6.xyw / r3.yyy;
r9.xzw = r6.xyw;
r3.yz = float2(0,0);
while (true) {
r5.w = cmp((int)r3.z < const_FXNumFogs);
r10.w = cmp((int)r3.z < 6);
r5.w = r5.w ? r10.w : 0;
if (r5.w == 0) break;
r17.xz = -const_FXZoneAABBs[r3.z].xy;
r17.y = -const_FXZoneAABBs2[r3.z].x;
r17.xyz = r17.xyz + r8.xyz;
r18.xz = const_FXZoneAABBs[r3.z].zw * float2(0.514999986,0.514999986);
r18.y = const_FXZoneAABBs2[r3.z].y * 0.514999986;
r17.xyz = abs(r17.xyz) / abs(r18.xyz);
r17.xyz = min(float3(1,1,1), r17.xyz);
r17.xyz = float3(1,1,1) + -r17.xyz;
r17.xyz = log2(r17.xyz);
r17.xyz = const_FXZoneBluriness[r3.z].xyz * r17.xyz;
r17.xyz = exp2(r17.xyz);
r5.w = min(r17.y, r17.z);
r5.w = min(r17.x, r5.w);
r10.w = const_FXZoneAABBs2[r3.z].z * r5.w;
r11.z = cmp(0.00999999978 < r10.w);
r14.yz = const_FXZoneCloudSettings[r3.z].ww * r15.xy;
r11.w = const_FXZoneCloudSettings[r3.z].y * const_Time;
r15.zw = const_CloudDirection.xy * r11.ww;
r17.xy = r11.xy / const_FXZoneCloudSettings[r3.z].xx;
r14.yz = r14.yz * float2(0.00999999978,0.00999999978) + r15.zw;
r14.yz = r17.xy + r14.yz;
r17.xyzw = CloudShadowMainLight2D.Sample(CloudShadowMainLightSample_s, r14.yz).xyzw;
if (r11.z != 0) {
r3.y = r5.w * const_FXZoneAABBs2[r3.z].z + r3.y;
r5.w = cmp(0.100000001 < const_FXZoneCloudSettings[r3.z].z);
if (r5.w != 0) {
r5.w = r17.x + -r17.y;
r5.w = const_FXZoneCloudSettings[r3.z].w * r5.w + r17.y;
r5.w = -1 + r5.w;
r17.xyz = const_FXZoneCloudSettings[r3.z].zzz * r5.www + float3(1,1,1);
} else {
r17.xyz = float3(1,1,1);
}
r17.xyz = r17.xyz * r2.xyz;
r17.xyz = const_FXZoneLightColor[r3.z].xyz * r17.xyz;
r17.xyz = r17.xyz * const_FXZoneLightColor[r3.z].www + r12.xyz;
r18.xyz = const_FXZoneAmbientBottom[r3.z].xyz * r6.zzz;
r19.xyz = const_FXZoneAmbientTop[r3.z].xyz * r0.yyy + -r18.xyz;
r20.xyz = r2.www * r19.xyz + r18.xyz;
r18.xyz = r3.www * r19.xyz + r18.xyz;
r19.xyz = r20.xyz * r10.xyz;
r19.xyz = r19.xyz * r3.xxx;
r20.xyz = r20.xyz * r16.xyz;
r19.xyz = float3(0.25,0.25,0.25) * r19.xyz;
r18.xyz = r18.xyz * r7.xyz + r19.xyz;
r19.xyz = r20.xyz * float3(0.100000001,0.100000001,0.100000001) + r19.xyz;
r19.xyz = r19.xyz + -r18.xyz;
r18.xyz = r7.www * r19.xyz + r18.xyz;
r17.xyz = r18.xyz + r17.xyz;
r17.xyz = r17.xyz * r5.xyz;
r9.xzw = r17.xyz * r10.www + r9.xzw;
}
r3.z = (int)r3.z + 1;
}
r0.y = 1 + r3.y;
r2.xyz = r9.xzw / r0.yyy;
r0.x = r1.z + r0.x;
r0.x = min(1, r0.x);
r0.x = r0.x * r14.x;
r3.xyz = r13.xyz + -r2.xyz;
r2.xyz = r0.xxx * r3.xyz + r2.xyz;
r0.x = max(0, const_globalFogParams5.w);
r0.x = r0.x * 10 + 1;
r3.xyz = const_globalFogParams4.xyz * r0.xxx;
r0.y = 0.150000006 * r1.z;
r0.y = saturate(r0.z * const_globalFogParams5.y + r0.y);
r0.y = 0.800000012 * r0.y;
r0.z = r14.x * 0.5 + 0.5;
r0.y = r0.y * r0.z;
r5.xyz = const_globalFogParams4.xyz * r0.xxx + -r2.xyz;
r0.xyz = r0.yyy * r5.xyz + r2.xyz;
r0.xyz = r4.yyy ? r3.xyz : r0.xyz;
r2.xy = -const_LockOnData.wy + r8.wy;
r2.x = saturate(r2.x);
r1.z = v2.y * 2 + -1;
r1.z = 0.409999996 + -abs(r1.z);
r1.z = saturate(11.7647057 * r1.z);
r2.z = r1.z * -2 + 3;
r1.z = r1.z * r1.z;
r1.z = r2.z * r1.z;
r2.y = saturate(0.0833333358 * r2.y);
r2.y = 1 + -r2.y;
r2.y = rsqrt(r2.y);
r2.y = 1 / r2.y;
r2.x = r2.x * r2.y;
r1.z = r1.z * 0.899999976 + 0.100000001;
r2.yzw = r0.xyz * r1.zzz + -r0.xyz;
r0.xyz = r2.xxx * r2.yzw + r0.xyz;
r0.w = r0.w * 6 + 1;
r0.xyz = r4.xzw * r0.www + r0.xyz;
r2.xyz = const_globalFogParams6.zzz * r13.xyz;
r0.w = r1.x * r1.x;
r0.w = const_globalFogParams6.x * r0.w;
r0.w = saturate(const_globalFogParams6.y * r0.w);
r2.xyz = r2.xyz * float3(20,20,20) + -r0.xyz;
r2.xyz = r0.www * r2.xyz + r0.xyz;
r0.xyz = r1.yyy ? r2.xyz : r0.xyz;
r1.xyz = float3(-0.300000012,-0.800000012,-0.300000012) + r0.xyz;
r1.xyz = saturate(float3(1.21212125,6.66666651,1.21212125) * r1.xyz);
r2.xyz = r1.xyz * float3(-2,-2,-2) + float3(3,3,3);
r1.xyz = r1.xyz * r1.xyz;
r1.xyz = r2.xyz * r1.xyz + float3(-0.00999999978,-0.0500000007,-0.00999999978);
r1.xyz = const_globalFogParams6.www * r1.xyz;
r1.xyz = r1.xyz * float3(2,2,2) + r0.xyz;
r1.xyz = max(float3(0,0,0), r1.xyz);
r2.xy = float2(3179,3179) * v0.xy;
r2.xy = (int2)r2.xy;
r0.w = (int)r14.w;
r0.w = (uint)r0.w << 16;
r2.y = (uint)r2.y << 8;
r0.w = (int)r0.w + (int)r2.y;
r0.w = (int)r0.w + (int)r2.x;
r2.x = (uint)r0.w << 13;
r0.w = (int)r0.w ^ (int)r2.x;
r2.x = (int)r0.w * (int)r0.w;
r2.x = mad((int)r2.x, 0x00003d73, 0x000c0ae5);
r0.w = mad((int)r0.w, (int)r2.x, 0x5208dd0d);
r0.w = (int)r0.w & 0x7fffffff;
r0.w = (int)r0.w;
r2.xyz = float3(1.62981448e-010,6.98491915e-012,1.86264518e-010) * r0.www;
r0.w = r9.y * r9.y;
r2.xyz = r2.xyz * r0.www;
r1.xyz = r2.xyz * float3(0.25,0.25,0.25) + r1.xyz;
r0.xyz = r1.www ? r1.xyz : r0.xyz;
r0.w = cmp(0.5 < const_globalFogParams5.z);
r1.x = cmp(1 >= const_globalFogParams5.z);
r0.w = r0.w ? r1.x : 0;
r1.x = cmp(r8.y < -40);
r0.w = r0.w ? r1.x : 0;
if (r0.w != 0) {
r0.w = cmp(const_ShaderQuality >= 3);
if (r0.w != 0) {
r1.xyz = float3(0.0500000007,-0.100000001,0.0375000015) * const_Time;
r1.xyz = r8.xyz * float3(0.075000003,0.0500000007,0.075000003) + r1.xyz;
r0.w = dot(r1.xyz, float3(0.333333343,0.333333343,0.333333343));
r2.xyz = r1.xyz + r0.www;
r2.xyz = floor(r2.xyz);
r1.xyz = -r2.xyz + r1.xyz;
r0.w = dot(r2.xyz, float3(0.166666672,0.166666672,0.166666672));
r1.xyz = r1.xyz + r0.www;
r3.xyz = cmp(r1.zxy >= r1.xyz);
r4.xyz = r3.yzx ? float3(1,1,1) : 0;
r3.xyz = r3.xyz ? float3(0,0,0) : float3(1,1,1);
r5.xyz = min(r4.xyz, r3.xyz);
r3.xyz = max(r4.yzx, r3.yzx);
r4.xyz = -r5.xyz + r1.xyz;
r4.xyz = float3(0.166666672,0.166666672,0.166666672) + r4.xyz;
r6.xyz = -r3.zxy + r1.xyz;
r6.xyz = float3(0.333333343,0.333333343,0.333333343) + r6.xyz;
r7.xyz = float3(-0.5,-0.5,-0.5) + r1.xyz;
r9.xyz = float3(0.00346020772,0.00346020772,0.00346020772) * r2.xyz;
r9.xyz = floor(r9.xyz);
r2.xyz = -r9.xyz * float3(289,289,289) + r2.xyz;
r9.xw = float2(0,1);
r9.y = r5.z;
r9.z = r3.y;
r9.xyzw = r9.xyzw + r2.zzzz;
r10.xyzw = r9.xyzw * float4(34,34,34,34) + float4(1,1,1,1);
r9.xyzw = r10.xyzw * r9.xyzw;
r10.xyzw = float4(0.00346020772,0.00346020772,0.00346020772,0.00346020772) * r9.xyzw;
r10.xyzw = floor(r10.xyzw);
r9.xyzw = -r10.xyzw * float4(289,289,289,289) + r9.xyzw;
r9.xyzw = r9.xyzw + r2.yyyy;
r10.xw = float2(0,1);
r10.y = r5.y;
r10.z = r3.x;
r9.xyzw = r10.xyzw + r9.xyzw;
r10.xyzw = r9.xyzw * float4(34,34,34,34) + float4(1,1,1,1);
r9.xyzw = r10.xyzw * r9.xyzw;
r10.xyzw = float4(0.00346020772,0.00346020772,0.00346020772,0.00346020772) * r9.xyzw;
r10.xyzw = floor(r10.xyzw);
r9.xyzw = -r10.xyzw * float4(289,289,289,289) + r9.xyzw;
r2.xyzw = r9.xyzw + r2.xxxx;
r3.xw = float2(0,1);
r3.y = r5.x;
r2.xyzw = r3.xyzw + r2.xyzw;
r3.xyzw = r2.xyzw * float4(34,34,34,34) + float4(1,1,1,1);
r2.xyzw = r3.xyzw * r2.xyzw;
r3.xyzw = float4(0.00346020772,0.00346020772,0.00346020772,0.00346020772) * r2.xyzw;
r3.xyzw = floor(r3.xyzw);
r2.xyzw = -r3.xyzw * float4(289,289,289,289) + r2.xyzw;
r3.xyzw = float4(0.0204081628,0.0204081628,0.0204081628,0.0204081628) * r2.xyzw;
r3.xyzw = floor(r3.xyzw);
r2.xyzw = -r3.xyzw * float4(49,49,49,49) + r2.xyzw;
r3.xyzw = float4(0.142857149,0.142857149,0.142857149,0.142857149) * r2.xyzw;
r3.xyzw = floor(r3.xyzw);
r2.xyzw = -r3.xyzw * float4(7,7,7,7) + r2.xyzw;
r3.xyzw = r3.xyzw * float4(0.285714298,0.285714298,0.285714298,0.285714298) + float4(-0.928571403,-0.928571403,-0.928571403,-0.928571403);
r2.xyzw = r2.xzyw * float4(0.285714298,0.285714298,0.285714298,0.285714298) + float4(-0.928571403,-0.928571403,-0.928571403,-0.928571403);
r5.xyzw = float4(1,1,1,1) + -abs(r3.xyzw);
r5.xyzw = r5.xywz + -abs(r2.xzwy);
r9.xz = floor(r3.xy);
r9.yw = floor(r2.xz);
r9.xyzw = r9.xyzw * float4(2,2,2,2) + float4(1,1,1,1);
r10.xz = floor(r3.zw);
r10.yw = floor(r2.yw);
r10.xyzw = r10.xyzw * float4(2,2,2,2) + float4(1,1,1,1);
r11.xyzw = cmp(float4(0,0,0,0) >= r5.xywz);
r11.xyzw = r11.xyzw ? float4(-1,-1,-1,-1) : float4(-0,-0,-0,-0);
r12.xz = r3.xy;
r12.yw = r2.xz;
r9.xyzw = r9.zwxy * r11.yyxx + r12.zwxy;
r2.xz = r3.zw;
r2.xyzw = r10.xyzw * r11.zzww + r2.xyzw;
r3.xy = r9.zw;
r3.z = r5.x;
r10.x = dot(r3.xyz, r3.xyz);
r9.z = r5.y;
r10.y = dot(r9.xyz, r9.xyz);
r11.xy = r2.xy;
r11.z = r5.w;
r10.z = dot(r11.xyz, r11.xyz);
r5.xy = r2.zw;
r10.w = dot(r5.xyz, r5.xyz);
r2.xyzw = -r10.xyzw * float4(0.853734732,0.853734732,0.853734732,0.853734732) + float4(1.79284286,1.79284286,1.79284286,1.79284286);
r3.xyz = r3.xyz * r2.xxx;
r9.xyz = r9.xyz * r2.yyy;
r2.xyz = r11.xyz * r2.zzz;
r5.xyz = r5.xyz * r2.www;
r10.x = dot(r1.xyz, r1.xyz);
r10.y = dot(r4.xyz, r4.xyz);
r10.z = dot(r6.xyz, r6.xyz);
r10.w = dot(r7.xyz, r7.xyz);
r10.xyzw = float4(0.600000024,0.600000024,0.600000024,0.600000024) + -r10.xyzw;
r10.xyzw = max(float4(0,0,0,0), r10.xyzw);
r10.xyzw = r10.xyzw * r10.xyzw;
r10.xyzw = r10.xyzw * r10.xyzw;
r1.x = dot(r3.xyz, r1.xyz);
r1.y = dot(r9.xyz, r4.xyz);
r1.z = dot(r2.xyz, r6.xyz);
r1.w = dot(r5.xyz, r7.xyz);
r0.w = dot(r10.xyzw, r1.xyzw);
r1.xyzw = float4(40,94,64,48.5) + r8.yxyz;
r0.w = r0.w * 21 + 0.5;
r0.w = r0.w * 40 + 12.5;
r0.w = saturate(-r1.x / r0.w);
r1.xyz = float3(0.0135135138,0.015625,0.0357142873) * abs(r1.yzw);
r1.xyz = r1.xyz * r1.xyz;
r1.x = dot(r1.xyz, r1.xyz);
r1.x = sqrt(r1.x);
r0.w = r0.w * r0.w;
r1.x = min(1, r1.x);
r0.w = r1.x * r0.w;
r1.xyz = const_globalFogParams4.xyz * float3(3,3,3) + -r0.xyz;
r0.xyz = r0.www * r1.xyz + r0.xyz;
} else {
r0.w = 40 + r8.y;
r0.w = saturate(-0.0444444455 * r0.w);
r0.w = r0.w * r0.w;
r1.xyz = const_globalFogParams4.xyz * float3(3,3,3) + -r0.xyz;
r0.xyz = r0.www * r1.xyz + r0.xyz;
}
}
o0.xyz = r0.xyz;
o0.w = 0;
return;
}

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#9
Posted 10/07/2017 08:37 AM   
Here's some screenshots. Notice how in the first picture the shadows for the robot that's sitting down look fine. But in the second picture as i move away from him, they start to get messed up the further he is from the center of the screen. [url=http://www.iforce.co.nz/View.aspx?i=vu0vxisy.c4s.jpg][img]http://iforce.co.nz/i/vu0vxisy.c4s.jpg[/img][/url] [url=http://www.iforce.co.nz/View.aspx?i=hqwwhzpg.12c.jpg][img]http://iforce.co.nz/i/hqwwhzpg.12c.jpg[/img][/url] [url=http://www.iforce.co.nz/View.aspx?i=5c0l54b0.kzy.jpg][img]http://iforce.co.nz/i/5c0l54b0.kzy.jpg[/img][/url]
Here's some screenshots. Notice how in the first picture the shadows for the robot that's sitting down look fine. But in the second picture as i move away from him, they start to get messed up the further he is from the center of the screen.
Image
Image
Image

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#10
Posted 10/07/2017 08:50 AM   
@sgsrules Almost sure the r5.z value don't have the depth...only a fixed value. In the comments you put that the depth was "throwing off"...is a possibility. That code should fix the shadows if the depth was there.....Maybe grab the depth from another register or TEXTCOORD (vX)...
@sgsrules
Almost sure the r5.z value don't have the depth...only a fixed value.

In the comments you put that the depth was "throwing off"...is a possibility. That code should fix the shadows if the depth was there.....Maybe grab the depth from another register or TEXTCOORD (vX)...

MY WEB

Helix Mod - Making 3D Better

My 3D Screenshot Gallery

Like my fixes? you can donate to Paypal: dhr.donation@gmail.com

#11
Posted 10/07/2017 07:27 PM   
[quote="DHR"]@sgsrules Almost sure the r5.z value don't have the depth...only a fixed value. [/quote] what do you mean by fixed value? I'm pretty sure it has the depth value (or at least the z position in view space) because it is fixing the shadows. They work for the most part but stuff closer to the edges of the screen have errors. [quote="DHR"] In the comments you put that the depth was "throwing off"...is a possibility. That code should fix the shadows if the depth was there.....Maybe grab the depth from another register or TEXTCOORD (vX)... [/quote] The inputs v0,v1, v2 seem to just be texture coordinates of some sort and are not actual 3d vertex data. Is there a way to figure out which vertex shader is paired with this pixel shader? If i could take a look at the vertex shader i could confirm what the inputs actually are. But just from looking at the code I'm pretty sure they're not positional data. It looks like the position is being reconstructed from depth: I'm making a ton of assumptions so please correct me if i'm wrong. [code] r0.xy = (int2)v0.xy; // screen tex coords? r0.zw = float2(0,0); r1.xyzw = DepthMap.Load(r0.xyw).xyzw; // Loads depth in r1 r1.y = dot(v1.xyz, v1.xyz); // magnitude of v1 squared r1.y = rsqrt(r1.y); // reciprocal of the above line r1.yzw = v1.xyz * r1.yyy; // normalizes directional vector r2.xyz = r1.yzw * r1.xxx; // multiply normalized depth stored in r1.x by direction vector. r2.xyz = float3(250,250,250) * r2.xyz; // multiply normalized depth by far clip 250. r2.w = dot(r2.xyz, r2.xyz); r2.w = rsqrt(r2.w); r3.xyz = r2.xyz * r2.www; // normalizes vector r4.xy = cmp(float2(2,0.999989986) < r1.xx); // comparison to check which far clip value to use r1.yzw = float3(500,500,500) * r1.yzw; // multiply normalized depth by far clip 500. r5.xyz = r4.xxx ? r1.yzw : r2.xyz; // I'm assuming r5 is reconstructed position from depth. // r5 is set to either use r1.yzw (contains xyz position in view space) or r2.xyz depending on r4.x [/code] My guess is that the depth value is not being scaled or normalized correctly when it's multiplied by the projection matrix. The values are correct in the center but the perspective introduces errors as it moves towards the edges.
DHR said:@sgsrules
Almost sure the r5.z value don't have the depth...only a fixed value.

what do you mean by fixed value?

I'm pretty sure it has the depth value (or at least the z position in view space) because it is fixing the shadows. They work for the most part but stuff closer to the edges of the screen have errors.
DHR said:
In the comments you put that the depth was "throwing off"...is a possibility. That code should fix the shadows if the depth was there.....Maybe grab the depth from another register or TEXTCOORD (vX)...

The inputs v0,v1, v2 seem to just be texture coordinates of some sort and are not actual 3d vertex data.

Is there a way to figure out which vertex shader is paired with this pixel shader? If i could take a look at the vertex shader i could confirm what the inputs actually are. But just from looking at the code I'm pretty sure they're not positional data.

It looks like the position is being reconstructed from depth:

I'm making a ton of assumptions so please correct me if i'm wrong.
r0.xy = (int2)v0.xy; // screen tex coords?
r0.zw = float2(0,0);
r1.xyzw = DepthMap.Load(r0.xyw).xyzw; // Loads depth in r1
r1.y = dot(v1.xyz, v1.xyz); // magnitude of v1 squared
r1.y = rsqrt(r1.y); // reciprocal of the above line
r1.yzw = v1.xyz * r1.yyy; // normalizes directional vector
r2.xyz = r1.yzw * r1.xxx; // multiply normalized depth stored in r1.x by direction vector.
r2.xyz = float3(250,250,250) * r2.xyz; // multiply normalized depth by far clip 250.
r2.w = dot(r2.xyz, r2.xyz);
r2.w = rsqrt(r2.w);
r3.xyz = r2.xyz * r2.www; // normalizes vector
r4.xy = cmp(float2(2,0.999989986) < r1.xx); // comparison to check which far clip value to use
r1.yzw = float3(500,500,500) * r1.yzw; // multiply normalized depth by far clip 500.
r5.xyz = r4.xxx ? r1.yzw : r2.xyz; // I'm assuming r5 is reconstructed position from depth.
// r5 is set to either use r1.yzw (contains xyz position in view space) or r2.xyz depending on r4.x


My guess is that the depth value is not being scaled or normalized correctly when it's multiplied by the projection matrix. The values are correct in the center but the perspective introduces errors as it moves towards the edges.

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#12
Posted 10/07/2017 08:38 PM   
Sorry for the delay in the responde... I mean that the shadows have the same separation, same distance if you compare left/right eyes, that's why you have a working shadows in the middle...but broken in upper and lower part of the screen. In the upper part the separation of the shadows need to be closer (far) and the lower part more separate (Near). In the constant buffer you have "const_NearClip"....maybe normalyze with that (multiply). You can see the VS related searching for the shaders #hash in the "shaderusage.txt" file...located in the same folder than dll files.
Sorry for the delay in the responde...

I mean that the shadows have the same separation, same distance if you compare left/right eyes, that's why you have a working shadows in the middle...but broken in upper and lower part of the screen. In the upper part the separation of the shadows need to be closer (far) and the lower part more separate (Near).

In the constant buffer you have "const_NearClip"....maybe normalyze with that (multiply).


You can see the VS related searching for the shaders #hash in the "shaderusage.txt" file...located in the same folder than dll files.

MY WEB

Helix Mod - Making 3D Better

My 3D Screenshot Gallery

Like my fixes? you can donate to Paypal: dhr.donation@gmail.com

#13
Posted 10/08/2017 10:37 AM   
[quote="DHR"]Sorry for the delay in the responde...[/quote]No problem, thanks for responding. [quote="DHR"]I mean that the shadows have the same separation, same distance if you compare left/right eyes, that's why you have a working shadows in the middle...but broken in upper and lower part of the screen. In the upper part the separation of the shadows need to be closer (far) and the lower part more separate (Near).[/quote]The shadows, without the fix are at screen depth but with my fix they actually have correct separation and are different for each eye. If i increase/decrease the convergence they will project properly on the ground at teh right depth... but only in the center of the screen, errors are introduced towards the edges. I can see how you might think that the shadows were at a fixed depth from my screenshots since i have the convergence set so that the main character is at screen depth.[/quote][quote="DHR"]In the constant buffer you have "const_NearClip"....maybe normalyze with that (multiply). You can see the VS related searching for the shaders #hash in the "shaderusage.txt" file...located in the same folder than dll files.[/quote]Great, I'll give it a look. Thanks again for the help!
DHR said:Sorry for the delay in the responde...
No problem, thanks for responding.
DHR said:I mean that the shadows have the same separation, same distance if you compare left/right eyes, that's why you have a working shadows in the middle...but broken in upper and lower part of the screen. In the upper part the separation of the shadows need to be closer (far) and the lower part more separate (Near).
The shadows, without the fix are at screen depth but with my fix they actually have correct separation and are different for each eye. If i increase/decrease the convergence they will project properly on the ground at teh right depth... but only in the center of the screen, errors are introduced towards the edges. I can see how you might think that the shadows were at a fixed depth from my screenshots since i have the convergence set so that the main character is at screen depth.
DHR said:In the constant buffer you have "const_NearClip"....maybe normalyze with that (multiply).

You can see the VS related searching for the shaders #hash in the "shaderusage.txt" file...located in the same folder than dll files.
Great, I'll give it a look. Thanks again for the help!

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#14
Posted 10/09/2017 08:07 PM   
Apparently I had used the shaderusage.txt file before but completely forgot about it, damn my shitty memory. Anyhow I took a look at the matching vertex shader:[code] void main( float4 v0 : POSITION0, out float4 o0 : SV_POSITION0, out float4 o1 : TEXCOORD0, out float3 o2 : TEXCOORD2) { float4 r0,r1; uint4 bitmask, uiDest; float4 fDest; o0.xyzw = v0.xyzw; r0.xyz = v0.xyz; r0.w = 1; r1.x = dot(constMat_inverseProjMainCam._m00_m01_m02_m03, r0.xyzw); r1.y = dot(constMat_inverseProjMainCam._m10_m11_m12_m13, r0.xyzw); r1.z = dot(constMat_inverseProjMainCam._m20_m21_m22_m23, r0.xyzw); o1.w = dot(constMat_inverseProjMainCam._m30_m31_m32_m33, r0.xyzw); o1.xyz = r1.xyz; o2.xyz = r1.xyz * float3(0.5,0.5,0.5) + float3(0.5,0.5,0.5); return; } [/code]As you can see it's pretty simple. I'm 99% sure that it's simply drawing a fullscreen quad. It basically just outputs: o0 (v0 in PS): vertex coords used as uv coords in ps shader. o1 (v1 in PS): transformed by inverse projection matrix, gives you the view frustum corners in view space. This is used as a directional vector to reconstruct the position using the depth buffer in view space. o2 (v2 in PS): ok this one is a bit confusing, it's the o1 view space vector but it's being transformed by *.5+.5 which is ussually used to convert from the -1 to 1 range to 0 to 1 range. Oddly enough the only time it's used in the PS is [code] r1.z = v2.y * 2 + -1;[/code] which converts it back from 0 to 1 to -1 to 1. For now i'll just attribute this to the developers sloppy shader code lol. I'm pretty sure that somewhere in the PS the depth values are being fiddled with to offset the shadows or do something funky, there seem to be a lot of magic numbers in the shader. This is what's probably throwing off the correction at the corners of the screen.
Apparently I had used the shaderusage.txt file before but completely forgot about it, damn my shitty memory. Anyhow I took a look at the matching vertex shader:
void main( 
float4 v0 : POSITION0,
out float4 o0 : SV_POSITION0,
out float4 o1 : TEXCOORD0,
out float3 o2 : TEXCOORD2)
{
float4 r0,r1;
uint4 bitmask, uiDest;
float4 fDest;

o0.xyzw = v0.xyzw;
r0.xyz = v0.xyz;
r0.w = 1;
r1.x = dot(constMat_inverseProjMainCam._m00_m01_m02_m03, r0.xyzw);
r1.y = dot(constMat_inverseProjMainCam._m10_m11_m12_m13, r0.xyzw);
r1.z = dot(constMat_inverseProjMainCam._m20_m21_m22_m23, r0.xyzw);
o1.w = dot(constMat_inverseProjMainCam._m30_m31_m32_m33, r0.xyzw);
o1.xyz = r1.xyz;
o2.xyz = r1.xyz * float3(0.5,0.5,0.5) + float3(0.5,0.5,0.5);
return;
}
As you can see it's pretty simple. I'm 99% sure that it's simply drawing a fullscreen quad. It basically just outputs:

o0 (v0 in PS): vertex coords used as uv coords in ps shader.

o1 (v1 in PS): transformed by inverse projection matrix, gives you the view frustum corners in view space. This is used as a directional vector to reconstruct the position using the depth buffer in view space.

o2 (v2 in PS): ok this one is a bit confusing, it's the o1 view space vector but it's being transformed by *.5+.5 which is ussually used to convert from the -1 to 1 range to 0 to 1 range. Oddly enough the only time it's used in the PS is
r1.z = v2.y * 2 + -1;
which converts it back from 0 to 1 to -1 to 1. For now i'll just attribute this to the developers sloppy shader code lol.

I'm pretty sure that somewhere in the PS the depth values are being fiddled with to offset the shadows or do something funky, there seem to be a lot of magic numbers in the shader. This is what's probably throwing off the correction at the corners of the screen.

Like my work? You can send a donation via Paypal to sgs.rules@gmail.com

Windows 7 Pro 64x - Nvidia Driver 398.82 - EVGA 980Ti SC - Optoma HD26 with Edid override - 3D Vision 2 - i7-8700K CPU at 5.0Ghz - ASROCK Z370 Ext 4 Motherboard - 32 GB RAM Corsair Vengeance - 512 GB Samsung SSD 850 Pro - Creative Sound Blaster Z

#15
Posted 10/09/2017 09:31 PM   
  1 / 2    
Scroll To Top