Просмотр исходного кода

Merge remote-tracking branch 'refs/remotes/raysan5/develop' into develop

victorfisac 9 лет назад
Родитель
Сommit
9fea631bfb
6 измененных файлов с 64 добавлено и 53 удалено
  1. 8 11
      examples/core_oculus_rift.c
  2. BIN
      examples/core_oculus_rift.png
  3. 4 4
      src/core.c
  4. 21 8
      src/raylib.h
  5. 23 22
      src/rlgl.c
  6. 8 8
      src/rlgl.h

+ 8 - 11
examples/core_oculus_rift.c

@@ -23,7 +23,8 @@ int main()
     
     InitWindow(screenWidth, screenHeight, "raylib [core] example - oculus rift");
     
-    InitOculusDevice();
+    // NOTE: If device is not available, it fallbacks to default device (simulator)
+    InitVrDevice(HMD_OCULUS_RIFT_CV1);                  // Init VR device (Oculus Rift CV1)
     
     // Define the camera to look into our 3d world
     Camera camera;
@@ -42,9 +43,9 @@ int main()
     {
         // Update
         //----------------------------------------------------------------------------------
-        UpdateOculusTracking();
+        UpdateVrTracking();
         
-        if (IsKeyPressed(KEY_SPACE)) ToggleVR();
+        if (IsKeyPressed(KEY_SPACE)) ToggleVrMode();
         //----------------------------------------------------------------------------------
 
         // Draw
@@ -52,20 +53,16 @@ int main()
         BeginDrawing();
 
             ClearBackground(RAYWHITE);
-            
-            if (IsOculusReady()) BeginOculusDrawing();
 
             Begin3dMode(camera);
 
                 DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED);
                 DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON);
-                
+
                 DrawGrid(10, 1.0f);
-            
+
             End3dMode();
-            
-            if (IsOculusReady()) EndOculusDrawing();
-            
+
             DrawFPS(10, 10);
 
         EndDrawing();
@@ -74,7 +71,7 @@ int main()
 
     // De-Initialization
     //--------------------------------------------------------------------------------------
-    CloseOculusDevice();    // Close Oculus Rift device
+    CloseVrDevice();        // Close VR device
     
     CloseWindow();          // Close window and OpenGL context
     //--------------------------------------------------------------------------------------

BIN
examples/core_oculus_rift.png


+ 4 - 4
src/core.c

@@ -521,8 +521,6 @@ void BeginDrawing(void)
     updateTime = currentTime - previousTime;
     previousTime = currentTime;
     
-    //if (IsOculusReady()) BeginOculusDrawing();
-
     rlClearScreenBuffers();             // Clear current framebuffers
     rlLoadIdentity();                   // Reset current matrix (MODELVIEW)
     rlMultMatrixf(MatrixToFloat(downscaleView));       // If downscale required, apply it here
