From b7d89ff02be212aca590f8b2b5d023df7b3da8cf Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 1 Feb 2022 23:35:05 +0000 Subject: [PATCH] Multiple changes - Weapon alignment values courtesy of SkillFur (thanks!) - Lightning gun now renders lightning in the correct direction - Many cvar changes - Rail Gun and Rocket Launcher use newer implementation - Changed projection so that UI elements draw clearer - Made scoreboards easier to read but HUD slightly closer --- android/app/src/main/cpp/main.cpp | 7 ++++--- code/cgame/cg_draw.c | 8 ++++---- code/cgame/cg_drawtools.c | 16 +++++++++++++--- code/cgame/cg_event.c | 4 ++++ code/cgame/cg_local.h | 5 +++++ code/cgame/cg_main.c | 12 ++++++------ code/cgame/cg_scoreboard.c | 13 +++++++++++-- code/cgame/cg_weapons.c | 25 ++++++++++++++++--------- code/renderercommon/tr_public.h | 2 +- code/renderergl2/tr_backend.c | 7 +++++-- code/renderergl2/tr_cmds.c | 31 +++++-------------------------- code/renderergl2/tr_init.c | 14 +++++++------- code/renderergl2/tr_local.h | 8 ++------ code/renderergl2/tr_main.c | 7 +++++-- code/sdl/sdl_glimp.c | 2 +- code/vr/vr_base.c | 26 +++++++++++++++----------- code/vr/vr_clientinfo.h | 2 +- code/vr/vr_input.c | 4 ++-- code/vr/vr_renderer.c | 25 +++++++++++++++++-------- code/vr/vr_renderer.h | 2 +- 20 files changed, 125 insertions(+), 95 deletions(-) diff --git a/android/app/src/main/cpp/main.cpp b/android/app/src/main/cpp/main.cpp index a8a9dec1..6b9803dd 100644 --- a/android/app/src/main/cpp/main.cpp +++ b/android/app/src/main/cpp/main.cpp @@ -65,14 +65,17 @@ int main(int argc, char* argv[]) { engine_t* engine = nullptr; engine = VR_Init(java); + //sleep(30); + //First set up resolution cached values int width, height; - VR_GetRsolution( engine, &width, &height ); + VR_GetResolution( engine, &width, &height ); CON_LogcatFn(&ioq3_logfn); std::string defaultArgs("+set fs_basepath "); defaultArgs += SDL_AndroidGetExternalStoragePath(); +// defaultArgs += " +set fs_game baseq3 +map q3dm6"; defaultArgs += " +set fs_game baseq3"; char* args = new char[defaultArgs.length() + 1]; @@ -84,8 +87,6 @@ int main(int argc, char* argv[]) { VR_EnterVR(engine, java); - //sleep(20); - while (1) { SDL_Event event; while (SDL_PollEvent(&event)) { diff --git a/code/cgame/cg_draw.c b/code/cgame/cg_draw.c index 51dc6226..8129a001 100644 --- a/code/cgame/cg_draw.c +++ b/code/cgame/cg_draw.c @@ -270,18 +270,18 @@ CG_Draw3DModel ================ */ -extern int hudflags; void CG_Draw3DModel( float x, float y, float w, float h, qhandle_t model, qhandle_t skin, vec3_t origin, vec3_t angles ) { refdef_t refdef; refEntity_t ent; + if ( !cg_draw3dIcons.integer || !cg_drawIcons.integer ) { return; } - hudflags = HUD_FLAGS_DRAWMODEL; + CG_SetHUDFlags(HUD_FLAGS_DRAWMODEL); CG_AdjustFrom640( &x, &y, &w, &h ); - hudflags = 0; + CG_RemoveHUDFlags(HUD_FLAGS_DRAWMODEL); memset( &refdef, 0, sizeof( refdef ) ); @@ -2681,7 +2681,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) { cg.refdef.vieworg[2] -= PLAYER_HEIGHT; cg.refdef.vieworg[2] += cgVR->hmdposition[1] * worldscale; - if (!cgVR->fullscreen) { + if (!cgVR->virtual_screen) { VectorMA(cg.refdef.vieworg, -separation, cg.refdef.viewaxis[1], cg.refdef.vieworg); } diff --git a/code/cgame/cg_drawtools.c b/code/cgame/cg_drawtools.c index f8a35b2f..3a9cbafd 100644 --- a/code/cgame/cg_drawtools.c +++ b/code/cgame/cg_drawtools.c @@ -28,6 +28,16 @@ int hudflags = 0; stereoFrame_t hudStereoView = STEREO_CENTER; extern vr_clientinfo_t* cgVR; +void CG_SetHUDFlags(int flags) +{ + hudflags |= flags; +} + +void CG_RemoveHUDFlags(int flags) +{ + hudflags &= ~flags; +} + /* ================ CG_AdjustFrom640 @@ -38,7 +48,7 @@ Adjusted for resolution and screen aspect ratio void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) { if (hudflags & HUD_FLAGS_FULLSCREEN || - cgVR->fullscreen) + cgVR->virtual_screen) { // scale for screen sizes *x *= cgs.screenXScale; @@ -49,9 +59,9 @@ void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) { else // scale to clearly visible portion of VR screen { float screenXScale = cgs.screenXScale / 2.75f; - float screenYScale = cgs.screenYScale / 2.75f; + float screenYScale = cgs.screenYScale / 2.25f; - int xoffset = -80; + int xoffset = (hudflags & HUD_FLAGS_SCOREBOARD) ? -24 : -60; if (hudStereoView == STEREO_LEFT) { xoffset *= -1; } diff --git a/code/cgame/cg_event.c b/code/cgame/cg_event.c index 131be742..4af4d517 100644 --- a/code/cgame/cg_event.c +++ b/code/cgame/cg_event.c @@ -986,10 +986,14 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { if(es->clientNum == cg.snap->ps.clientNum && !cg.renderingThirdPerson) { + vec3_t angles; + CG_CalculateVRWeaponPosition(es->origin2, angles); + /* if(cg_drawGun.integer == 2) VectorMA(es->origin2, 8, cg.refdef.viewaxis[1], es->origin2); else if(cg_drawGun.integer == 3) VectorMA(es->origin2, 4, cg.refdef.viewaxis[1], es->origin2); + */ } CG_RailTrail(ci, es->origin2, es->pos.trBase); diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 582342ba..b2ceb930 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -93,6 +93,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA //VR HUD #define HUD_FLAGS_FULLSCREEN 1 #define HUD_FLAGS_DRAWMODEL 2 +#define HUD_FLAGS_SCOREBOARD 4 typedef enum { FOOTSTEP_NORMAL, @@ -1239,6 +1240,8 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo // // cg_drawtools.c // +void CG_SetHUDFlags(int flags); +void CG_RemoveHUDFlags(int flags); void CG_AdjustFrom640( float *x, float *y, float *w, float *h ); void CG_FillRect( float x, float y, float width, float height, const float *color ); void CG_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); @@ -1360,6 +1363,8 @@ void CG_NextWeapon_f( void ); void CG_PrevWeapon_f( void ); void CG_Weapon_f( void ); +void CG_CalculateVRWeaponPosition( vec3_t origin, vec3_t angles ); + void CG_RegisterWeapon( int weaponNum ); void CG_RegisterItemVisuals( int itemNum ); diff --git a/code/cgame/cg_main.c b/code/cgame/cg_main.c index 2f95bc65..1e1810f8 100644 --- a/code/cgame/cg_main.c +++ b/code/cgame/cg_main.c @@ -234,10 +234,10 @@ static cvarTable_t cvarTable[] = { { &cg_draw3dIcons, "cg_draw3dIcons", "1", CVAR_ARCHIVE }, { &cg_drawIcons, "cg_drawIcons", "1", CVAR_ARCHIVE }, { &cg_drawAmmoWarning, "cg_drawAmmoWarning", "1", CVAR_ARCHIVE }, - { &cg_drawAttacker, "cg_drawAttacker", "1", CVAR_ARCHIVE }, + { &cg_drawAttacker, "cg_drawAttacker", "0", CVAR_ARCHIVE }, { &cg_drawCrosshair, "cg_drawCrosshair", "4", CVAR_ARCHIVE }, - { &cg_drawCrosshairNames, "cg_drawCrosshairNames", "1", CVAR_ARCHIVE }, - { &cg_drawRewards, "cg_drawRewards", "1", CVAR_ARCHIVE }, + { &cg_drawCrosshairNames, "cg_drawCrosshairNames", "0", CVAR_ARCHIVE }, + { &cg_drawRewards, "cg_drawRewards", "0", CVAR_ARCHIVE }, { &cg_crosshairSize, "cg_crosshairSize", "24", CVAR_ARCHIVE }, { &cg_crosshairHealth, "cg_crosshairHealth", "1", CVAR_ARCHIVE }, { &cg_crosshairX, "cg_crosshairX", "0", CVAR_ARCHIVE }, @@ -328,10 +328,10 @@ static cvarTable_t cvarTable[] = { { &cg_noTaunt, "cg_noTaunt", "0", CVAR_ARCHIVE}, #endif { &cg_noProjectileTrail, "cg_noProjectileTrail", "0", CVAR_ARCHIVE}, - { &cg_oldRail, "cg_oldRail", "1", CVAR_ARCHIVE}, - { &cg_oldRocket, "cg_oldRocket", "1", CVAR_ARCHIVE}, + { &cg_oldRail, "cg_oldRail", "0", CVAR_ARCHIVE}, + { &cg_oldRocket, "cg_oldRocket", "0", CVAR_ARCHIVE}, { &cg_oldPlasma, "cg_oldPlasma", "1", CVAR_ARCHIVE}, - { &cg_trueLightning, "cg_trueLightning", "0.0", CVAR_ARCHIVE} + { &cg_trueLightning, "cg_trueLightning", "0.2", CVAR_ARCHIVE} // { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE } }; diff --git a/code/cgame/cg_scoreboard.c b/code/cgame/cg_scoreboard.c index ae4c6081..29d3db16 100644 --- a/code/cgame/cg_scoreboard.c +++ b/code/cgame/cg_scoreboard.c @@ -239,6 +239,8 @@ static int CG_TeamScoreboard( int y, team_t team, float fade, int maxClients, in color[0] = color[1] = color[2] = 1.0; color[3] = fade; + CG_SetHUDFlags(HUD_FLAGS_SCOREBOARD); + count = 0; for ( i = 0 ; i < cg.numScores && count < maxClients ; i++ ) { score = &cg.scores[i]; @@ -253,6 +255,8 @@ static int CG_TeamScoreboard( int y, team_t team, float fade, int maxClients, in count++; } + CG_RemoveHUDFlags(HUD_FLAGS_SCOREBOARD); + return count; } @@ -304,8 +308,9 @@ qboolean CG_DrawOldScoreboard( void ) { fade = *fadeColor; } + CG_SetHUDFlags(HUD_FLAGS_SCOREBOARD); - // fragged by ... line + // fragged by ... line if ( cg.killerName[0] ) { s = va("Fragged by %s", cg.killerName ); w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; @@ -418,6 +423,8 @@ qboolean CG_DrawOldScoreboard( void ) { CG_LoadDeferredPlayers(); } + CG_RemoveHUDFlags(HUD_FLAGS_SCOREBOARD); + return qtrue; } @@ -457,6 +464,8 @@ void CG_DrawTourneyScoreboard( void ) { int y; int i; + CG_SetHUDFlags(HUD_FLAGS_SCOREBOARD); + // request more scores regularly if ( cg.scoresRequestTime + 2000 < cg.time ) { cg.scoresRequestTime = cg.time; @@ -529,6 +538,6 @@ void CG_DrawTourneyScoreboard( void ) { } } - + CG_RemoveHUDFlags(HUD_FLAGS_SCOREBOARD); } diff --git a/code/cgame/cg_weapons.c b/code/cgame/cg_weapons.c index 4e9a5578..2b765e65 100644 --- a/code/cgame/cg_weapons.c +++ b/code/cgame/cg_weapons.c @@ -1268,7 +1268,7 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { /* int i; for (i = 0; i < 3; i++) { - float a = cent->lerpAngles[i] - cg.refdefViewAngles[i]; + float a = cent->lerpAngles[i] - angle[i]; if (a > 180) { a -= 360; } @@ -1276,7 +1276,7 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { a += 360; } - angle[i] = cg.refdefViewAngles[i] + a * (1.0 - cg_trueLightning.value); + angle[i] = angle[i] + a * (1.0 - cg_trueLightning.value); if (angle[i] < 0) { angle[i] += 360; } @@ -1289,17 +1289,24 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { VectorCopy(cent->lerpOrigin, muzzlePoint ); // VectorCopy(cg.refdef.vieworg, muzzlePoint ); } else { + vec3_t angle; + vec3_t dummy; + + CG_CalculateVRWeaponPosition(dummy, angle); + // !CPMA - AngleVectors( cent->lerpAngles, forward, NULL, NULL ); + AngleVectors( angle, forward, NULL, NULL ); VectorCopy(cent->lerpOrigin, muzzlePoint ); } - anim = cent->currentState.legsAnim & ~ANIM_TOGGLEBIT; - if ( anim == LEGS_WALKCR || anim == LEGS_IDLECR ) { - muzzlePoint[2] += CROUCH_VIEWHEIGHT; - } else { - muzzlePoint[2] += DEFAULT_VIEWHEIGHT; - } + if (cent->currentState.number != cg.predictedPlayerState.clientNum) { + anim = cent->currentState.legsAnim & ~ANIM_TOGGLEBIT; + if (anim == LEGS_WALKCR || anim == LEGS_IDLECR) { + muzzlePoint[2] += CROUCH_VIEWHEIGHT; + } else { + muzzlePoint[2] += DEFAULT_VIEWHEIGHT; + } + } VectorMA( muzzlePoint, 14, forward, muzzlePoint ); diff --git a/code/renderercommon/tr_public.h b/code/renderercommon/tr_public.h index 83491ff3..1fcc355d 100644 --- a/code/renderercommon/tr_public.h +++ b/code/renderercommon/tr_public.h @@ -90,7 +90,7 @@ typedef struct { void (*EndFrame)( int *frontEndMsec, int *backEndMsec ); #if __ANDROID__ - void (*SetVRHeadsetParms)( const ovrTracking2* ovrTracking, int renderBufferL, int renderBufferR ); + void (*SetVRHeadsetParms)( const ovrMatrix4f *projectionMatrix, int renderBufferL, int renderBufferR ); #endif int (*MarkFragments)( int numPoints, const vec3_t *points, const vec3_t projection, diff --git a/code/renderergl2/tr_backend.c b/code/renderergl2/tr_backend.c index 20753184..d5a5578f 100644 --- a/code/renderergl2/tr_backend.c +++ b/code/renderergl2/tr_backend.c @@ -276,7 +276,8 @@ void GL_SetProjectionMatrix(mat4_t matrix) void GL_SetModelviewMatrix(mat4_t matrix, qboolean applyStereoView) { - if (qfalse) //applyStereoView) + /* + if (applyStereoView) { if (tr.refdef.stereoFrame == STEREO_LEFT) { Mat4Multiply(tr.vrParms.viewL, matrix, glState.modelview); @@ -285,7 +286,9 @@ void GL_SetModelviewMatrix(mat4_t matrix, qboolean applyStereoView) } else { Mat4Copy(matrix, glState.modelview); } - } else { + } else + */ + { Mat4Copy(matrix, glState.modelview); } diff --git a/code/renderergl2/tr_cmds.c b/code/renderergl2/tr_cmds.c index 8c48fd1b..59b0e383 100644 --- a/code/renderergl2/tr_cmds.c +++ b/code/renderergl2/tr_cmds.c @@ -584,32 +584,11 @@ void R_Mat4Transpose( const float in[4][4], float* out ) { } -void RE_SetVRHeadsetParms( const ovrTracking2* tracking, int renderBufferL, int renderBufferR ) { - if (tracking) { - R_Mat4Transpose(tracking->Eye[0].ProjectionMatrix.M, tr.vrParms.projectionL); - R_Mat4Transpose(tracking->Eye[1].ProjectionMatrix.M, tr.vrParms.projectionR); - - /* - R_Mat4Transpose(tracking->Eye[0].ViewMatrix.M, tr.vrParms.viewL); - R_Mat4Transpose(tracking->Eye[1].ViewMatrix.M, tr.vrParms.viewR); - - const float worldToMeter = 37.0f; // https://quakewiki.org/wiki/unit, assume 25 units is 1 meter. - tr.vrParms.viewL[12] *= worldToMeter; - tr.vrParms.viewL[13] *= worldToMeter; - tr.vrParms.viewL[14] *= worldToMeter; - tr.vrParms.viewR[12] *= worldToMeter; - tr.vrParms.viewR[13] *= worldToMeter; - tr.vrParms.viewR[14] *= worldToMeter; - - */ - - tr.vrParms.renderBufferL = renderBufferL; - tr.vrParms.renderBufferR = renderBufferR; - - tr.vrParms.valid = qtrue; - } else { - tr.vrParms.valid = qfalse; - } +void RE_SetVRHeadsetParms( const ovrMatrix4f *projectionMatrix, int renderBufferL, int renderBufferR ) { + R_Mat4Transpose(projectionMatrix->M, tr.vrParms.projection); + tr.vrParms.renderBufferL = renderBufferL; + tr.vrParms.renderBufferR = renderBufferR; + tr.vrParms.valid = qtrue; } //#endif diff --git a/code/renderergl2/tr_init.c b/code/renderergl2/tr_init.c index fd52e1b7..45948997 100644 --- a/code/renderergl2/tr_init.c +++ b/code/renderergl2/tr_init.c @@ -1215,15 +1215,15 @@ void R_Register( void ) r_customwidth = ri.Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE | CVAR_LATCH ); r_customheight = ri.Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE | CVAR_LATCH ); r_customPixelAspect = ri.Cvar_Get( "r_customPixelAspect", "1", CVAR_ARCHIVE | CVAR_LATCH ); - r_simpleMipMaps = ri.Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE | CVAR_LATCH ); - r_vertexLight = ri.Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE | CVAR_LATCH ); + r_simpleMipMaps = ri.Cvar_Get( "r_simpleMipMaps", "0", CVAR_ARCHIVE | CVAR_LATCH ); + r_vertexLight = ri.Cvar_Get( "r_vertexLight", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_uiFullScreen = ri.Cvar_Get( "r_uifullscreen", "0", 0); r_subdivisions = ri.Cvar_Get ("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH); r_stereoEnabled = ri.Cvar_Get( "r_stereoEnabled", "0", CVAR_ARCHIVE | CVAR_LATCH); r_greyscale = ri.Cvar_Get("r_greyscale", "0", CVAR_ARCHIVE | CVAR_LATCH); ri.Cvar_CheckRange(r_greyscale, 0, 1, qfalse); - r_externalGLSL = ri.Cvar_Get( "r_externalGLSL", "0", CVAR_LATCH ); + r_externalGLSL = ri.Cvar_Get( "r_externalGLSL", "1", CVAR_LATCH ); r_hdr = ri.Cvar_Get( "r_hdr", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_floatLightmap = ri.Cvar_Get( "r_floatLightmap", "0", CVAR_ARCHIVE | CVAR_LATCH ); @@ -1297,8 +1297,8 @@ void R_Register( void ) // archived variables that can change at any time // r_lodCurveError = ri.Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE|CVAR_CHEAT ); - r_lodbias = ri.Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE ); - r_flares = ri.Cvar_Get ("r_flares", "0", CVAR_ARCHIVE ); + r_lodbias = ri.Cvar_Get( "r_lodbias", "-1", CVAR_ARCHIVE ); + r_flares = ri.Cvar_Get ("r_flares", "1", CVAR_ARCHIVE ); r_znear = ri.Cvar_Get( "r_znear", "4", CVAR_CHEAT ); ri.Cvar_CheckRange( r_znear, 0.001f, 200, qfalse ); r_zproj = ri.Cvar_Get( "r_zproj", "64", CVAR_ARCHIVE ); @@ -1307,8 +1307,8 @@ void R_Register( void ) r_fastsky = ri.Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE ); r_inGameVideo = ri.Cvar_Get( "r_inGameVideo", "1", CVAR_ARCHIVE ); r_drawSun = ri.Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE ); - r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE ); - r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "1", CVAR_ARCHIVE ); + r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "0", CVAR_ARCHIVE ); + r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "0", CVAR_ARCHIVE ); r_finish = ri.Cvar_Get ("r_finish", "0", CVAR_ARCHIVE); r_textureMode = ri.Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR", CVAR_ARCHIVE ); r_swapInterval = ri.Cvar_Get( "r_swapInterval", "0", diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index b46f2198..624da15f 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -841,13 +841,9 @@ typedef struct { typedef struct { qboolean valid; - float projectionL[16]; - float projectionR[16]; - float viewL[16]; - float viewR[16]; + float projection[16]; int renderBufferL; int renderBufferR; - int renderBufferOriginal; } vrParms_t; @@ -2508,7 +2504,7 @@ void RE_StretchPic ( float x, float y, float w, float h, void RE_BeginFrame( stereoFrame_t stereoFrame ); void RE_EndFrame( int *frontEndMsec, int *backEndMsec ); #if __ANDROID__ -void RE_SetVRHeadsetParms( const ovrTracking2* ovrTracking, int renderBufferL, int renderBufferR ); +void RE_SetVRHeadsetParms( const ovrMatrix4f *projectionMatrix, int renderBufferL, int renderBufferR ); #endif void RE_SaveJPG(char * filename, int quality, int image_width, int image_height, unsigned char *image_buffer, int padding); diff --git a/code/renderergl2/tr_main.c b/code/renderergl2/tr_main.c index e01f5aa1..e15ab040 100644 --- a/code/renderergl2/tr_main.c +++ b/code/renderergl2/tr_main.c @@ -72,7 +72,7 @@ qboolean R_CompareVert(srfVert_t * v1, srfVert_t * v2, qboolean checkST) ============= R_CalcTexDirs -Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html +Lengyel, Eric. �Computing Tangent Space Basis Vectors for an Arbitrary Mesh�. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html ============= */ void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2, @@ -104,7 +104,7 @@ void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2, ============= R_CalcTangentSpace -Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html +Lengyel, Eric. �Computing Tangent Space Basis Vectors for an Arbitrary Mesh�. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html ============= */ vec_t R_CalcTangentSpace(vec3_t tangent, vec3_t bitangent, const vec3_t normal, const vec3_t sdir, const vec3_t tdir) @@ -765,12 +765,15 @@ void R_SetupProjection(viewParms_t *dest, float zProj, float zFar, qboolean comp height = ymax - ymin; if (tr.vrParms.valid) { + memcpy(&dest->projectionMatrix, &tr.vrParms.projection, sizeof(dest->projectionMatrix)); + /* if (dest->stereoFrame == STEREO_LEFT) { memcpy(&dest->projectionMatrix, &tr.vrParms.projectionL, sizeof(dest->projectionMatrix)); } else { memcpy(&dest->projectionMatrix, &tr.vrParms.projectionR, sizeof(dest->projectionMatrix)); } + */ } else { /* * offset the view origin of the viewer for stereo rendering diff --git a/code/sdl/sdl_glimp.c b/code/sdl/sdl_glimp.c index ceae4302..a78efbaf 100644 --- a/code/sdl/sdl_glimp.c +++ b/code/sdl/sdl_glimp.c @@ -430,7 +430,7 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder, qbool ri.Printf (PRINT_ALL, "...setting mode %d:", mode ); - VR_GetRsolution(0, &glConfig.vidWidth, &glConfig.vidHeight); + VR_GetResolution(0, &glConfig.vidWidth, &glConfig.vidHeight); /* if (mode == -2) { diff --git a/code/vr/vr_base.c b/code/vr/vr_base.c index 4a143838..6e48dd9c 100644 --- a/code/vr/vr_base.c +++ b/code/vr/vr_base.c @@ -9,6 +9,8 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wstrict-prototypes" #include "../VrApi/Include/VrApi_Helpers.h" +#include "../VrApi/Include/VrApi.h" + #pragma clang diagnostic pop #include @@ -40,15 +42,17 @@ void VR_InitCvars( void ) vr_worldscale = Cvar_Get ("vr_worldscale", "32.0", CVAR_ARCHIVE); // Values are: scale,right,up,forward,pitch,yaw,roll - Cvar_Get ("vr_weapon_adjustment_1", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_2", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_3", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_4", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_5", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_6", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_7", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_8", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); - Cvar_Get ("vr_weapon_adjustment_9", "0.75,0,0,0,0,0,0", CVAR_ARCHIVE); + // VALUES PROVIDED BY SkillFur - Thank-you! + Cvar_Get ("vr_weapon_adjustment_1", "1,-4.0,7,-10,-20,-15,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_2", "0.8,-3.0,5.5,0,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_3", "0.7,-2.5,5.5,0,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_4", "0.75,-4.0,6.5,-4,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_5", "0.8,-3.8,6,7.5,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_6", "0.8,-3.3,6,7,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_7", "0.8,-3.3,6,0,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_8", "0.8,-3.5,6,1.5,0,0,0", CVAR_ARCHIVE); + Cvar_Get ("vr_weapon_adjustment_9", "0.8,-5.5,6,0,0,0,0", CVAR_ARCHIVE); + } void VR_Destroy( engine_t* engine ) @@ -85,8 +89,8 @@ engine_t* VR_GetEngine( void ) { bool VR_useScreenLayer( void ) { + int keyCatcher = Key_GetCatcher( ); return (bool)(clc.state != CA_ACTIVE || - ( Key_GetCatcher( ) & KEYCATCH_UI ) || - ( Key_GetCatcher( ) & KEYCATCH_CONSOLE )); + ( keyCatcher & (KEYCATCH_UI | KEYCATCH_CONSOLE) )); } //#endif diff --git a/code/vr/vr_clientinfo.h b/code/vr/vr_clientinfo.h index 2d7d5a55..9348a15a 100644 --- a/code/vr/vr_clientinfo.h +++ b/code/vr/vr_clientinfo.h @@ -8,7 +8,7 @@ typedef struct { qboolean weapon_stabilised; qboolean right_handed; - qboolean fullscreen; + qboolean virtual_screen; vec3_t hmdposition; vec3_t hmdposition_last; // Don't use this, it is just for calculating delta! diff --git a/code/vr/vr_input.c b/code/vr/vr_input.c index f2fb8b4b..2512fc48 100644 --- a/code/vr/vr_input.c +++ b/code/vr/vr_input.c @@ -240,7 +240,7 @@ static void IN_VRJoystick( qboolean isRightController, float joystickX, float jo rotateAboutOrigin(-vr.hmdposition_delta[0] * factor * multiplier, vr.hmdposition_delta[2] * factor * multiplier, - vr.hmdorientation[YAW], positional); - if (vr.fullscreen) + if (vr.virtual_screen) { const float x = joystickX * 4.0; const float y = joystickY * -4.0; @@ -380,7 +380,7 @@ void IN_VRInputFrame( void ) result = vrapi_SetClockLevels(VR_GetEngine()->ovr, 4, 4); assert(result == VRAPI_INITIALIZE_SUCCESS); - vr.fullscreen = VR_useScreenLayer(); + vr.virtual_screen = VR_useScreenLayer(); { // We extract Yaw, Pitch, Roll instead of directly using the orientation diff --git a/code/vr/vr_renderer.c b/code/vr/vr_renderer.c index 2572c9ea..3941731a 100644 --- a/code/vr/vr_renderer.c +++ b/code/vr/vr_renderer.c @@ -4,6 +4,7 @@ #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" #include "../client/client.h" +#include "../VrApi/Include/VrApi_Types.h" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wstrict-prototypes" @@ -33,15 +34,15 @@ void APIENTRY VR_GLDebugLog(GLenum source, GLenum type, GLuint id, } } -void VR_GetRsolution(engine_t* engine, int *pWidth, int *pHeight) +void VR_GetResolution(engine_t* engine, int *pWidth, int *pHeight) { static int width = 0; static int height = 0; if (engine) { - *pWidth = width = vrapi_GetSystemPropertyInt(&engine->java, VRAPI_SYS_PROP_SUGGESTED_EYE_TEXTURE_WIDTH) * SUPER_SAMPLE; - *pHeight = height = vrapi_GetSystemPropertyInt(&engine->java, VRAPI_SYS_PROP_SUGGESTED_EYE_TEXTURE_HEIGHT) * SUPER_SAMPLE; + *pHeight = height = *pWidth = width = vrapi_GetSystemPropertyInt(&engine->java, VRAPI_SYS_PROP_SUGGESTED_EYE_TEXTURE_WIDTH) * SUPER_SAMPLE; + //*pHeight = height = vrapi_GetSystemPropertyInt(&engine->java, VRAPI_SYS_PROP_SUGGESTED_EYE_TEXTURE_HEIGHT) * SUPER_SAMPLE; } else { @@ -58,7 +59,7 @@ void VR_InitRenderer( engine_t* engine ) { #endif int eyeW, eyeH; - VR_GetRsolution(engine, &eyeW, &eyeH); + VR_GetResolution(engine, &eyeW, &eyeH); for (int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; ++eye) { framebuffer_t* framebuffer = &engine->framebuffers[eye]; @@ -205,13 +206,20 @@ void VR_DrawFrame( engine_t* engine ) { engine->predictedDisplayTime = vrapi_GetPredictedDisplayTime(engine->ovr, engine->frameIndex); engine->tracking = vrapi_GetPredictedTracking2(engine->ovr, engine->predictedDisplayTime); + //Now using a symmetrical render target, based on the horizontal FOV + float fov = vrapi_GetSystemPropertyInt( engine->ovr, VRAPI_SYS_PROP_SUGGESTED_EYE_FOV_DEGREES_Y); + + // Setup the projection matrix. + const ovrMatrix4f projectionMatrix = ovrMatrix4f_CreateProjectionFov( + fov, fov, 0.0f, 0.0f, 1.0f, 0.0f ); + if (VR_useScreenLayer()) { static ovrLayer_Union2 cylinderLayer; memset( &cylinderLayer, 0, sizeof( ovrLayer_Union2 ) ); int eyeW, eyeH; - VR_GetRsolution(engine, &eyeW, &eyeH); + VR_GetResolution(engine, &eyeW, &eyeH); // Add a simple cylindrical layer cylinderLayer.Cylinder = @@ -231,7 +239,7 @@ void VR_DrawFrame( engine_t* engine ) { frameDesc.Layers = layers; const framebuffer_t* framebuffers = engine->framebuffers; - re.SetVRHeadsetParms(&engine->tracking, + re.SetVRHeadsetParms(&projectionMatrix, framebuffers[0].framebuffers[framebuffers[0].swapchainIndex], framebuffers[1].framebuffers[framebuffers[1].swapchainIndex]); Com_Frame(); @@ -252,11 +260,12 @@ void VR_DrawFrame( engine_t* engine ) { for (int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; ++eye) { layer.Textures[eye].ColorSwapChain = engine->framebuffers[eye].colorTexture; layer.Textures[eye].SwapChainIndex = engine->framebuffers[eye].swapchainIndex; - layer.Textures[eye].TexCoordsFromTanAngles = ovrMatrix4f_TanAngleMatrixFromProjection(&engine->tracking.Eye[eye].ProjectionMatrix); + layer.Textures[eye].TexCoordsFromTanAngles = ovrMatrix4f_TanAngleMatrixFromProjection(&projectionMatrix); } + const framebuffer_t* framebuffers = engine->framebuffers; - re.SetVRHeadsetParms(&engine->tracking, + re.SetVRHeadsetParms(&projectionMatrix, framebuffers[0].framebuffers[framebuffers[0].swapchainIndex], framebuffers[1].framebuffers[framebuffers[1].swapchainIndex]); Com_Frame(); diff --git a/code/vr/vr_renderer.h b/code/vr/vr_renderer.h index 3544f094..4e053fb2 100644 --- a/code/vr/vr_renderer.h +++ b/code/vr/vr_renderer.h @@ -5,7 +5,7 @@ #include "vr_types.h" -void VR_GetRsolution( engine_t* engine, int *pWidth, int *pHeight ); +void VR_GetResolution( engine_t* engine, int *pWidth, int *pHeight ); void VR_InitRenderer( engine_t* engine ); void VR_DestroyRenderer( engine_t* engine ); void VR_DrawFrame( engine_t* engine );