vrchess
changeset 5:8b7da5ab814e
vr wrapper in progress
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 20 Aug 2014 16:34:43 +0300 |
parents | e6948e131526 |
children | 3c36bc28c6c2 |
files | src/vr/vr.h src/vr/vr_impl.h src/vr/vr_libovr.c src/vr/vr_null.c vrchess.vcxproj vrchess.vcxproj.filters |
diffstat | 6 files changed, 137 insertions(+), 70 deletions(-) [+] |
line diff
1.1 --- a/src/vr/vr.h Wed Aug 20 06:33:43 2014 +0300 1.2 +++ b/src/vr/vr.h Wed Aug 20 16:34:43 2014 +0300 1.3 @@ -1,6 +1,11 @@ 1.4 #ifndef VR_H_ 1.5 #define VR_H_ 1.6 1.7 +enum { 1.8 + VR_EYE_LEFT, 1.9 + VR_EYE_RIGHT 1.10 +}; 1.11 + 1.12 #ifdef __cplusplus 1.13 extern "C" { 1.14 #endif 1.15 @@ -14,17 +19,21 @@ 1.16 int vr_use_module(int idx); 1.17 int vr_use_module_named(const char *name); 1.18 1.19 +/* if we're using a vr module which requires a specific output resolution, vr_display_size 1.20 + * returns non-zero, and writes the size through the xsz/ysz pointers. Otherwise returns 0 1.21 + */ 1.22 +int vr_display_size(int *xsz, int *ysz); 1.23 +int vr_eye_texture_size(int eye, int *xsz, int *ysz); 1.24 + 1.25 /* returns non-zero if the active vr module provides this kind of matrix 1.26 * information, otherwise it returns zero, and sets mat to identity 1.27 */ 1.28 int vr_view_matrix(int eye, float *mat); 1.29 int vr_proj_matrix(int eye, float *mat); 1.30 1.31 -/* fbtex should be a texture containing both eye views side by side (LR) */ 1.32 -void vr_present(unsigned int fbtex); 1.33 - 1.34 -/* set the area of the framebuffer texture to be used */ 1.35 -void vr_fbrect(float u, float umax, float v, float vmax); 1.36 +void vr_begin(int eye); 1.37 +void vr_end(void); 1.38 +void vr_present(void); 1.39 1.40 #ifdef __cplusplus 1.41 }
2.1 --- a/src/vr/vr_impl.h Wed Aug 20 06:33:43 2014 +0300 2.2 +++ b/src/vr/vr_impl.h Wed Aug 20 16:34:43 2014 +0300 2.3 @@ -10,7 +10,9 @@ 2.4 void (*view_matrix)(int eye, float *mat); 2.5 void (*proj_matrix)(int eye, float *mat); 2.6 2.7 - void (*draw)(unsigned int fbtex, float u, float maxu, float v, float maxv); 2.8 + void (*begin)(int eye); 2.9 + void (*end)(void); 2.10 + void (*present)(void); 2.11 }; 2.12 2.13 void vr_init_modules(void);
3.1 --- a/src/vr/vr_libovr.c Wed Aug 20 06:33:43 2014 +0300 3.2 +++ b/src/vr/vr_libovr.c Wed Aug 20 16:34:43 2014 +0300 3.3 @@ -1,12 +1,71 @@ 3.4 +#ifdef WIN32 3.5 +#define OVR_OS_WIN32 3.6 +#endif 3.7 + 3.8 +#include <stdio.h> 3.9 +#include <stdlib.h> 3.10 +#include <OVR_CAPI.h> 3.11 +#include <OVR_CAPI_GL.h> 3.12 #include "vr_impl.h" 3.13 3.14 +static ovrHmd hmd; 3.15 + 3.16 static int init(void) 3.17 { 3.18 - return -1; 3.19 + int i, num_hmds; 3.20 + union ovrGLConfig glcfg; 3.21 + 3.22 + if(!ovr_Initialize()) { 3.23 + return -1; 3.24 + } 3.25 + printf("initialized LibOVR %s\n", ovr_GetVersionString()); 3.26 + 3.27 + if(!(num_hmds = ovrHmd_Detect())) { 3.28 + ovr_Shutdown(); 3.29 + return -1; 3.30 + } 3.31 + printf("%d Oculus HMD(s) found\n", num_hmds); 3.32 + 3.33 + hmd = 0; 3.34 + for(i=0; i<num_hmds; i++) { 3.35 + ovrHmd h; 3.36 + if(!(h = ovrHmd_Create(i))) { 3.37 + break; 3.38 + } 3.39 + printf(" [%d]: %s - %s\n", h->Manufacturer, h->ProductName); 3.40 + 3.41 + if(!hmd) { 3.42 + hmd = h; 3.43 + } else { 3.44 + ovrHmd_Destroy(h); 3.45 + } 3.46 + } 3.47 + 3.48 + if(!hmd) { 3.49 + fprintf(stderr, "failed to initialize any Oculus HMDs\n"); 3.50 + return -1; 3.51 + } 3.52 + 3.53 + ovrHmd_ConfigureTracking(hmd, 0xffffffff, 0); 3.54 + 3.55 + glcfg.OGL.Header.API = ovrRenderAPI_OpenGL; 3.56 + glcfg.OGL.Header.RTSize = hmd->Resolution; 3.57 + glcfg.OGL.Header.Multisample = 0; 3.58 + glcfg.OGL.Window = 0; 3.59 + glcfg.OGL.DC = 0; 3.60 + 3.61 + if(!ovrHmd_ConfigureRendering(hmd, &glcfg.Config, distort_caps, eyes_fov, eye_rend_desc))) { 3.62 + fprintf(stderr, "failed to configure LibOVR distortion renderer\n"); 3.63 + return -1; 3.64 + } 3.65 } 3.66 3.67 static void cleanup(void) 3.68 { 3.69 + if(hmd) { 3.70 + ovrHmd_Destroy(hmd); 3.71 + ovr_Destroy(); 3.72 + } 3.73 } 3.74 3.75 static void view_matrix(int eye, float *mat) 3.76 @@ -17,10 +76,19 @@ 3.77 { 3.78 } 3.79 3.80 -static void draw(unsigned int fbtex, float u, float maxu, float v, float maxv) 3.81 +static void begin(int eye) 3.82 { 3.83 } 3.84 3.85 +static void end(void) 3.86 +{ 3.87 +} 3.88 + 3.89 +static void present(void) 3.90 +{ 3.91 +} 3.92 + 3.93 + 3.94 struct vr_module *vr_module_libovr(void) 3.95 { 3.96 static struct vr_module m; 3.97 @@ -31,7 +99,9 @@ 3.98 m.cleanup = cleanup; 3.99 m.view_matrix = view_matrix; 3.100 m.proj_matrix = proj_matrix; 3.101 - m.draw = draw; 3.102 + m.begin = begin; 3.103 + m.end = end; 3.104 + m.present = present; 3.105 } 3.106 return &m; 3.107 }
4.1 --- a/src/vr/vr_null.c Wed Aug 20 06:33:43 2014 +0300 4.2 +++ b/src/vr/vr_null.c Wed Aug 20 16:34:43 2014 +0300 4.3 @@ -16,38 +16,6 @@ 4.4 return 0; 4.5 } 4.6 4.7 -static void draw(unsigned int fbtex, float u, float maxu, float v, float maxv) 4.8 -{ 4.9 - glPushAttrib(GL_ENABLE_BIT | GL_TRANSFORM_BIT); 4.10 - 4.11 - glDisable(GL_LIGHTING); 4.12 - glDisable(GL_DEPTH_TEST); 4.13 - glDisable(GL_FOG); 4.14 - glDisable(GL_CULL_FACE); 4.15 - 4.16 - glMatrixMode(GL_MODELVIEW); 4.17 - glLoadIdentity(); 4.18 - glMatrixMode(GL_PROJECTION); 4.19 - glLoadIdentity(); 4.20 - 4.21 - glBegin(GL_QUADS); 4.22 - glTexCoord2f(u, v); 4.23 - glVertex2f(-1, -1); 4.24 - glTexCoord2f((u + maxu) / 2, v); 4.25 - glVertex2f(1, -1); 4.26 - glTexCoord2f((u + maxu) / 2, maxv); 4.27 - glVertex2f(1, 1); 4.28 - glTexCoord2f(u, maxv); 4.29 - glVertex2f(-1, 1); 4.30 - glEnd(); 4.31 - 4.32 - glPopMatrix(); 4.33 - glMatrixMode(GL_MODELVIEW); 4.34 - glPopMatrix(); 4.35 - 4.36 - glPopAttrib(); 4.37 -} 4.38 - 4.39 struct vr_module *vr_module_null(void) 4.40 { 4.41 static struct vr_module m; 4.42 @@ -55,7 +23,6 @@ 4.43 if(!m.init) { 4.44 m.name = "null"; 4.45 m.init = init; 4.46 - m.draw = draw; 4.47 } 4.48 return &m; 4.49 }
5.1 --- a/vrchess.vcxproj Wed Aug 20 06:33:43 2014 +0300 5.2 +++ b/vrchess.vcxproj Wed Aug 20 16:34:43 2014 +0300 5.3 @@ -87,6 +87,10 @@ 5.4 <ClCompile Include="src\opengl.cc" /> 5.5 <ClCompile Include="src\sdr.c" /> 5.6 <ClCompile Include="src\texture.cc" /> 5.7 + <ClCompile Include="src\vr\vr.c" /> 5.8 + <ClCompile Include="src\vr\vr_libovr.c" /> 5.9 + <ClCompile Include="src\vr\vr_modules.c" /> 5.10 + <ClCompile Include="src\vr\vr_null.c" /> 5.11 </ItemGroup> 5.12 <ItemGroup> 5.13 <ClInclude Include="src\camera.h" /> 5.14 @@ -95,6 +99,8 @@ 5.15 <ClInclude Include="src\opengl.h" /> 5.16 <ClInclude Include="src\sdr.h" /> 5.17 <ClInclude Include="src\texture.h" /> 5.18 + <ClInclude Include="src\vr\vr.h" /> 5.19 + <ClInclude Include="src\vr\vr_impl.h" /> 5.20 </ItemGroup> 5.21 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 5.22 <ImportGroup Label="ExtensionTargets">
6.1 --- a/vrchess.vcxproj.filters Wed Aug 20 06:33:43 2014 +0300 6.2 +++ b/vrchess.vcxproj.filters Wed Aug 20 16:34:43 2014 +0300 6.3 @@ -1,60 +1,73 @@ 6.4 <?xml version="1.0" encoding="utf-8"?> 6.5 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 6.6 <ItemGroup> 6.7 - <Filter Include="Source Files"> 6.8 + <Filter Include="src"> 6.9 <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> 6.10 - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> 6.11 + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;h;inl</Extensions> 6.12 </Filter> 6.13 - <Filter Include="Header Files"> 6.14 - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> 6.15 - <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> 6.16 - </Filter> 6.17 - <Filter Include="Resource Files"> 6.18 - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> 6.19 - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> 6.20 + <Filter Include="src\vr"> 6.21 + <UniqueIdentifier>{e881ab02-1a45-43f6-a15d-ee7f77256a1e}</UniqueIdentifier> 6.22 </Filter> 6.23 </ItemGroup> 6.24 <ItemGroup> 6.25 <ClCompile Include="src\main.cc"> 6.26 - <Filter>Source Files</Filter> 6.27 + <Filter>src</Filter> 6.28 </ClCompile> 6.29 <ClCompile Include="src\camera.cc"> 6.30 - <Filter>Source Files</Filter> 6.31 + <Filter>src</Filter> 6.32 </ClCompile> 6.33 <ClCompile Include="src\opengl.cc"> 6.34 - <Filter>Source Files</Filter> 6.35 + <Filter>src</Filter> 6.36 </ClCompile> 6.37 <ClCompile Include="src\sdr.c"> 6.38 - <Filter>Source Files</Filter> 6.39 + <Filter>src</Filter> 6.40 </ClCompile> 6.41 <ClCompile Include="src\game.cc"> 6.42 - <Filter>Source Files</Filter> 6.43 + <Filter>src</Filter> 6.44 </ClCompile> 6.45 <ClCompile Include="src\image.cc"> 6.46 - <Filter>Source Files</Filter> 6.47 + <Filter>src</Filter> 6.48 </ClCompile> 6.49 <ClCompile Include="src\texture.cc"> 6.50 - <Filter>Source Files</Filter> 6.51 + <Filter>src</Filter> 6.52 + </ClCompile> 6.53 + <ClCompile Include="src\vr\vr.c"> 6.54 + <Filter>src\vr</Filter> 6.55 + </ClCompile> 6.56 + <ClCompile Include="src\vr\vr_libovr.c"> 6.57 + <Filter>src\vr</Filter> 6.58 + </ClCompile> 6.59 + <ClCompile Include="src\vr\vr_modules.c"> 6.60 + <Filter>src\vr</Filter> 6.61 + </ClCompile> 6.62 + <ClCompile Include="src\vr\vr_null.c"> 6.63 + <Filter>src\vr</Filter> 6.64 </ClCompile> 6.65 </ItemGroup> 6.66 <ItemGroup> 6.67 <ClInclude Include="src\camera.h"> 6.68 - <Filter>Header Files</Filter> 6.69 + <Filter>src</Filter> 6.70 + </ClInclude> 6.71 + <ClInclude Include="src\game.h"> 6.72 + <Filter>src</Filter> 6.73 + </ClInclude> 6.74 + <ClInclude Include="src\image.h"> 6.75 + <Filter>src</Filter> 6.76 + </ClInclude> 6.77 + <ClInclude Include="src\opengl.h"> 6.78 + <Filter>src</Filter> 6.79 </ClInclude> 6.80 <ClInclude Include="src\sdr.h"> 6.81 - <Filter>Header Files</Filter> 6.82 - </ClInclude> 6.83 - <ClInclude Include="src\opengl.h"> 6.84 - <Filter>Header Files</Filter> 6.85 - </ClInclude> 6.86 - <ClInclude Include="src\game.h"> 6.87 - <Filter>Header Files</Filter> 6.88 - </ClInclude> 6.89 - <ClInclude Include="src\image.h"> 6.90 - <Filter>Header Files</Filter> 6.91 + <Filter>src</Filter> 6.92 </ClInclude> 6.93 <ClInclude Include="src\texture.h"> 6.94 - <Filter>Header Files</Filter> 6.95 + <Filter>src</Filter> 6.96 + </ClInclude> 6.97 + <ClInclude Include="src\vr\vr.h"> 6.98 + <Filter>src\vr</Filter> 6.99 + </ClInclude> 6.100 + <ClInclude Include="src\vr\vr_impl.h"> 6.101 + <Filter>src\vr</Filter> 6.102 </ClInclude> 6.103 </ItemGroup> 6.104 </Project> 6.105 \ No newline at end of file