diff --git a/android/app/src/main/cpp/code/cgame/cg_draw.c b/android/app/src/main/cpp/code/cgame/cg_draw.c index 4af3137b..e4497919 100644 --- a/android/app/src/main/cpp/code/cgame/cg_draw.c +++ b/android/app/src/main/cpp/code/cgame/cg_draw.c @@ -2912,12 +2912,12 @@ void CG_DrawActive( void ) { static float hmd_yaw_y = 1.0f; static float prevPitch = 0.0f; { - hmd_yaw_x = 0.98f * hmd_yaw_x + 0.02f * cosf(DEG2RAD(vr->hmdorientation[YAW])); - hmd_yaw_y = 0.98f * hmd_yaw_y + 0.02f * sinf(DEG2RAD(vr->hmdorientation[YAW])); + hmd_yaw_x = 0.97f * hmd_yaw_x + 0.03f * cosf(DEG2RAD(vr->hmdorientation[YAW])); + hmd_yaw_y = 0.97f * hmd_yaw_y + 0.03f * sinf(DEG2RAD(vr->hmdorientation[YAW])); } angles[YAW] = viewYaw + RAD2DEG(atan2(hmd_yaw_y, hmd_yaw_x)); - angles[PITCH] = 0.98f * prevPitch + 0.02f * vr->hmdorientation[PITCH]; + angles[PITCH] = 0.97f * prevPitch + 0.03f * vr->hmdorientation[PITCH]; prevPitch = angles[PITCH]; angles[ROLL] = 0; AngleVectors(angles, forward, right, up); @@ -2953,7 +2953,7 @@ void CG_DrawActive( void ) { cg.drawingHUD = qtrue; //Tell renderer we want to draw to the HUD buffer - trap_R_HUDBufferStart(); + trap_R_HUDBufferStart(qtrue); // draw status bar and other floating elements CG_DrawHUD2D(); diff --git a/android/app/src/main/cpp/code/cgame/cg_drawtools.c b/android/app/src/main/cpp/code/cgame/cg_drawtools.c index 15d5ee7a..517690de 100644 --- a/android/app/src/main/cpp/code/cgame/cg_drawtools.c +++ b/android/app/src/main/cpp/code/cgame/cg_drawtools.c @@ -46,24 +46,24 @@ Adjusted for resolution and screen aspect ratio */ void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) { - if ( trap_Cvar_VariableValue("vr_hudDrawStatus") != 2.0f || + //If using floating HUD and we are drawing it, then no need to scale as the HUD + //buffer is 640x480 + float screenXScale = cgs.screenXScale; + float screenYScale = cgs.screenYScale; + if ( trap_Cvar_VariableValue("vr_hudDrawStatus") == 1.0f && + cg.drawingHUD) + { + screenXScale = 1.0f; + screenYScale = 1.0f; + } + + if ( trap_Cvar_VariableValue("vr_hudDrawStatus") != 2.0f || !cg.drawingHUD) { - // scale for screen sizes - *x *= cgs.screenXScale; - *y *= cgs.screenYScale; - if (hudflags & HUD_FLAGS_DRAWMODEL) - { - *w *= (cgs.screenXScale * 4.0f); - *x -= (*w / 3); - *h *= (cgs.screenYScale * 4.0f); - *y -= (*h / 3); - } - else - { - *w *= cgs.screenXScale; - *h *= cgs.screenYScale; - } + *x *= screenXScale; + *y *= screenYScale; + *w *= screenXScale; + *h *= screenYScale; } else // scale to clearly visible portion of VR screen { @@ -74,9 +74,9 @@ void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) *y *= screenYScale; if (hudflags & HUD_FLAGS_DRAWMODEL) { - *w *= (cgs.screenXScale * 2.0f); + *w *= (screenXScale * 2.0f); *x -= (*w / 3); - *h *= (cgs.screenYScale * 2.0f); + *h *= (screenYScale * 2.0f); *y -= (*h / 3); } else diff --git a/android/app/src/main/cpp/code/cgame/cg_local.h b/android/app/src/main/cpp/code/cgame/cg_local.h index 7e995881..3e77a032 100644 --- a/android/app/src/main/cpp/code/cgame/cg_local.h +++ b/android/app/src/main/cpp/code/cgame/cg_local.h @@ -1662,7 +1662,7 @@ int trap_R_LerpTag( orientation_t *tag, clipHandle_t mod, int startFrame, int void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ); qboolean trap_R_inPVS( const vec3_t p1, const vec3_t p2 ); -void trap_R_HUDBufferStart( void ); +void trap_R_HUDBufferStart( qboolean clear ); void trap_R_HUDBufferEnd( void ); // The glconfig_t will not change during the life of a cgame. diff --git a/android/app/src/main/cpp/code/cgame/cg_syscalls.c b/android/app/src/main/cpp/code/cgame/cg_syscalls.c index 046f0aef..491c7d27 100644 --- a/android/app/src/main/cpp/code/cgame/cg_syscalls.c +++ b/android/app/src/main/cpp/code/cgame/cg_syscalls.c @@ -288,8 +288,8 @@ void trap_R_RenderScene( const refdef_t *fd ) { syscall( CG_R_RENDERSCENE, fd ); } -void trap_R_HUDBufferStart( void ) { - syscall( CG_R_HUDBUFFER_START ); +void trap_R_HUDBufferStart( qboolean clear ) { + syscall( CG_R_HUDBUFFER_START, clear ); } void trap_R_HUDBufferEnd( void ) { diff --git a/android/app/src/main/cpp/code/client/cl_cgame.c b/android/app/src/main/cpp/code/client/cl_cgame.c index 4c3efbb5..4988e71c 100644 --- a/android/app/src/main/cpp/code/client/cl_cgame.c +++ b/android/app/src/main/cpp/code/client/cl_cgame.c @@ -698,7 +698,7 @@ intptr_t CL_CgameSystemCalls( intptr_t *args ) { VR_HapticEvent( VMA(1), args[2], args[3], args[4], VMF(5), VMF(6) ); return 0; case CG_R_HUDBUFFER_START: - re.HUDBufferStart(); + re.HUDBufferStart(args[1]); return 0; case CG_R_HUDBUFFER_END: re.HUDBufferEnd(); diff --git a/android/app/src/main/cpp/code/client/cl_console.c b/android/app/src/main/cpp/code/client/cl_console.c index cf633626..46daa361 100644 --- a/android/app/src/main/cpp/code/client/cl_console.c +++ b/android/app/src/main/cpp/code/client/cl_console.c @@ -580,6 +580,8 @@ void Con_DrawNotify (void) currentColor = 7; re.SetColor( g_color_table[currentColor] ); + re.HUDBufferStart(qfalse); + v = 0; for (i= con.current-NUM_CON_TIMES+1 ; i<=con.current ; i++) { @@ -613,6 +615,8 @@ void Con_DrawNotify (void) re.SetColor( NULL ); + re.HUDBufferEnd(); + if (Key_GetCatcher( ) & (KEYCATCH_UI | KEYCATCH_CGAME) ) { return; } diff --git a/android/app/src/main/cpp/code/client/cl_scrn.c b/android/app/src/main/cpp/code/client/cl_scrn.c index 25b0111a..2aa50fd7 100644 --- a/android/app/src/main/cpp/code/client/cl_scrn.c +++ b/android/app/src/main/cpp/code/client/cl_scrn.c @@ -25,6 +25,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../vr/vr_clientinfo.h" extern vr_clientinfo_t vr; +extern cvar_t *vr_hudDrawStatus; qboolean scr_initialized; // ready to draw @@ -74,7 +75,7 @@ void SCR_AdjustFrom640( float *x, float *y, float *w, float *h ) { xscale = cls.glconfig.vidWidth / 640.0; yscale = cls.glconfig.vidHeight / 480.0; - if (vr.virtual_screen) { + if (vr.virtual_screen || vr_hudDrawStatus->integer == 1) { if (x) { *x *= xscale; } diff --git a/android/app/src/main/cpp/code/renderercommon/tr_public.h b/android/app/src/main/cpp/code/renderercommon/tr_public.h index aedce471..4ee0ddba 100644 --- a/android/app/src/main/cpp/code/renderercommon/tr_public.h +++ b/android/app/src/main/cpp/code/renderercommon/tr_public.h @@ -75,7 +75,7 @@ typedef struct { void (*AddLightToScene)( const vec3_t org, float intensity, float r, float g, float b ); void (*AddAdditiveLightToScene)( const vec3_t org, float intensity, float r, float g, float b ); void (*RenderScene)( const refdef_t *fd ); - void (*HUDBufferStart)( void ); + void (*HUDBufferStart)( qboolean clear ); void (*HUDBufferEnd)( void ); void (*SetColor)( const float *rgba ); // NULL = 1,1,1,1 diff --git a/android/app/src/main/cpp/code/renderergles3/tr_backend.c b/android/app/src/main/cpp/code/renderergles3/tr_backend.c index 0ab9f269..31c26623 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_backend.c +++ b/android/app/src/main/cpp/code/renderergles3/tr_backend.c @@ -305,11 +305,19 @@ static void RB_Hyperspace( void ) { static void SetViewportAndScissor( void ) { GL_SetProjectionMatrix( backEnd.viewParms.projectionMatrix ); - // set the window clipping - qglViewport( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, - backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); - qglScissor( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, - backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight ); + if (glState.isDrawingHUD && vr_hudDrawStatus->integer == 1) + { + qglViewport(0, 0, tr.hudImage->width, tr.hudImage->height); + qglScissor(0, 0, tr.hudImage->width, tr.hudImage->height); + } + else + { + // set the window clipping + qglViewport(backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, + backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight); + qglScissor(backEnd.viewParms.viewportX, backEnd.viewParms.viewportY, + backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight); + } } /* @@ -628,8 +636,16 @@ void RB_SetGL2D (void) { } // set 2D virtual screen size - qglViewport( 0, 0, width, height ); - qglScissor( 0, 0, width, height ); + if (glState.isDrawingHUD && vr_hudDrawStatus->integer == 1) + { + qglViewport(0, 0, tr.hudImage->width, tr.hudImage->height); + qglScissor(0, 0, tr.hudImage->width, tr.hudImage->height); + } + else + { + qglViewport(0, 0, width, height); + qglScissor(0, 0, width, height); + } Mat4Ortho(0, width, height, 0, 0, 1, matrix); GL_SetProjectionMatrix(matrix); @@ -1770,7 +1786,7 @@ const void* RB_HUDBuffer( const void* data ) { if(tess.numIndexes) RB_EndSurface(); - if (cmd->start && tr.renderFbo->frameBuffer != tr.hudFbo->frameBuffer) + if (cmd->start && !glState.isDrawingHUD) { glState.isDrawingHUD = qtrue; @@ -1800,8 +1816,11 @@ const void* RB_HUDBuffer( const void* data ) { ri.Error("Error binding Framebuffer: %i\n", result); } - qglClearColor(0.0f, 0.0f, 0.0f, 0.0f); - qglClear(GL_COLOR_BUFFER_BIT); + if (cmd->clear) + { + qglClearColor(0.0f, 0.0f, 0.0f, 0.0f); + qglClear(GL_COLOR_BUFFER_BIT); + } } } else if (glState.isDrawingHUD) diff --git a/android/app/src/main/cpp/code/renderergles3/tr_cmds.c b/android/app/src/main/cpp/code/renderergles3/tr_cmds.c index 4841e10e..c2da0c84 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_cmds.c +++ b/android/app/src/main/cpp/code/renderergles3/tr_cmds.c @@ -474,7 +474,7 @@ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) { backEnd.pc.msec = 0; } -void RE_HUDBufferStart( void ) +void RE_HUDBufferStart( qboolean clear ) { hudBufferCommand_t *cmd; @@ -486,6 +486,7 @@ void RE_HUDBufferStart( void ) return; } cmd->start = qtrue; + cmd->clear = clear; cmd->commandId = RC_HUD_BUFFER; } diff --git a/android/app/src/main/cpp/code/renderergles3/tr_glsl.c b/android/app/src/main/cpp/code/renderergles3/tr_glsl.c index e435c9c9..97715263 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_glsl.c +++ b/android/app/src/main/cpp/code/renderergles3/tr_glsl.c @@ -68,8 +68,9 @@ typedef struct uniformInfo_s uniformInfo_t; typedef enum { - HUD_ORTHO_PROJECTION, // Orthographic projection and no stereo view - STEREO_ORTHO_PROJECTION, // Orthographic projection with a slight stereo offset per eye + FULLSCREEN_ORTHO_PROJECTION, // Orthographic projection and no stereo view for fullscreen rendering + HUDBUFFER_ORTHO_PROJECTION, // Orthographic projection and no stereo view for the HUD buffer + STEREO_ORTHO_PROJECTION, // Orthographic projection with a slight stereo offset per eye for the static hud VR_PROJECTION, MONO_VR_PROJECTION, @@ -207,7 +208,8 @@ static void GLSL_ViewMatricesUniformBuffer(const float eyeView[32], const float switch (i) { - case HUD_ORTHO_PROJECTION: + case FULLSCREEN_ORTHO_PROJECTION: + case HUDBUFFER_ORTHO_PROJECTION: { Mat4Identity( viewMatrices ); Mat4Identity( viewMatrices + 16 ); @@ -1670,6 +1672,7 @@ void GLSL_ShutdownGPUShaders(void) GLSL_DeleteGPUShader(&tr.depthBlurShader[i]); } + void GLSL_PrepareUniformBuffers(void) { int width, height; @@ -1687,16 +1690,22 @@ void GLSL_PrepareUniformBuffers(void) Mat4Ortho(0, width, height, 0, 0, 1, orthoProjectionMatrix); //ortho projection matrices - GLSL_ProjectionMatricesUniformBuffer(projectionMatricesBuffer[HUD_ORTHO_PROJECTION], + GLSL_ProjectionMatricesUniformBuffer(projectionMatricesBuffer[FULLSCREEN_ORTHO_PROJECTION], orthoProjectionMatrix); GLSL_ProjectionMatricesUniformBuffer(projectionMatricesBuffer[STEREO_ORTHO_PROJECTION], orthoProjectionMatrix); + float hudOrthoProjectionMatrix[16]; + Mat4Ortho(0, 640, 480, 0, 0, 1, hudOrthoProjectionMatrix); + GLSL_ProjectionMatricesUniformBuffer(projectionMatricesBuffer[HUDBUFFER_ORTHO_PROJECTION], + hudOrthoProjectionMatrix); + //VR projection matrix GLSL_ProjectionMatricesUniformBuffer(projectionMatricesBuffer[VR_PROJECTION], tr.vrParms.projection); + GLSL_ProjectionMatricesUniformBuffer(projectionMatricesBuffer[MONO_VR_PROJECTION], - tr.vrParms.projection); + tr.vrParms.projection); //Set all view matrices GLSL_ViewMatricesUniformBuffer(tr.viewParms.world.eyeViewMatrix, tr.viewParms.world.modelView); @@ -1720,18 +1729,23 @@ void GLSL_BindProgram(shaderProgram_t * program) static GLuint GLSL_CalculateProjection() { GLuint result = glState.isDrawingHUD ? MONO_VR_PROJECTION : VR_PROJECTION; - //If we are using an orthographic projection, then we don't need the mono VR projection - //as we aren't drawing models to the HUD if (Mat4Compare(&orthoProjectionMatrix, glState.projection)) { - if (glState.isDrawingHUD && vr_hudDrawStatus->integer == 2) - { - result = STEREO_ORTHO_PROJECTION; - } - else - { - result = HUD_ORTHO_PROJECTION; - } + if (glState.isDrawingHUD) + { + if (vr_hudDrawStatus->integer == 1) + { + result = HUDBUFFER_ORTHO_PROJECTION; + } + else + { + result = STEREO_ORTHO_PROJECTION; + } + } + else + { + result = FULLSCREEN_ORTHO_PROJECTION; + } } return result; diff --git a/android/app/src/main/cpp/code/renderergles3/tr_image.c b/android/app/src/main/cpp/code/renderergles3/tr_image.c index e1b7ed7e..2cad818a 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_image.c +++ b/android/app/src/main/cpp/code/renderergles3/tr_image.c @@ -2784,8 +2784,8 @@ void R_CreateBuiltinImages( void ) { tr.renderImage = R_CreateImage("_render", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, hdrFormat); - tr.hudImage = R_CreateImage("hudImage", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, rgbFormat); - tr.hudDepthImage = R_CreateImage("*hudDepth", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24); + tr.hudImage = R_CreateImage("hudImage", NULL, 640, 480, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, rgbFormat); + tr.hudDepthImage = R_CreateImage("*hudDepth", NULL, 640, 480, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24); if (r_shadowBlur->integer) tr.screenScratchImage = R_CreateImage("screenScratch", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, rgbFormat); diff --git a/android/app/src/main/cpp/code/renderergles3/tr_local.h b/android/app/src/main/cpp/code/renderergles3/tr_local.h index 6464736f..b7add767 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_local.h +++ b/android/app/src/main/cpp/code/renderergles3/tr_local.h @@ -2467,6 +2467,7 @@ typedef struct { typedef struct { int commandId; qboolean start; + qboolean clear; // Clear the buffer? } hudBufferCommand_t; typedef enum { @@ -2530,7 +2531,7 @@ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ); void RE_SetVRHeadsetParms( const ovrMatrix4f *projectionMatrix, int renderBuffer ); #endif -void RE_HUDBufferStart( void ); +void RE_HUDBufferStart( qboolean clear ); void RE_HUDBufferEnd( void ); void RE_SaveJPG(char * filename, int quality, int image_width, int image_height, diff --git a/android/app/src/main/cpp/code/renderergles3/tr_main.c b/android/app/src/main/cpp/code/renderergles3/tr_main.c index 6d0af253..8e6e542b 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_main.c +++ b/android/app/src/main/cpp/code/renderergles3/tr_main.c @@ -1717,7 +1717,8 @@ void R_RenderView (viewParms_t *parms) { // set viewParms.world R_RotateForViewer (); - GLSL_PrepareUniformBuffers(); + //can we get away without this?! + //GLSL_PrepareUniformBuffers(); R_SetupProjection(&tr.viewParms, r_zproj->value, tr.viewParms.zFar, qtrue); diff --git a/android/run.bat b/android/run.bat index 92980f50..5fab1bf5 100644 --- a/android/run.bat +++ b/android/run.bat @@ -2,7 +2,7 @@ setlocal -set BUILD_TYPE=release +set BUILD_TYPE=debug set VERSION=0.29.3-multiview @REM Define the following environment variables to sign a release build