From 4207f9c279e832e3afcb3f5fc6cd8d84cb4cfe4c Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sat, 28 Mar 2015 01:43:35 +0100
Subject: Bump OculusVR RIFT SDK to 0.5.0.1

---
 .../D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh  | 70 +++++++++++++++++-----
 1 file changed, 54 insertions(+), 16 deletions(-)

(limited to 'LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh')

diff --git a/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh b/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh
index 7e5512b..1f62785 100644
--- a/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh
+++ b/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh
@@ -1,8 +1,8 @@
 /************************************************************************************
 
-Filename    :   DistortionTimewarpChroma_vs.vsh
+Filename     :    DistortionPositionTimewarpChroma_vs.vsh
 
-Copyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.
+Copyright    :    Copyright 2014 Oculus VR, LLC All Rights reserved.
 
 Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); 
 you may not use the Oculus VR Rift SDK except in compliance with the License, 
@@ -21,46 +21,84 @@ limitations under the License.
 
 ************************************************************************************/
 
+Texture2DMS<float,1>  DepthTexture1x : register(t0);
+Texture2DMS<float,2>  DepthTexture2x : register(t1);
+Texture2DMS<float,4>  DepthTexture4x : register(t2);
+
+float depthMsaaSamples = -1.0;   // -1 means it's disabled
+
 float2 EyeToSourceUVScale;
 float2 EyeToSourceUVOffset;
 float4x4 EyeRotationStart;
 float4x4 EyeRotationEnd;
 
+// DepthProjector values can also be calculated as:
+// float DepthProjectorX = FarClip / (FarClip - NearClip);
+// float DepthProjectorY = (-FarClip * NearClip) / (FarClip - NearClip);
+float2 DepthProjector;
+float2 DepthDimSize;
+
+float4 PositionFromDepth(float2 inTexCoord)
+{
+    float2 eyeToSourceTexCoord = inTexCoord * EyeToSourceUVScale + EyeToSourceUVOffset;
+    float linearDepth = 1.0;
+
+    if(depthMsaaSamples > 0.0)
+    {
+        float depth;
+        if(depthMsaaSamples <= 1.5)
+            depth = DepthTexture1x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x;
+        else if(depthMsaaSamples <= 2.5)
+            depth = DepthTexture2x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x;
+        else
+            depth = DepthTexture4x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x;
+        
+        linearDepth = DepthProjector.y / (depth - DepthProjector.x);
+    }
+
+    float4 retVal = float4(inTexCoord, 1, 1);
+    retVal.xyz *= linearDepth;
+    return retVal;
+}
+
 float2 TimewarpTexCoordToWarpedPos(float2 inTexCoord, float4x4 rotMat)
 {
 	// Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
 	// These are now "real world" vectors in direction (x,y,1) relative to the eye of the HMD.	
 	// Apply the 3x3 timewarp rotation to these vectors.
-	float3 transformed = float3( mul ( rotMat, float4(inTexCoord.xy, 1, 1) ).xyz);
+    float4 inputPos = PositionFromDepth(inTexCoord);
+	float3 transformed = float3( mul ( rotMat, inputPos ).xyz);
+
 	// Project them back onto the Z=1 plane of the rendered images.
 	float2 flattened = transformed.xy / transformed.z;
+
 	// Scale them into ([0,0.5],[0,1]) or ([0.5,0],[0,1]) UV lookup space (depending on eye)
 	return flattened * EyeToSourceUVScale + EyeToSourceUVOffset;
 }
 
-void main(in float2 Position    : POSITION,
-          in float4 Color       : COLOR0,
-          in float2 TexCoord0   : TEXCOORD0,
-          in float2 TexCoord1   : TEXCOORD1,
-          in float2 TexCoord2   : TEXCOORD2,
-          out float4 oPosition  : SV_Position,
-          out float1 oColor     : COLOR,
-          out float2 oTexCoord0 : TEXCOORD0,
-          out float2 oTexCoord1 : TEXCOORD1,
-          out float2 oTexCoord2 : TEXCOORD2)
+void main(  in float2 Position      : POSITION,
+            in float4 Color         : COLOR0,
+            in float2 TexCoord0     : TEXCOORD0,
+            in float2 TexCoord1     : TEXCOORD1,
+            in float2 TexCoord2     : TEXCOORD2,
+            out float4 oPosition    : SV_Position,
+            out float1 oColor       : COLOR,
+            out float2 oTexCoord0   : TEXCOORD0,
+            out float2 oTexCoord1   : TEXCOORD1,
+            out float2 oTexCoord2   : TEXCOORD2)
 {
     oPosition.x = Position.x;
     oPosition.y = Position.y;
     oPosition.z = 0.5;
     oPosition.w = 1.0;
-     	    
+      	     
     float timewarpLerpFactor = Color.a;
     float4x4 lerpedEyeRot = lerp(EyeRotationStart, EyeRotationEnd, timewarpLerpFactor);
 
     // warped positions are a bit more involved, hence a separate function
-	oTexCoord0 = TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot);
+    oTexCoord0 = TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot);
 	oTexCoord1 = TimewarpTexCoordToWarpedPos(TexCoord1, lerpedEyeRot);
 	oTexCoord2 = TimewarpTexCoordToWarpedPos(TexCoord2, lerpedEyeRot);
 
-    oColor = Color.r;              // Used for vignette fade.
+     oColor = Color.r;                  // Used for vignette fade.
 }
-- 
cgit v1.2.3