aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRay <raysan5@gmail.com>2016-07-08 00:57:27 +0200
committerRay <raysan5@gmail.com>2016-07-08 00:57:27 +0200
commit3922bc27cda94e4d174f079ea04f0eeca8b364ab (patch)
treeda806a9ee1d6413126c9307d6b7f5e6ac1c2b917 /src
parent7cefbd8a947551f6c63dba88117099d6c0f4998b (diff)
downloadraylib-3922bc27cda94e4d174f079ea04f0eeca8b364ab.tar.gz
raylib-3922bc27cda94e4d174f079ea04f0eeca8b364ab.zip
Supporting multiple HMD configurations
-IN PROGRESS-
Diffstat (limited to 'src')
-rw-r--r--src/rlgl.c97
1 files changed, 94 insertions, 3 deletions
diff --git a/src/rlgl.c b/src/rlgl.c
index aa729824..25a6745c 100644
--- a/src/rlgl.c
+++ b/src/rlgl.c
@@ -188,6 +188,20 @@ typedef struct {
//Guint fboId;
} DrawCall;
+// Head-Mounted-Display device parameters
+typedef struct {
+ int hResolution; // HMD horizontal resolution in pixels
+ int vResolution; // HMD vertical resolution in pixels
+ float hScreenSize; // HMD horizontal size in meters
+ float vScreenSize; // HMD vertical size in meters
+ float vScreenCenter; // HMD screen center in meters
+ float eyeToScreenDistance; // HMD distance between eye and display in meters
+ float lensSeparationDistance; // HMD lens separation distance in meters
+ float interpupillaryDistance; // HMD IPD (distance between pupils) in meters
+ float distortionK[4]; // HMD lens distortion constant parameters
+ float chromaAbCorrection[4]; // HMD chromatic aberration correction parameters
+} VrDeviceInfo;
+
#if defined(RLGL_OCULUS_SUPPORT)
typedef struct OculusBuffer {
ovrTextureSwapChain textureChain;
@@ -324,6 +338,9 @@ static void UnloadDefaultBuffers(void); // Unload default internal buffers v
// Set internal projection and modelview matrix depending on eyes tracking data
static void SetStereoView(int eye, Matrix matProjection, Matrix matModelView);
+// Configure stereo rendering (including distortion shader) with HMD device parameters
+static void SetupVrDevice(VrDeviceInfo hmd);
+
static void SetShaderLights(Shader shader); // Sets shader uniform values for lights array
static char *ReadTextFile(const char *fileName);
@@ -2535,7 +2552,7 @@ void InitVrDevice(int hmdDevice)
else
{
hmdDesc = ovr_GetHmdDesc(session);
-
+
TraceLog(INFO, "OVR: Product Name: %s", hmdDesc.ProductName);
TraceLog(INFO, "OVR: Manufacturer: %s", hmdDesc.Manufacturer);
TraceLog(INFO, "OVR: Product ID: %i", hmdDesc.ProductId);
@@ -2685,10 +2702,10 @@ static void SetStereoView(int eye, Matrix matProjection, Matrix matModelView)
static float IPD = 0.064f; // InterpupillaryDistance
float HScreenSize = 0.14976f;
- float VScreenSize = 0.0936f; // HScreenSize/(1280.0f/800.0f) (DK2)
+ float VScreenSize = 0.09356f; // HScreenSize/(1280.0f/800.0f) (DK2)
float VScreenCenter = 0.04675f; // VScreenSize/2
float EyeToScreenDistance = 0.041f;
- float LensSeparationDistance = 0.064f; //0.0635f (DK1)
+ float LensSeparationDistance = 0.0635f; //0.0635f (DK2)
// NOTE: fovy value obtained from device parameters (Oculus Rift CV1)
float halfScreenDistance = VScreenSize/2.0f;
@@ -3870,7 +3887,81 @@ static Color *GenNextMipmap(Color *srcData, int srcWidth, int srcHeight)
}
#endif
+// Configure stereo rendering (including distortion shader) with HMD device parameters
+static void SetupVrDevice(VrDeviceInfo hmd)
+{
+ // Compute aspect ratio and FOV
+ float aspect = ((float)hmd.hResolution/2.0f)/(float)hmd.vResolution;
+
+ // Fov-y is normally computed with: 2*atan2(hmd.vScreenSize, 2*hmd.eyeToScreenDistance)*RAD2DEG
+ // ...but with lens distortion it is increased (see Oculus SDK Documentation)
+ float radius = -1.0 - (4*(hmd.hScreenSize/4 - hmd.lensSeparationDistance/2)/hmd.hScreenSize);
+ float distScale = (hmd.distortionK[0] + hmd.distortionK[1]*pow(radius, 2) + hmd.distortionK[2]*pow(radius, 4) + hmd.distortionK[3]*pow(radius, 6));
+ float fovy = 2*atan2(hmd.vScreenSize*distScale, 2*hmd.eyeToScreenDistance)*RAD2DEG;
+
+ // Compute camera projection matrices
+ Matrix proj = MatrixPerspective(fovy, aspect, 0.1, 10000);
+ float projOffset = 4*(hmd.hScreenSize/4 - hmd.interpupillaryDistance/2)/hmd.hScreenSize;
+
+ //Matrix projLeft = MatrixMultiply(MatrixTranslation(projOffset, 0.0, 0.0), proj);
+ //matrix projRight = MatrixMultiply(MatrixTranslation(-projOffset, 0.0, 0.0)), proj);
+
+ // Compute camera transformation matrices
+ //Matrix viewTransformLeft = MatrixTranslation(-hmd.interpupillaryDistance/2, 0.0, 0.0 );
+ //Matrix viewTransformRight = MatrixTranslation(hmd.interpupillaryDistance/2, 0.0, 0.0 );
+
+ // Compute eyes Viewports
+ // Rectangle viewportLeft = { 0, 0, hmd.hResolution/2, hmd.vResolution };
+ // Rectangle viewportRight = { hmd.hResolution/2, 0, hmd.hResolution/2, hmd.vResolution };
+
+ // Distortion shader parameters
+ float lensShift = 4*(hmd.hScreenSize/4 - hmd.lensSeparationDistance/2)/hmd.hScreenSize;
+ float leftLensCenter[2] = { lensShift, 0.0f };
+ float rightLensCenter[2] = { -lensShift, 0.0f };
+ float leftScreenCenter[2] = { 0.25f, 0.5f };
+ float rightScreenCenter[2] = { 0.75f, 0.5f };
+
+ float scaleIn[2] = { 1.0f, 1.0f/aspect };
+ float scale[2] = { 1.0f/distScale, 1.0f*aspect/distScale };
+
+ // Distortion shader parameters update
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "leftLensCenter"), leftLensCenter, 2);
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "rightLensCenter"), rightLensCenter, 2);
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "leftScreenCenter"), leftScreenCenter, 2);
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "rightScreenCenter"), rightScreenCenter, 2);
+
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "scale"), scale, 2);
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "scaleIn"), scaleIn, 2);
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "hmdWarpParam"), hmd.distortionK, 4);
+ SetShaderValue(distortionShader, GetShaderLocation(distortionShader, "chromaAbParam"), hmd.chromaAbCorrection, 4);
+}
+
#if defined(RLGL_OCULUS_SUPPORT)
+static void InitOculusDevice(void)
+{
+
+}
+
+static void CloseOculusDevice(void)
+{
+
+}
+
+static void UpdateOculusTracking(void)
+{
+
+}
+
+static void BeginOculusDrawing(void)
+{
+
+}
+
+static void EndOculusDrawing(void)
+{
+
+}
+
// Load Oculus required buffers: texture-swap-chain, fbo, texture-depth
static OculusBuffer LoadOculusBuffer(ovrSession session, int width, int height)
{