@@ -535,8 +533,6 @@ void BeginDrawing(void)
 void EndDrawing(void)
 {
     rlglDraw();                     // Draw Buffers (Only OpenGL 3+ and ES2)
-    
-    //if (IsOculusReady()) EndOculusDrawing();
 
     SwapBuffers();                  // Copy back buffer to front buffer
     PollInputEvents();              // Poll user events
@@ -590,6 +586,8 @@ void End2dMode(void)
 void Begin3dMode(Camera camera)
 {
     rlglDraw();                         // Draw Buffers (Only OpenGL 3+ and ES2)
+    
+    if (IsVrDeviceReady()) BeginVrDrawing();
 
     rlMatrixMode(RL_PROJECTION);        // Switch to projection matrix
 
@@ -618,6 +616,8 @@ void Begin3dMode(Camera camera)
 void End3dMode(void)
 {        
     rlglDraw();                         // Process internal buffers (update + draw)
+    
+    if (IsVrDeviceReady()) EndVrDrawing();
 
     rlMatrixMode(RL_PROJECTION);        // Switch to projection matrix
     rlPopMatrix();                      // Restore previous matrix (PROJECTION) from matrix stack

+ 21 - 8
src/raylib.h

@@ -527,6 +527,19 @@ typedef struct GestureEvent {
 // Camera system modes
 typedef enum { CAMERA_CUSTOM = 0, CAMERA_FREE, CAMERA_ORBITAL, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON } CameraMode;
 
+// Head Mounted Display devices
+typedef enum {
+    HMD_DEFAULT_DEVICE = 0,
+    HMD_OCULUS_RIFT_DK2,
+    HMD_OCULUS_RIFT_CV1,
+    HMD_VALVE_HTC_VIVE,
+    HMD_SAMSUNG_GEAR_VR,
+    HMD_GOOGLE_CARDBOARD,
+    HMD_SONY_PLAYSTATION_VR,
+    HMD_RAZER_OSVR,
+    HMD_FOVE_VR,
+} HmdDevice;
+
 #ifdef __cplusplus
 extern "C" {            // Prevents name mangling of functions
 #endif
@@ -846,16 +859,16 @@ Light CreateLight(int type, Vector3 position, Color diffuse);       // Create a
 void DestroyLight(Light light);                                     // Destroy a light and take it out of the list
 
 //------------------------------------------------------------------------------------
-// Oculus Rift CV1 Functions (Module: rlgl)
+// VR experience Functions (Module: rlgl)
 // NOTE: This functions are useless when using OpenGL 1.1
 //------------------------------------------------------------------------------------
-void InitOculusDevice(void);                // Init Oculus Rift device
-void CloseOculusDevice(void);               // Close Oculus Rift device
-void UpdateOculusTracking(void);            // Update Oculus Rift tracking (position and orientation)
-void BeginOculusDrawing(void);              // Begin Oculus drawing configuration
-void EndOculusDrawing(void);                // End Oculus drawing process (and desktop mirror)
-bool IsOculusReady(void);                   // Detect if oculus device (or simulator) is ready
-void ToggleVR(void);                        // Enable/Disable VR experience (Oculus device or simulator)
+void InitVrDevice(int hmdDevice);           // Init VR device
+void CloseVrDevice(void);                   // Close VR device
+void UpdateVrTracking(void);                // Update VR tracking (position and orientation)
+void BeginVrDrawing(void);                  // Begin VR drawing configuration
+void EndVrDrawing(void);                    // End VR drawing process (and desktop mirror)
+bool IsVrDeviceReady(void);                 // Detect if VR device (or simulator) is ready
+void ToggleVrMode(void);                    // Enable/Disable VR experience (device or simulator)
 
 //------------------------------------------------------------------------------------
 // Audio Loading and Playing Functions (Module: audio)

+ 23 - 22
src/rlgl.c

@@ -322,7 +322,7 @@ static void DrawDefaultBuffers(int eyesCount); // Draw default internal buffers
 static void UnloadDefaultBuffers(void);     // Unload default internal buffers vertex data from CPU and GPU
 
 // Set internal projection and modelview matrix depending on eyes tracking data
-static void SetOculusView(int eye, Matrix matProjection, Matrix matModelView);
+static void SetStereoView(int eye, Matrix matProjection, Matrix matModelView);
 
 static void SetShaderLights(Shader shader); // Sets shader uniform values for lights array
 
@@ -2001,7 +2001,7 @@ void rlglDrawMesh(Mesh mesh, Material material, Matrix transform)
 
     for (int eye = 0; eye < eyesCount; eye++)
     {
-        if (eyesCount == 2) SetOculusView(eye, matProjection, matModelView);
+        if (eyesCount == 2) SetStereoView(eye, matProjection, matModelView);
         else modelview = matModelView;
 
         // Calculate model-view-projection matrix (MVP)
@@ -2504,8 +2504,9 @@ void DestroyLight(Light light)
 #endif
 }
 
-// Init Oculus Rift device (or Oculus device simulator)
-void InitOculusDevice(void)
+// Init VR device (or simulator)
+// NOTE: If device is not available, it fallbacks to default device (simulator)
+void InitVrDevice(int hmdDevice)
 {
 #if defined(RLGL_OCULUS_SUPPORT)
     // Initialize Oculus device
@@ -2557,7 +2558,7 @@ void InitOculusDevice(void)
 
     if (!oculusReady)
     {
-        TraceLog(WARNING, "VR: Initializing Oculus simulator");
+        TraceLog(WARNING, "HMD Device not found: Initializing VR simulator");
 
         // Initialize framebuffer and textures for stereo rendering
         stereoFbo = rlglLoadRenderTexture(screenWidth, screenHeight);
@@ -2571,8 +2572,8 @@ void InitOculusDevice(void)
     }
 }
 
-// Close Oculus Rift device (or Oculus device simulator)
-void CloseOculusDevice(void)
+// Close VR device (or simulator)
+void CloseVrDevice(void)
 {
 #if defined(RLGL_OCULUS_SUPPORT)
     if (oculusReady)
@@ -2596,20 +2597,20 @@ void CloseOculusDevice(void)
     oculusReady = false;
 }
 
-// Detect if oculus device is available
-bool IsOculusReady(void)
+// Detect if VR device is available
+bool IsVrDeviceReady(void)
 {
     return (oculusReady || oculusSimulator) && vrEnabled;
 }
 
-// Enable/Disable VR experience (Oculus device or simulator)
-void ToggleVR(void)
+// Enable/Disable VR experience (device or simulator)
+void ToggleVrMode(void)
 {
     vrEnabled = !vrEnabled;
 }
 
-// Update Oculus Rift tracking (position and orientation)
-void UpdateOculusTracking(void)
+// Update VR tracking (position and orientation)
+void UpdateVrTracking(void)
 {
 #if defined(RLGL_OCULUS_SUPPORT)
     if (oculusReady)
@@ -2641,7 +2642,7 @@ void UpdateOculusTracking(void)
 }
 
 // Set internal projection and modelview matrix depending on eyes tracking data
-static void SetOculusView(int eye, Matrix matProjection, Matrix matModelView)
+static void SetStereoView(int eye, Matrix matProjection, Matrix matModelView)
 {   
     if (vrEnabled)
     {
@@ -2675,12 +2676,12 @@ static void SetOculusView(int eye, Matrix matProjection, Matrix matModelView)
             // Setup viewport and projection/modelview matrices using tracking data
             rlViewport(eye*screenWidth/2, 0, screenWidth/2, screenHeight);
             
-            static float IPD = 0.064f;       // InterpupillaryDistance
+            static float IPD = 0.064f;              // InterpupillaryDistance
             float HScreenSize = 0.14976f;
-            float VScreenSize = 0.0936f;     // HScreenSize/(1280.0f/800.0f)
-            float VScreenCenter = 0.04675f;
+            float VScreenSize = 0.0936f;            // 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.064f;  //0.0635f (DK1)
             
             // NOTE: fovy value obtained from device parameters (Oculus Rift CV1)
             float halfScreenDistance = VScreenSize/2.0f;
@@ -2730,13 +2731,13 @@ static void SetOculusView(int eye, Matrix matProjection, Matrix matModelView)
             MatrixTranspose(&eyeProjection);
         }
 
-        SetMatrixModelview(eyeModelView);       // ERROR! We are modifying modelview for next eye!!!
+        SetMatrixModelview(eyeModelView);
         SetMatrixProjection(eyeProjection);
     }
 }
 
 // Begin Oculus drawing configuration
-void BeginOculusDrawing(void)
+void BeginVrDrawing(void)
 {
 #if defined(RLGL_OCULUS_SUPPORT)
     if (oculusReady)
@@ -2771,7 +2772,7 @@ void BeginOculusDrawing(void)
 }
 
 // End Oculus drawing process (and desktop mirror)
-void EndOculusDrawing(void)
+void EndVrDrawing(void)
 {
 #if defined(RLGL_OCULUS_SUPPORT)
     if (oculusReady)
@@ -3414,7 +3415,7 @@ static void DrawDefaultBuffers(int eyesCount)
     
     for (int eye = 0; eye < eyesCount; eye++)
     {
-        if (eyesCount == 2) SetOculusView(eye, matProjection, matModelView);
+        if (eyesCount == 2) SetStereoView(eye, matProjection, matModelView);
 
         // Set current shader and upload current MVP matrix
         if ((lines.vCounter > 0) || (triangles.vCounter > 0) || (quads.vCounter > 0))

+ 8 - 8
src/rlgl.h

@@ -350,15 +350,15 @@ Light CreateLight(int type, Vector3 position, Color diffuse);       // Create a
 void DestroyLight(Light light);                                     // Destroy a light and take it out of the list
 
 void TraceLog(int msgType, const char *text, ...);
-#endif
 
-void InitOculusDevice(void);                // Init Oculus Rift device
-void CloseOculusDevice(void);               // Close Oculus Rift device
-void UpdateOculusTracking(void);            // Update Oculus Rift tracking (position and orientation)
-void BeginOculusDrawing(void);              // Begin Oculus drawing configuration
-void EndOculusDrawing(void);                // End Oculus drawing process (and desktop mirror)
-bool IsOculusReady(void);                   // Detect if oculus device (or simulator) is ready
-void ToggleVR(void);                        // Enable/Disable VR experience (Oculus device or simulator)
+void InitVrDevice(int hmdDevice);           // Init VR device
+void CloseVrDevice(void);                   // Close VR device
+void UpdateVrTracking(void);                // Update VR tracking (position and orientation)
+void BeginVrDrawing(void);                  // Begin VR drawing configuration
+void EndVrDrawing(void);                    // End VR drawing process (and desktop mirror)
+bool IsVrDeviceReady(void);                 // Detect if VR device (or simulator) is ready
+void ToggleVrMode(void);                    // Enable/Disable VR experience (device or simulator)
+#endif
 
 #ifdef __cplusplus
 }