summaryrefslogtreecommitdiffhomepage
path: root/examples/oculus_glfw_sample/oculus_glfw_sample.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/oculus_glfw_sample/oculus_glfw_sample.c')
-rw-r--r--examples/oculus_glfw_sample/oculus_glfw_sample.c51
1 files changed, 29 insertions, 22 deletions
diff --git a/examples/oculus_glfw_sample/oculus_glfw_sample.c b/examples/oculus_glfw_sample/oculus_glfw_sample.c
index 5166bac6..9f438185 100644
--- a/examples/oculus_glfw_sample/oculus_glfw_sample.c
+++ b/examples/oculus_glfw_sample/oculus_glfw_sample.c
@@ -30,7 +30,7 @@
#define RLGL_STANDALONE
#include "rlgl.h"
-//#define PLATFORM_OCULUS
+#define PLATFORM_OCULUS
#if defined(PLATFORM_OCULUS)
#include "OculusSDK/LibOVR/Include/OVR_CAPI_GL.h" // Oculus SDK for OpenGL
@@ -72,7 +72,7 @@ typedef struct OculusMirror {
typedef struct OculusLayer {
ovrViewScaleDesc viewScaleDesc;
ovrLayerEyeFov eyeLayer; // layer 0
- //ovrLayerQuad quadLayer; // layer 1
+ //ovrLayerQuad quadLayer; // TODO: layer 1: '2D' quad for GUI
Matrix eyeProjections[2];
int width;
int height;
@@ -222,6 +222,7 @@ int main(void)
layer.eyeLayer.RenderPose[0] = eyePoses[0];
layer.eyeLayer.RenderPose[1] = eyePoses[1];
#endif
+ Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
//----------------------------------------------------------------------------------
// Draw
@@ -229,13 +230,12 @@ int main(void)
#if defined(PLATFORM_OCULUS)
SetOculusBuffer(session, buffer);
#endif
-
- rlClearScreenBuffers(); // Clear current framebuffers
+ rlClearScreenBuffers(); // Clear current framebuffer(s)
#if defined(PLATFORM_OCULUS)
for (int eye = 0; eye < 2; eye++)
{
- glViewport(layer.eyeLayer.Viewport[eye].Pos.x, layer.eyeLayer.Viewport[eye].Pos.y, layer.eyeLayer.Viewport[eye].Size.w, layer.eyeLayer.Viewport[eye].Size.h);
+ rlViewport(layer.eyeLayer.Viewport[eye].Pos.x, layer.eyeLayer.Viewport[eye].Pos.y, layer.eyeLayer.Viewport[eye].Size.w, layer.eyeLayer.Viewport[eye].Size.h);
Quaternion eyeRPose = (Quaternion){ eyePoses[eye].Orientation.x, eyePoses[eye].Orientation.y, eyePoses[eye].Orientation.z, eyePoses[eye].Orientation.w };
QuaternionInvert(&eyeRPose);
@@ -244,32 +244,39 @@ int main(void)
Matrix eyeView = MatrixMultiply(eyeTranslation, eyeOrientation);
Matrix modelview = MatrixMultiply(matView, eyeView);
- Matrix mvp = MatrixMultiply(modelview, layer.eyeProjections[eye]);
+ //Matrix mvp = MatrixMultiply(modelview, layer.eyeProjections[eye]);
+
+ SetMatrixModelview(modelview);
+ SetMatrixProjection(layer.eyeProjections[eye]);
#else
// Calculate projection matrix (from perspective) and view matrix from camera look at
Matrix matProj = MatrixPerspective(camera.fovy, (double)screenWidth/(double)screenHeight, 0.01, 1000.0);
MatrixTranspose(&matProj);
- Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
- Matrix mvp = MatrixMultiply(matView, matProj);
+
+ SetMatrixModelview(matView); // Replace internal modelview matrix by a custom one
+ SetMatrixProjection(matProj); // Replace internal projection matrix by a custom one
#endif
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(mvp);
-
- matProj = MatrixOrtho(0.0, screenWidth, screenHeight, 0.0, 0.0, 1.0);
- MatrixTranspose(&matProj);
- matView = MatrixIdentity();
- mvp = MatrixMultiply(matView, matProj);
+ rlglDraw();
+#if !defined(PLATFORM_OCULUS)
+ // Draw '2D' elements in the scene (GUI)
// TODO: 2D drawing on Oculus Rift: requires an ovrLayerQuad layer
- DrawRectangleV((Vector2){ 10.0f, 10.0f }, (Vector2){ 300.0f, 20.0f }, DARKGRAY);
+ rlMatrixMode(RL_PROJECTION); // Enable internal projection matrix
+ rlLoadIdentity(); // Reset internal projection matrix
+ rlOrtho(0.0, screenWidth, screenHeight, 0.0, 0.0, 1.0); // Recalculate internal projection matrix
+ rlMatrixMode(RL_MODELVIEW); // Enable internal modelview matrix
+ rlLoadIdentity(); // Reset internal modelview matrix
+
+ DrawRectangleV((Vector2){ 10.0f, 10.0f }, (Vector2){ 600.0f, 20.0f }, DARKGRAY);
// NOTE: Internal buffers drawing (2D data)
- rlglDraw(mvp);
-
+ rlglDraw();
+#endif
#if defined(PLATFORM_OCULUS)
}
@@ -593,14 +600,12 @@ static OculusBuffer LoadOculusBuffer(ovrSession session, int width, int height)
desc.Width = width;
desc.Height = height;
desc.MipLevels = 1;
- desc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB;
+ desc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; // Requires glEnable(GL_FRAMEBUFFER_SRGB);
desc.SampleCount = 1;
desc.StaticImage = ovrFalse;
ovrResult result = ovr_CreateTextureSwapChainGL(session, &desc, &buffer.textureChain);
- //eyeLayer.ColorTexture[0] = buffer.textureChain; // <------------------- ???
-
if (!OVR_SUCCESS(result)) TraceLog(LOG_WARNING, "OVR: Failed to create swap textures buffer");
int textureCount = 0;
@@ -672,9 +677,11 @@ static void SetOculusBuffer(ovrSession session, OculusBuffer buffer)
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, currentTexId, 0);
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, buffer.depthId, 0); // Already binded
- //glViewport(0, 0, buffer.width, buffer.height);
+ //glViewport(0, 0, buffer.width, buffer.height); // Useful if rendering to separate framebuffers (every eye)
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- //glEnable(GL_FRAMEBUFFER_SRGB);
+
+ // Required if OculusBuffer format is OVR_FORMAT_R8G8B8A8_UNORM_SRGB
+ glEnable(GL_FRAMEBUFFER_SRGB);
}
// Unset Oculus buffer