@ -2570,38 +2570,62 @@ void InitVrDevice(int hmdDevice)
if ( ! vrDeviceReady )
{
TraceLog ( WARNING , " VR Device not found: Initializing VR Simulator (Oculus Rift DK2 ) " ) ;
TraceLog ( WARNING , " VR Device not found: Initializing VR Simulator (Oculus Rift CV1 ) " ) ;
if ( hmdDevice = = HMD_OCULUS_RIFT_DK2 )
{
/ / Oculus Rift DK2 parameters
hmd . hResolution = 1280 ; / / HMD horizontal resolution in pixels
hmd . vResolution = 800 ; / / HMD vertical resolution in pixels
hmd . hScreenSize = 0.14976f ; / / HMD horizontal size in meters
hmd . vScreenSize = 0.09356f ; / / HMD vertical size in meters
hmd . vScreenCenter = 0.04678f ; / / HMD screen center in meters
hmd . eyeToScreenDistance = 0.041f ; / / HMD distance between eye and display in meters
hmd . lensSeparationDistance = 0.0635f ; / / HMD lens separation distance in meters
hmd . interpupillaryDistance = 0.064f ; / / HMD IPD ( distance between pupils ) in meters
hmd . distortionK [ 0 ] = 1.0f ; / / HMD lens distortion constant parameter 0
hmd . distortionK [ 1 ] = 0.22f ; / / HMD lens distortion constant parameter 1
hmd . distortionK [ 2 ] = 0.24f ; / / HMD lens distortion constant parameter 2
hmd . distortionK [ 3 ] = 0.0f ; / / HMD lens distortion constant parameter 3
hmd . chromaAbCorrection [ 0 ] = 0.996f ; / / HMD chromatic aberration correction parameter 0
hmd . chromaAbCorrection [ 1 ] = - 0.004f ; / / HMD chromatic aberration correction parameter 1
hmd . chromaAbCorrection [ 2 ] = 1.014f ; / / HMD chromatic aberration correction parameter 2
hmd . chromaAbCorrection [ 3 ] = 0.0f ; / / HMD chromatic aberration correction parameter 3
}
else if ( ( hmdDevice = = HMD_DEFAULT_DEVICE ) | | ( hmdDevice = = HMD_OCULUS_RIFT_CV1 ) )
{
/ / Oculus Rift CV1 parameters
/ / NOTE : CV1 represents a complete HMD redesign compared to previous versions ,
/ / new Fresnel - hybrid - asymmetric lenses have been added and , consequently ,
/ / previous parameters ( DK2 ) and distortion shader ( DK2 ) doesn ' t work any more .
/ / I just defined a set of parameters for simulator that approximate to CV1 stereo rendering
/ / but result is not the same obtained with Oculus PC SDK .
hmd . hResolution = 2160 ; / / HMD horizontal resolution in pixels
hmd . vResolution = 1200 ; / / HMD vertical resolution in pixels
hmd . hScreenSize = 0.133793f ; / / HMD horizontal size in meters
hmd . vScreenSize = 0.0669 ; / / HMD vertical size in meters
hmd . vScreenCenter = 0.04678f ; / / HMD screen center in meters
hmd . eyeToScreenDistance = 0.041f ; / / HMD distance between eye and display in meters
hmd . lensSeparationDistance = 0.07f ; / / HMD lens separation distance in meters
hmd . interpupillaryDistance = 0.07f ; / / HMD IPD ( distance between pupils ) in meters
hmd . distortionK [ 0 ] = 1.0f ; / / HMD lens distortion constant parameter 0
hmd . distortionK [ 1 ] = 0.22f ; / / HMD lens distortion constant parameter 1
hmd . distortionK [ 2 ] = 0.24f ; / / HMD lens distortion constant parameter 2
hmd . distortionK [ 3 ] = 0.0f ; / / HMD lens distortion constant parameter 3
hmd . chromaAbCorrection [ 0 ] = 0.996f ; / / HMD chromatic aberration correction parameter 0
hmd . chromaAbCorrection [ 1 ] = - 0.004f ; / / HMD chromatic aberration correction parameter 1
hmd . chromaAbCorrection [ 2 ] = 1.014f ; / / HMD chromatic aberration correction parameter 2
hmd . chromaAbCorrection [ 3 ] = 0.0f ; / / HMD chromatic aberration correction parameter 3
}
/ / Initialize framebuffer and textures for stereo rendering
/ / NOTE : screen size should match HMD aspect ratio
vrConfig . stereoFbo = rlglLoadRenderTexture ( screenWidth , screenHeight ) ;
/ / Load distortion shader ( initialized by default with Oculus Rift CV1 parameters )
vrConfig . distortionShader . id = LoadShaderProgram ( vDistortionShaderStr , fDistortionShaderStr ) ;
if ( vrConfig . distortionShader . id ! = 0 ) LoadDefaultShaderLocations ( & vrConfig . distortionShader ) ;
if ( ( hmdDevice = = HMD_DEFAULT_DEVICE ) | |
( hmdDevice = = HMD_OCULUS_RIFT_DK2 ) | |
( hmdDevice = = HMD_OCULUS_RIFT_CV1 ) )
{
/ / NOTE : Oculus Rift DK2 parameters
hmd . hResolution = 1280 ; / / HMD horizontal resolution in pixels
hmd . vResolution = 800 ; / / HMD vertical resolution in pixels
hmd . hScreenSize = 0.14976f ; ; / / HMD horizontal size in meters
hmd . vScreenSize = 0.09356f ; / / HMD vertical size in meters
hmd . vScreenCenter = 0.04675f ; / / HMD screen center in meters
hmd . eyeToScreenDistance = 0.041f ; / / HMD distance between eye and display in meters
hmd . lensSeparationDistance = 0.0635f ; / / HMD lens separation distance in meters
hmd . interpupillaryDistance = 0.064f ; / / HMD IPD ( distance between pupils ) in meters
hmd . distortionK [ 0 ] = 1.0f ; / / HMD lens distortion constant parameter 0
hmd . distortionK [ 1 ] = 0.22f ; / / HMD lens distortion constant parameter 1
hmd . distortionK [ 2 ] = 0.24f ; / / HMD lens distortion constant parameter 2
hmd . distortionK [ 3 ] = 0.0f ; / / HMD lens distortion constant parameter 3
hmd . chromaAbCorrection [ 0 ] = 0.996f ; / / HMD chromatic aberration correction parameter 0
hmd . chromaAbCorrection [ 1 ] = - 0.004f ; / / HMD chromatic aberration correction parameter 1
hmd . chromaAbCorrection [ 2 ] = 1.014f ; / / HMD chromatic aberration correction parameter 2
hmd . chromaAbCorrection [ 3 ] = 0.0f ; / / HMD chromatic aberration correction parameter 3
}
SetStereoConfig ( hmd ) ;
vrSimulator = true ;
@ -3761,9 +3785,8 @@ static Color *GenNextMipmap(Color *srcData, int srcWidth, int srcHeight)
static void SetStereoConfig ( VrDeviceInfo hmd )
{
/ / Compute aspect ratio
/ / float aspect = ( ( float ) hmd . hResolution * 0.5f ) / ( float ) hmd . vResolution ;
float aspect = ( float ) screenWidth * 0.5f / ( float ) screenHeight ;
float aspect = ( ( float ) hmd . hResolution * 0.5f ) / ( float ) hmd . vResolution ;
/ / Compute lens parameters
float lensShift = ( hmd . hScreenSize * 0.25f - hmd . lensSeparationDistance * 0.5f ) / hmd . hScreenSize ;
float leftLensCenter [ 2 ] = { 0.25 + lensShift , 0.5f } ;
@ -3779,12 +3802,19 @@ static void SetStereoConfig(VrDeviceInfo hmd)
hmd . distortionK [ 1 ] * lensRadiusSq +
hmd . distortionK [ 2 ] * lensRadiusSq * lensRadiusSq +
hmd . distortionK [ 3 ] * lensRadiusSq * lensRadiusSq * lensRadiusSq ;
TraceLog ( DEBUG , " VR: Distortion Scale: %f " , distortionScale ) ;
float normScreenWidth = 0.5f ;
float normScreenHeight = 1.0f ;
float scaleIn [ 2 ] = { 2 / normScreenWidth , 2 / normScreenHeight / aspect } ;
float scale [ 2 ] = { normScreenWidth * 0.5 / distortionScale , normScreenHeight * 0.5 * aspect / distortionScale } ;
TraceLog ( DEBUG , " VR: Distortion Shader: LeftLensCenter = { %f, %f } " , leftLensCenter [ 0 ] , leftLensCenter [ 1 ] ) ;
TraceLog ( DEBUG , " VR: Distortion Shader: RightLensCenter = { %f, %f } " , rightLensCenter [ 0 ] , rightLensCenter [ 1 ] ) ;
TraceLog ( DEBUG , " VR: Distortion Shader: Scale = { %f, %f } " , scale [ 0 ] , scale [ 1 ] ) ;
TraceLog ( DEBUG , " VR: Distortion Shader: ScaleIn = { %f, %f } " , scaleIn [ 0 ] , scaleIn [ 1 ] ) ;
/ / Update distortion shader with lens and distortion - scale parameters
SetShaderValue ( vrConfig . distortionShader , GetShaderLocation ( vrConfig . distortionShader , " leftLensCenter " ) , leftLensCenter , 2 ) ;
SetShaderValue ( vrConfig . distortionShader , GetShaderLocation ( vrConfig . distortionShader , " rightLensCenter " ) , rightLensCenter , 2 ) ;
@ -3798,8 +3828,9 @@ static void SetStereoConfig(VrDeviceInfo hmd)
/ / Fovy is normally computed with : 2 * atan2 ( hmd . vScreenSize , 2 * hmd . eyeToScreenDistance ) * RAD2DEG
/ / . . . but with lens distortion it is increased ( see Oculus SDK Documentation )
float fovy = 2.0f * atan2 ( hmd . vScreenSize * 0.5f * distortionScale , hmd . eyeToScreenDistance ) * RAD2DEG ; / / Really need distortionScale ?
/ / float fovy = 2.0f * atan2 ( hmd . vScreenSize * 0.5f * distortionScale , hmd . eyeToScreenDistance ) * RAD2DEG ; / / Really need distortionScale ?
float fovy = 2.0f * atan2 ( hmd . vScreenSize * 0.5f , hmd . eyeToScreenDistance ) * RAD2DEG ;
/ / Compute camera projection matrices
float projOffset = 4.0f * lensShift ; / / Scaled to projection space coordinates [ - 1. .1 ]
Matrix proj = MatrixPerspective ( fovy , aspect , 0.01 , 1000.0 ) ;
@ -3820,9 +3851,6 @@ static void SetStereoConfig(VrDeviceInfo hmd)
/ / Compute eyes Viewports
/ / vrConfig . eyesViewport [ 0 ] = ( Rectangle ) { 0 , 0 , hmd . hResolution / 2 , hmd . vResolution } ;
/ / vrConfig . eyesViewport [ 1 ] = ( Rectangle ) { hmd . hResolution / 2 , 0 , hmd . hResolution / 2 , hmd . vResolution } ;
/ / https : / / forums . oculus . com / vip / discussion / 3413 / calculating - the - distortion - shader - parameters
/ / https : / / vrwiki . wikispaces . com / Theory + % 26 + practice
}
/ / Set internal projection and modelview matrix depending on eyes tracking data