mirror of
				https://github.com/raysan5/raylib.git
				synced 2025-10-26 12:27:01 +00:00 
			
		
		
		
	Oculus Rift example with rlgl standalone
This commit is contained in:
		
							
								
								
									
										393
									
								
								examples/rlgl_oculus_rift.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										393
									
								
								examples/rlgl_oculus_rift.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,393 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *   raylib [rlgl] example - Oculus minimum sample | ||||
| * | ||||
| *   NOTE: This example requires OpenGL 3.3 or ES2 versions for shaders support, | ||||
| *         OpenGL 1.1 does not support shaders but it can also be used. | ||||
| * | ||||
| *   Compile rlgl module using: | ||||
| *   gcc -c rlgl.c -Wall -std=c99 -DRLGL_STANDALONE -DRAYMATH_IMPLEMENTATION -DGRAPHICS_API_OPENGL_33 -DRLGL_OCULUS_SUPPORT | ||||
| * | ||||
| *   NOTE 1: rlgl module requires the following header-only files: | ||||
| *       external/glad.h - OpenGL extensions loader (stripped to only required extensions) | ||||
| *       shader_standard.h - Standard shader for materials and lighting | ||||
| *       shader_distortion.h - Distortion shader for VR | ||||
| *       raymath.h - Vector and matrix math functions | ||||
| * | ||||
| *   NOTE 2: rlgl requires LibOVR (Oculus PC SDK) to support Oculus Rift CV1 | ||||
| * | ||||
| *   Compile example using: | ||||
| *   gcc -o rlgl_oculus_rift.exe rlgl_oculus_rift.c rlgl.o -L. -lLibOVRRT32_1 -lglfw3 -lopengl32 -lgdi32 -std=c99 | ||||
| * | ||||
| *   NOTE: Example must be linked against LibOVRRT32_1.dll that comes with Oculus Rift runtime. | ||||
| * | ||||
| *   This example has been created using raylib 1.5 (www.raylib.com) | ||||
| *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *   Copyright (c) 2015 Ramon Santamaria (@raysan5) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <math.h> | ||||
|  | ||||
| #include <GLFW/glfw3.h>         // Windows/Context and inputs management | ||||
|  | ||||
| #define RLGL_STANDALONE | ||||
| #include "rlgl.h"               // rlgl library: OpenGL 1.1 immediate-mode style coding | ||||
|  | ||||
| #define RED        (Color){ 230, 41, 55, 255 }     // Red | ||||
| #define RAYWHITE   (Color){ 245, 245, 245, 255 }   // My own White (raylib logo) | ||||
| #define DARKGRAY   (Color){ 80, 80, 80, 255 }      // Dark Gray | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| static void ErrorCallback(int error, const char* description); | ||||
| static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); | ||||
|  | ||||
| // Drawing functions (uses rlgl functionality) | ||||
| static void DrawGrid(int slices, float spacing); | ||||
| static void DrawCube(Vector3 position, float width, float height, float length, Color color); | ||||
| static void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); | ||||
| static void DrawRectangleV(Vector2 position, Vector2 size, Color color); | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Main Entry point | ||||
| //---------------------------------------------------------------------------------- | ||||
| int main(void) | ||||
| { | ||||
|     // Initialization | ||||
|     //-------------------------------------------------------------------------------------- | ||||
|     int screenWidth = 1080;     // Mirror screen width (set to hmdDesc.Resolution.w/2) | ||||
|     int screenHeight = 600;     // Mirror screen height (set to hmdDesc.Resolution.h/2) | ||||
|      | ||||
|     // NOTE: Mirror screen size can be set to any desired resolution! | ||||
|      | ||||
|     // GLFW3 Initialization + OpenGL 3.3 Context + Extensions | ||||
|     //-------------------------------------------------------- | ||||
|     glfwSetErrorCallback(ErrorCallback); | ||||
|      | ||||
|     if (!glfwInit()) | ||||
|     { | ||||
|         TraceLog(WARNING, "GLFW3: Can not initialize GLFW"); | ||||
|         return 1; | ||||
|     } | ||||
|     else TraceLog(INFO, "GLFW3: GLFW initialized successfully"); | ||||
|      | ||||
|     glfwWindowHint(GLFW_SAMPLES, 4); | ||||
|     glfwWindowHint(GLFW_DEPTH_BITS, 16); | ||||
|     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||||
|     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | ||||
|     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | ||||
|     glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); | ||||
|     | ||||
|     GLFWwindow *window = glfwCreateWindow(screenWidth, screenHeight, "rlgl oculus rift", NULL, NULL); | ||||
|      | ||||
|     if (!window) | ||||
|     { | ||||
|         glfwTerminate(); | ||||
|         return 2; | ||||
|     } | ||||
|     else TraceLog(INFO, "GLFW3: Window created successfully"); | ||||
|      | ||||
|     glfwSetKeyCallback(window, KeyCallback); | ||||
|      | ||||
|     glfwMakeContextCurrent(window); | ||||
|     glfwSwapInterval(0); | ||||
|  | ||||
|     // Load OpenGL 3.3 supported extensions | ||||
|     rlglLoadExtensions(glfwGetProcAddress); | ||||
|     //-------------------------------------------------------- | ||||
|      | ||||
|     // Initialize OpenGL context (states and resources) | ||||
|     rlglInit(screenWidth, screenHeight); | ||||
|      | ||||
|     rlClearColor(245, 245, 245, 255);                   // Define clear color | ||||
|     rlEnableDepthTest();                                // Enable DEPTH_TEST for 3D | ||||
|      | ||||
|     // Define custom camera to initialize projection and view matrices | ||||
|     Camera camera; | ||||
|     camera.position = (Vector3){ 5.0f, 5.0f, 5.0f };    // Camera position | ||||
|     camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };      // Camera looking at point | ||||
|     camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };          // Camera up vector (rotation towards target) | ||||
|     camera.fovy = 45.0f;                                // Camera field-of-view Y | ||||
|  | ||||
|     // Initialize viewport and internal projection/modelview matrices | ||||
|     rlViewport(0, 0, screenWidth, screenHeight); | ||||
|     rlMatrixMode(RL_PROJECTION);                        // Switch to PROJECTION matrix | ||||
|     rlLoadIdentity();                                   // Reset current matrix (PROJECTION) | ||||
|      | ||||
|     // Setup perspective projection | ||||
|     float aspect = (float)screenWidth/(float)screenHeight; | ||||
|     double top = 0.01*tan(camera.fovy*PI/360.0); | ||||
|     double right = top*aspect; | ||||
|     rlFrustum(-right, right, -top, top, 0.01, 1000.0); | ||||
|      | ||||
|     rlMatrixMode(RL_MODELVIEW);                         // Switch back to MODELVIEW matrix | ||||
|     rlLoadIdentity();                                   // Reset current matrix (MODELVIEW) | ||||
|      | ||||
|     // Setup Camera view | ||||
|     Matrix cameraView = MatrixLookAt(camera.position, camera.target, camera.up); | ||||
|     rlMultMatrixf(MatrixToFloat(cameraView));      // Multiply MODELVIEW matrix by view matrix (camera) | ||||
|  | ||||
|     InitOculusDevice();                                 // Initialize Oculus Rift CV1 | ||||
|      | ||||
|     Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; | ||||
|     //--------------------------------------------------------------------------------------     | ||||
|  | ||||
|     // Main game loop     | ||||
|     while (!glfwWindowShouldClose(window))  | ||||
|     { | ||||
|         // Update | ||||
|         //---------------------------------------------------------------------------------- | ||||
|         UpdateOculusTracking(); | ||||
|         //---------------------------------------------------------------------------------- | ||||
|  | ||||
|         // Draw | ||||
|         //---------------------------------------------------------------------------------- | ||||
|         BeginOculusDrawing(); | ||||
|          | ||||
|             rlClearScreenBuffers();             // Clear current framebuffer(s) | ||||
|  | ||||
|             DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); | ||||
|             DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, RAYWHITE); | ||||
|             DrawGrid(10, 1.0f); | ||||
|  | ||||
|             // NOTE: Internal buffers drawing (3D data) | ||||
|             rlglDraw(); | ||||
|  | ||||
|         EndOculusDrawing(); | ||||
|  | ||||
|         glfwSwapBuffers(window); | ||||
|         glfwPollEvents(); | ||||
|         //---------------------------------------------------------------------------------- | ||||
|     } | ||||
|  | ||||
|     // De-Initialization | ||||
|     //-------------------------------------------------------------------------------------- | ||||
|     CloseOculusDevice();            // Close Oculus device and clear resources | ||||
|  | ||||
|     rlglClose();                    // Unload rlgl internal buffers and default shader/texture | ||||
|      | ||||
|     glfwDestroyWindow(window);      // Close window | ||||
|     glfwTerminate();                // Free GLFW3 resources | ||||
|     //-------------------------------------------------------------------------------------- | ||||
|      | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Definitions | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // GLFW3: Error callback | ||||
| static void ErrorCallback(int error, const char* description) | ||||
| { | ||||
|     TraceLog(ERROR, description); | ||||
| } | ||||
|  | ||||
| // GLFW3: Keyboard callback | ||||
| static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) | ||||
| { | ||||
|     if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) | ||||
|     { | ||||
|         glfwSetWindowShouldClose(window, GL_TRUE); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Draw rectangle using rlgl OpenGL 1.1 style coding (translated to OpenGL 3.3 internally) | ||||
| static void DrawRectangleV(Vector2 position, Vector2 size, Color color) | ||||
| { | ||||
|     rlBegin(RL_TRIANGLES); | ||||
|         rlColor4ub(color.r, color.g, color.b, color.a); | ||||
|  | ||||
|         rlVertex2i(position.x, position.y); | ||||
|         rlVertex2i(position.x, position.y + size.y); | ||||
|         rlVertex2i(position.x + size.x, position.y + size.y); | ||||
|  | ||||
|         rlVertex2i(position.x, position.y); | ||||
|         rlVertex2i(position.x + size.x, position.y + size.y); | ||||
|         rlVertex2i(position.x + size.x, position.y); | ||||
|     rlEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a grid centered at (0, 0, 0) | ||||
| static void DrawGrid(int slices, float spacing) | ||||
| { | ||||
|     int halfSlices = slices / 2; | ||||
|  | ||||
|     rlBegin(RL_LINES); | ||||
|         for(int i = -halfSlices; i <= halfSlices; i++) | ||||
|         { | ||||
|             if (i == 0) | ||||
|             { | ||||
|                 rlColor3f(0.5f, 0.5f, 0.5f); | ||||
|                 rlColor3f(0.5f, 0.5f, 0.5f); | ||||
|                 rlColor3f(0.5f, 0.5f, 0.5f); | ||||
|                 rlColor3f(0.5f, 0.5f, 0.5f); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 rlColor3f(0.75f, 0.75f, 0.75f); | ||||
|                 rlColor3f(0.75f, 0.75f, 0.75f); | ||||
|                 rlColor3f(0.75f, 0.75f, 0.75f); | ||||
|                 rlColor3f(0.75f, 0.75f, 0.75f); | ||||
|             } | ||||
|  | ||||
|             rlVertex3f((float)i*spacing, 0.0f, (float)-halfSlices*spacing); | ||||
|             rlVertex3f((float)i*spacing, 0.0f, (float)halfSlices*spacing); | ||||
|  | ||||
|             rlVertex3f((float)-halfSlices*spacing, 0.0f, (float)i*spacing); | ||||
|             rlVertex3f((float)halfSlices*spacing, 0.0f, (float)i*spacing); | ||||
|         } | ||||
|     rlEnd(); | ||||
| } | ||||
|  | ||||
| // Draw cube | ||||
| // NOTE: Cube position is the center position | ||||
| void DrawCube(Vector3 position, float width, float height, float length, Color color) | ||||
| { | ||||
|     float x = 0.0f; | ||||
|     float y = 0.0f; | ||||
|     float z = 0.0f; | ||||
|  | ||||
|     rlPushMatrix(); | ||||
|  | ||||
|         // NOTE: Be careful! Function order matters (rotate -> scale -> translate) | ||||
|         rlTranslatef(position.x, position.y, position.z); | ||||
|         //rlScalef(2.0f, 2.0f, 2.0f); | ||||
|         //rlRotatef(45, 0, 1, 0); | ||||
|  | ||||
|         rlBegin(RL_TRIANGLES); | ||||
|             rlColor4ub(color.r, color.g, color.b, color.a); | ||||
|  | ||||
|             // Front Face ----------------------------------------------------- | ||||
|             rlVertex3f(x-width/2, y-height/2, z+length/2);  // Bottom Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left | ||||
|  | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Top Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Right | ||||
|  | ||||
|             // Back Face ------------------------------------------------------ | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Bottom Left | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|  | ||||
|             rlVertex3f(x+width/2, y+height/2, z-length/2);  // Top Right | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left | ||||
|  | ||||
|             // Top Face ------------------------------------------------------- | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Bottom Left | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Bottom Right | ||||
|  | ||||
|             rlVertex3f(x+width/2, y+height/2, z-length/2);  // Top Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Bottom Right | ||||
|  | ||||
|             // Bottom Face ---------------------------------------------------- | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Top Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Right | ||||
|             rlVertex3f(x-width/2, y-height/2, z+length/2);  // Bottom Left | ||||
|  | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Top Right | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Right | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Top Left | ||||
|  | ||||
|             // Right face ----------------------------------------------------- | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|             rlVertex3f(x+width/2, y+height/2, z-length/2);  // Top Right | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Top Left | ||||
|  | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Top Left | ||||
|  | ||||
|             // Left Face ------------------------------------------------------ | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Right | ||||
|  | ||||
|             rlVertex3f(x-width/2, y-height/2, z+length/2);  // Bottom Left | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|         rlEnd(); | ||||
|     rlPopMatrix(); | ||||
| } | ||||
|  | ||||
| // Draw cube wires | ||||
| void DrawCubeWires(Vector3 position, float width, float height, float length, Color color) | ||||
| { | ||||
|     float x = 0.0f; | ||||
|     float y = 0.0f; | ||||
|     float z = 0.0f; | ||||
|  | ||||
|     rlPushMatrix(); | ||||
|  | ||||
|         rlTranslatef(position.x, position.y, position.z); | ||||
|         //rlRotatef(45, 0, 1, 0); | ||||
|  | ||||
|         rlBegin(RL_LINES); | ||||
|             rlColor4ub(color.r, color.g, color.b, color.a); | ||||
|  | ||||
|             // Front Face ----------------------------------------------------- | ||||
|             // Bottom Line | ||||
|             rlVertex3f(x-width/2, y-height/2, z+length/2);  // Bottom Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Right | ||||
|  | ||||
|             // Left Line | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Bottom Right | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Top Right | ||||
|  | ||||
|             // Top Line | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Top Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left | ||||
|  | ||||
|             // Right Line | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left | ||||
|             rlVertex3f(x-width/2, y-height/2, z+length/2);  // Bottom Left | ||||
|  | ||||
|             // Back Face ------------------------------------------------------ | ||||
|             // Bottom Line | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Bottom Left | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|  | ||||
|             // Left Line | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Bottom Right | ||||
|             rlVertex3f(x+width/2, y+height/2, z-length/2);  // Top Right | ||||
|  | ||||
|             // Top Line | ||||
|             rlVertex3f(x+width/2, y+height/2, z-length/2);  // Top Right | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left | ||||
|  | ||||
|             // Right Line | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Bottom Left | ||||
|  | ||||
|             // Top Face ------------------------------------------------------- | ||||
|             // Left Line | ||||
|             rlVertex3f(x-width/2, y+height/2, z+length/2);  // Top Left Front | ||||
|             rlVertex3f(x-width/2, y+height/2, z-length/2);  // Top Left Back | ||||
|  | ||||
|             // Right Line | ||||
|             rlVertex3f(x+width/2, y+height/2, z+length/2);  // Top Right Front | ||||
|             rlVertex3f(x+width/2, y+height/2, z-length/2);  // Top Right Back | ||||
|  | ||||
|             // Bottom Face  --------------------------------------------------- | ||||
|             // Left Line | ||||
|             rlVertex3f(x-width/2, y-height/2, z+length/2);  // Top Left Front | ||||
|             rlVertex3f(x-width/2, y-height/2, z-length/2);  // Top Left Back | ||||
|  | ||||
|             // Right Line | ||||
|             rlVertex3f(x+width/2, y-height/2, z+length/2);  // Top Right Front | ||||
|             rlVertex3f(x+width/2, y-height/2, z-length/2);  // Top Right Back | ||||
|         rlEnd(); | ||||
|     rlPopMatrix(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 raysan5
					raysan5