diff --git a/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c b/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c index 4284058..eb01344 100644 --- a/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c +++ b/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c @@ -2081,7 +2081,11 @@ static float CG_CalculateWeaponPositionAndScale( playerState_t *ps, vec3_t origi AngleVectors( angles, forward, right, up ); VectorMA( origin, offset[2], forward, origin ); VectorMA( origin, offset[1], up, origin ); - VectorMA( origin, offset[0], right, origin ); + if (cgVR->right_handed) { + VectorMA(origin, offset[0], right, origin); + } else { + VectorMA(origin, -offset[0], right, origin); + } return scale; @@ -3477,16 +3481,16 @@ void CG_AddViewWeapon( playerState_t *ps ) { //Weapon offset debugging if (weaponDebugging) { - hand.renderfx = RF_FIRST_PERSON | RF_MINLIGHT; //No depth hack for weapon adjusting mode + hand.renderfx = RF_FIRST_PERSON | RF_MINLIGHT | RF_VIEWWEAPON; //No depth hack for weapon adjusting mode } else { - hand.renderfx = RF_DEPTHHACK | RF_FIRST_PERSON | RF_MINLIGHT; //----(SA) + hand.renderfx = RF_DEPTHHACK | RF_FIRST_PERSON | RF_MINLIGHT | RF_VIEWWEAPON; //----(SA) } //scale the whole model (hand and weapon) for ( int i = 0; i < 3; i++ ) { - VectorScale( hand.axis[i], scale, hand.axis[i] ); + VectorScale( hand.axis[i], (cgVR->right_handed || i != 1 || ps->weapon == WP_AKIMBO) ? scale : -scale, hand.axis[i] ); } diff --git a/Projects/Android/jni/rtcw/src/cgame/tr_types.h b/Projects/Android/jni/rtcw/src/cgame/tr_types.h index 7fcb3e2..62661b3 100644 --- a/Projects/Android/jni/rtcw/src/cgame/tr_types.h +++ b/Projects/Android/jni/rtcw/src/cgame/tr_types.h @@ -39,6 +39,7 @@ If you have questions concerning this license or the applicable additional terms #define RF_THIRD_PERSON 2 // don't draw through eyes, only mirrors (player bodies, chat sprites) #define RF_FIRST_PERSON 4 // only draw through eyes (view weapon, damage blood blob) #define RF_DEPTHHACK 8 // for view weapon Z crunching +#define RF_VIEWWEAPON 16 // specifically drawing the weapon model #define RF_NOSHADOW 64 // don't add stencil shadows #define RF_LIGHTING_ORIGIN 128 // use refEntity->lightingOrigin instead of refEntity->origin diff --git a/Projects/Android/jni/rtcw/src/renderer/tr_backend.c b/Projects/Android/jni/rtcw/src/renderer/tr_backend.c index 3b6aec8..7e14f7b 100644 --- a/Projects/Android/jni/rtcw/src/renderer/tr_backend.c +++ b/Projects/Android/jni/rtcw/src/renderer/tr_backend.c @@ -27,6 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #include "tr_local.h" +#include "../../../RTCWVR/VrClientInfo.h" backEndData_t *backEndData[SMP_FRAMES]; backEndState_t backEnd; @@ -888,12 +889,14 @@ void RB_ZombieFX( int part, drawSurf_t *drawSurf, int oldNumVerts, int oldNumInd RB_RenderDrawSurfList ================== */ +extern vr_client_info_t vr; void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { shader_t *shader, *oldShader; int fogNum, oldFogNum; int entityNum, oldEntityNum; int dlighted, oldDlighted; qboolean depthRange, oldDepthRange; + qboolean isLeftHandedWeapon, oldIsLeftHandedWeapon; int i; drawSurf_t *drawSurf; int oldSort; @@ -926,12 +929,17 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { oldDlighted = qfalse; oldSort = -1; depthRange = qfalse; + isLeftHandedWeapon = qfalse; + oldIsLeftHandedWeapon = qfalse; // GR - tessellation also forces to draw everything oldAtiTess = -1; + GLint oldFaceCullMode; + GLboolean oldFaceCullEnabled; - backEnd.pc.c_surfaces += numDrawSurfs; + backEnd.pc.c_surfaces += numDrawSurfs; for ( i = 0, drawSurf = drawSurfs ; i < numDrawSurfs ; i++, drawSurf++ ) { + if ( drawSurf->sort == oldSort ) { // fast path, same as previous sort oldNumVerts = tess.numVertexes; @@ -985,11 +993,12 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { oldAtiTess = atiTess; } - // + // // change the modelview matrix if needed // if ( entityNum != oldEntityNum ) { depthRange = qfalse; + isLeftHandedWeapon = qfalse; if ( entityNum != ENTITYNUM_WORLD ) { backEnd.currentEntity = &backEnd.refdef.entities[entityNum]; @@ -1011,6 +1020,10 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { // hack the depth range to prevent view model from poking into walls depthRange = qtrue; } + + if (backEnd.currentEntity->e.renderfx & RF_VIEWWEAPON) { + isLeftHandedWeapon = (!vr.right_handed); + } } else { backEnd.currentEntity = &tr.worldEntity; backEnd.refdef.floatTime = originalTime; @@ -1037,6 +1050,24 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { oldDepthRange = depthRange; } + if (isLeftHandedWeapon != oldIsLeftHandedWeapon) { + if (isLeftHandedWeapon) { + qglGetBooleanv(GL_CULL_FACE, &oldFaceCullEnabled); + qglGetIntegerv(GL_CULL_FACE_MODE, &oldFaceCullMode); + + qglEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + } else{ + if (!oldFaceCullEnabled) + { + qglDisable(GL_CULL_FACE); + } + qglCullFace( oldFaceCullMode ); + } + oldIsLeftHandedWeapon = isLeftHandedWeapon; + } + + oldEntityNum = entityNum; }