From 762d0160f1e887dddaf20125aedb6245bb2c464e Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 4 Aug 2019 08:25:37 +0100 Subject: [PATCH] Some CVAR changes - added a very rudimentary neck model (laughable) - Decreased the positional multiplier, seemed to be affecting movement too much, feels better to me now - stereo side rendering controller by a render info cvar, which can be used in the client dlls too now - Left handed control implementation --- Projects/Android/Android.iml | 14 + Projects/Android/AndroidManifest.xml | 4 +- .../jni/src/Lambda1VR/L1VR_SurfaceView.c | 14 +- Projects/Android/jni/src/Lambda1VR/VrCvars.h | 5 +- .../Android/jni/src/Lambda1VR/VrInputLeft.c | 559 ++++++++---------- .../src/Xash3D/xash3d/engine/client/cl_main.c | 11 +- .../src/Xash3D/xash3d/engine/client/cl_view.c | 4 +- .../Xash3D/xash3d/engine/client/gl_rmain.c | 8 +- .../src/Xash3D/xash3d/engine/common/common.h | 4 - .../src/Xash3D/xash3d/engine/common/host.c | 4 +- 10 files changed, 302 insertions(+), 325 deletions(-) diff --git a/Projects/Android/Android.iml b/Projects/Android/Android.iml index 5d00be6..9e8bb21 100644 --- a/Projects/Android/Android.iml +++ b/Projects/Android/Android.iml @@ -120,27 +120,41 @@ + + + + + + + + + + + + + + diff --git a/Projects/Android/AndroidManifest.xml b/Projects/Android/AndroidManifest.xml index c983ecc..9e599a8 100644 --- a/Projects/Android/AndroidManifest.xml +++ b/Projects/Android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="7" + android:versionName="1.0.4" android:installLocation="auto" > diff --git a/Projects/Android/jni/src/Lambda1VR/L1VR_SurfaceView.c b/Projects/Android/jni/src/Lambda1VR/L1VR_SurfaceView.c index 7dfd658..2c010a2 100644 --- a/Projects/Android/jni/src/Lambda1VR/L1VR_SurfaceView.c +++ b/Projects/Android/jni/src/Lambda1VR/L1VR_SurfaceView.c @@ -817,7 +817,7 @@ void setHMDPosition( float x, float y, float z, float yaw ) } void Host_BeginFrame(); -void Host_Frame(int eye); +void Host_Frame(); void Host_EndFrame(); void VR_GetMove( float *forward, float *side, float *yaw, float *pitch, float *roll ) @@ -858,7 +858,8 @@ void RenderFrame( ovrRenderer * renderer, const ovrJava * java, GL(glDisable(GL_SCISSOR_TEST)); //Now do the drawing for this eye - Host_Frame(eye); + Cvar_Set("vr_stereo_side", eye == 0 ? "0" : "1"); + Host_Frame(); } //Clear edge to prevent smearing @@ -1355,12 +1356,15 @@ void VR_Init() //Create Cvars vr_snapturn_angle = Cvar_Get( "vr_snapturn_angle", "45", CVAR_ARCHIVE, "Sets the angle for snap-turn, set to < 10.0 to enable smooth turning" ); vr_reloadtimeoutms = Cvar_Get( "vr_reloadtimeoutms", "200", CVAR_ARCHIVE, "How quickly the grip trigger needs to be release to initiate a reload" ); - vr_positional_factor= Cvar_Get( "vr_positional_factor", "2600", CVAR_ARCHIVE, "Arbitrary number that makes positional tracking work well" ); + vr_positional_factor= Cvar_Get( "vr_positional_factor", "1800", CVAR_SERVERINFO, "Arbitrary number that makes positional tracking work" ); vr_walkdirection = Cvar_Get( "vr_walkdirection", "0", CVAR_ARCHIVE, "1 - Use HMD for direction, 0 - Use off-hand controller for direction" ); vr_weapon_pitchadjust = Cvar_Get( "vr_weapon_pitchadjust", "-20.0", CVAR_ARCHIVE, "gun pitch angle adjust" ); vr_weapon_recoil = Cvar_Get( "vr_weapon_recoil", "0", CVAR_ARCHIVE, "Enables weapon recoil in VR, default is disabled, warning could make you sick" ); vr_lasersight = Cvar_Get( "vr_lasersight", "0", CVAR_ARCHIVE, "Enables laser-sight" ); vr_fov = Cvar_Get( "vr_fov", "108.5", CVAR_ARCHIVE, "FOV for Lambda1VR" ); + + //Not to be changed by users, as it will be overwritten anyway + vr_stereo_side = Cvar_Get( "vr_stereo_side", "0", CVAR_RENDERINFO, "Eye being drawn" ); } void * AppThreadFunction( void * parm ) @@ -1558,9 +1562,9 @@ void * AppThreadFunction( void * parm ) ALOGV(" HMD-Position: %f, %f, %f", positionHmd.x, positionHmd.y, positionHmd.z); if (r_lefthand->value) { - HandleInput_Right(appState.Ovr, appState.DisplayTime); - } else { HandleInput_Left(appState.Ovr, appState.DisplayTime); + } else { + HandleInput_Right(appState.Ovr, appState.DisplayTime); } static usingScreenLayer = true; //Starts off using the screen layer diff --git a/Projects/Android/jni/src/Lambda1VR/VrCvars.h b/Projects/Android/jni/src/Lambda1VR/VrCvars.h index fe2c0d4..99ebef0 100644 --- a/Projects/Android/jni/src/Lambda1VR/VrCvars.h +++ b/Projects/Android/jni/src/Lambda1VR/VrCvars.h @@ -9,4 +9,7 @@ convar_t *vr_walkdirection; convar_t *vr_weapon_pitchadjust; convar_t *vr_weapon_recoil; convar_t *vr_lasersight; -convar_t *vr_fov; \ No newline at end of file +convar_t *vr_fov; + +//Used and updated continuously during rendering +convar_t *vr_stereo_side; \ No newline at end of file diff --git a/Projects/Android/jni/src/Lambda1VR/VrInputLeft.c b/Projects/Android/jni/src/Lambda1VR/VrInputLeft.c index 5261dd2..7d31087 100644 --- a/Projects/Android/jni/src/Lambda1VR/VrInputLeft.c +++ b/Projects/Android/jni/src/Lambda1VR/VrInputLeft.c @@ -1,7 +1,7 @@ /************************************************************************************ Filename : VrInputRight.c -Content : Handles controller input for the right-handed +Content : Handles controller input for the left-handed Created : August 2019 Authors : Simon Brown @@ -25,7 +25,6 @@ Authors : Simon Brown #include "VrCvars.h" extern cvar_t *cl_forwardspeed; -extern convar_t *r_lefthand; int IN_TouchEvent( touchEventType type, int fingerID, float x, float y, float dx, float dy ); void Touch_Motion( touchEventType type, int fingerID, float x, float y, float dx, float dy ); @@ -35,8 +34,8 @@ float initialTouchX, initialTouchY; void HandleInput_Left( ovrMobile * Ovr, double displayTime ) { - //The amount of yaw changed by controller - //TODO: fixme + //The amount of yaw changed by controller + //TODO: fixme for ( int i = 0; ; i++ ) { ovrInputCapabilityHeader cap; ovrResult result = vrapi_EnumerateInputDevices(Ovr, i, &cap); @@ -69,98 +68,91 @@ void HandleInput_Left( ovrMobile * Ovr, double displayTime ) } } - ovrInputStateTrackedRemote *dominantTrackedRemoteState = !r_lefthand->integer ? &rightTrackedRemoteState_new : &leftTrackedRemoteState_new; - ovrInputStateTrackedRemote *dominantTrackedRemoteStateOld = !r_lefthand->integer ? &rightTrackedRemoteState_old : &leftTrackedRemoteState_old; - ovrTracking *dominantRemoteTracking = !r_lefthand->integer ? &rightRemoteTracking_new : &leftRemoteTracking_new; - ovrTracking *dominantRemoteTrackingOld = !r_lefthand->integer ? &rightRemoteTracking_old : &leftRemoteTracking_old; - - ovrInputStateTrackedRemote *offHandTrackedRemoteState = r_lefthand->integer ? &rightTrackedRemoteState_new : &leftTrackedRemoteState_new; - ovrInputStateTrackedRemote *offHandTrackedRemoteStateOld = r_lefthand->integer ? &rightTrackedRemoteState_old : &leftTrackedRemoteState_old; - ovrTracking *offHandRemoteTracking = r_lefthand->integer ? &rightRemoteTracking_new : &leftRemoteTracking_new; - ovrTracking *offHandRemoteTrackingOld = r_lefthand->integer ? &rightRemoteTracking_old : &leftRemoteTracking_old; - static bool dominantGripPushed = false; static float dominantGripPushTime = 0.0f; - //Show screen view (if in multiplayer toggle scoreboard) - if (((leftTrackedRemoteState_new.Buttons & ovrButton_Y) != - (leftTrackedRemoteState_old.Buttons & ovrButton_Y)) && - (leftTrackedRemoteState_new.Buttons & ovrButton_Y)) { + //Show screen view (if in multiplayer toggle scoreboard) + if (((rightTrackedRemoteState_new.Buttons & ovrButton_B) != + (rightTrackedRemoteState_old.Buttons & ovrButton_B)) && + (rightTrackedRemoteState_new.Buttons & ovrButton_B)) { showingScreenLayer = !showingScreenLayer; - //Check we are in multiplayer - if (CL_GetMaxClients() > 1) { - sendButtonAction("+showscores", showingScreenLayer); - } - } + //Check we are in multiplayer + if (CL_GetMaxClients() > 1) { + sendButtonAction("+showscores", showingScreenLayer); + } + } + //Menu button + handleTrackedControllerButton(&leftTrackedRemoteState_new, &leftTrackedRemoteState_old, ovrButton_Enter, K_ESCAPE); - //Menu control - Uses "touch" - if (useScreenLayer()) - { - //Menu button - handleTrackedControllerButton(&leftTrackedRemoteState_new, &leftTrackedRemoteState_old,ovrButton_Enter, K_ESCAPE); + //Menu control - Uses "touch" + if (useScreenLayer()) + { + float remoteAngles[3]; + QuatToYawPitchRoll(leftRemoteTracking_new.HeadPose.Pose.Orientation, remoteAngles); + float yaw = remoteAngles[YAW] - playerYaw; - const ovrQuatf quatRemote = dominantRemoteTracking->HeadPose.Pose.Orientation; - float remoteAngles[3]; - QuatToYawPitchRoll(quatRemote, remoteAngles); - float yaw = remoteAngles[YAW] - playerYaw; - if (yaw > -40.0f && yaw < 40.0f && - remoteAngles[PITCH] > -22.5f && remoteAngles[PITCH] < 22.5f) { + //Adjust for maximum yaw values + if (yaw >= 180.0f) yaw -= 180.0f; + if (yaw <= -180.0f) yaw += 180.0f; - int newRemoteTrigState = (dominantTrackedRemoteState->Buttons & ovrButton_Trigger) != 0; - int prevRemoteTrigState = (dominantTrackedRemoteStateOld->Buttons & ovrButton_Trigger) != 0; + if (yaw > -40.0f && yaw < 40.0f && + remoteAngles[PITCH] > -22.5f && remoteAngles[PITCH] < 22.5f) { - touchEventType t = event_motion; + int newRemoteTrigState = (leftTrackedRemoteState_new.Buttons & ovrButton_Trigger) != 0; + int prevRemoteTrigState = (leftTrackedRemoteState_old.Buttons & ovrButton_Trigger) != 0; - float touchX = (-yaw + 40.0f) / 80.0f; - float touchY = (remoteAngles[PITCH] + 22.5f) / 45.0f; - if (newRemoteTrigState != prevRemoteTrigState) - { - t = newRemoteTrigState ? event_down : event_up; - if (newRemoteTrigState) - { - initialTouchX = touchX; - initialTouchY = touchY; - } - } + touchEventType t = event_motion; - IN_TouchEvent(t, 0, touchX, touchY, initialTouchX - touchX, initialTouchY - touchY); - } - } - else - { - static bool weaponStabilisation = false; + float touchX = (-yaw + 40.0f) / 80.0f; + float touchY = (remoteAngles[PITCH] + 22.5f) / 45.0f; + if (newRemoteTrigState != prevRemoteTrigState) + { + t = newRemoteTrigState ? event_down : event_up; + if (newRemoteTrigState) + { + initialTouchX = touchX; + initialTouchY = touchY; + } + } - //If distance to off-hand remote is less than 35cm and user pushes grip, then we enable weapon stabilisation - float distance = sqrtf(powf(offHandRemoteTracking->HeadPose.Pose.Position.x - dominantRemoteTracking->HeadPose.Pose.Position.x, 2) + - powf(offHandRemoteTracking->HeadPose.Pose.Position.y - dominantRemoteTracking->HeadPose.Pose.Position.y, 2) + - powf(offHandRemoteTracking->HeadPose.Pose.Position.z - dominantRemoteTracking->HeadPose.Pose.Position.z, 2)); + IN_TouchEvent(t, 0, touchX, touchY, initialTouchX - touchX, initialTouchY - touchY); + } + } + else + { + static bool weaponStabilisation = false; - //Turn on weapon stabilisation? - if ((offHandTrackedRemoteState->Buttons & ovrButton_GripTrigger) != - (offHandTrackedRemoteStateOld->Buttons & ovrButton_GripTrigger)) { + //If distance to off-hand remote is less than 35cm and user pushes grip, then we enable weapon stabilisation + float distance = sqrtf(powf(rightRemoteTracking_new.HeadPose.Pose.Position.x - leftRemoteTracking_new.HeadPose.Pose.Position.x, 2) + + powf(rightRemoteTracking_new.HeadPose.Pose.Position.y - leftRemoteTracking_new.HeadPose.Pose.Position.y, 2) + + powf(rightRemoteTracking_new.HeadPose.Pose.Position.z - leftRemoteTracking_new.HeadPose.Pose.Position.z, 2)); - if (offHandTrackedRemoteState->Buttons & ovrButton_GripTrigger) - { - if (distance < 0.50f) - { - weaponStabilisation = true; - } - } - else - { - weaponStabilisation = false; - } - } + //Turn on weapon stabilisation? + if ((rightTrackedRemoteState_new.Buttons & ovrButton_GripTrigger) != + (rightTrackedRemoteState_old.Buttons & ovrButton_GripTrigger)) { - //dominant hand stuff first - { + if (rightTrackedRemoteState_new.Buttons & ovrButton_GripTrigger) + { + if (distance < 0.50f) + { + weaponStabilisation = true; + } + } + else + { + weaponStabilisation = false; + } + } + + //dominant hand stuff first + { ///Weapon location relative to view - weaponoffset[0] = dominantRemoteTracking->HeadPose.Pose.Position.x - hmdPosition[0]; - weaponoffset[1] = dominantRemoteTracking->HeadPose.Pose.Position.y - hmdPosition[1]; - weaponoffset[2] = dominantRemoteTracking->HeadPose.Pose.Position.z - hmdPosition[2]; + weaponoffset[0] = leftRemoteTracking_new.HeadPose.Pose.Position.x - hmdPosition[0]; + weaponoffset[1] = leftRemoteTracking_new.HeadPose.Pose.Position.y - hmdPosition[1]; + weaponoffset[2] = leftRemoteTracking_new.HeadPose.Pose.Position.z - hmdPosition[2]; { vec2_t v; @@ -168,16 +160,16 @@ void HandleInput_Left( ovrMobile * Ovr, double displayTime ) weaponoffset[0] = v[0]; weaponoffset[2] = v[1]; - ALOGV(" Weapon Offset: %f, %f, %f", - weaponoffset[0], - weaponoffset[1], - weaponoffset[2]); + ALOGV(" Weapon Offset: %f, %f, %f", + weaponoffset[0], + weaponoffset[1], + weaponoffset[2]); } - //Weapon velocity - weaponvelocity[0] = dominantRemoteTracking->HeadPose.LinearVelocity.x; - weaponvelocity[1] = dominantRemoteTracking->HeadPose.LinearVelocity.y; - weaponvelocity[2] = dominantRemoteTracking->HeadPose.LinearVelocity.z; + //Weapon velocity + weaponvelocity[0] = leftRemoteTracking_new.HeadPose.LinearVelocity.x; + weaponvelocity[1] = leftRemoteTracking_new.HeadPose.LinearVelocity.y; + weaponvelocity[2] = leftRemoteTracking_new.HeadPose.LinearVelocity.z; { vec2_t v; @@ -185,158 +177,152 @@ void HandleInput_Left( ovrMobile * Ovr, double displayTime ) weaponvelocity[0] = v[0]; weaponvelocity[2] = v[1]; - ALOGV(" Weapon Velocity: %f, %f, %f", - weaponvelocity[0], - weaponvelocity[1], - weaponvelocity[2]); + ALOGV(" Weapon Velocity: %f, %f, %f", + weaponvelocity[0], + weaponvelocity[1], + weaponvelocity[2]); } - //Set gun angles - const ovrQuatf quatRemote = dominantRemoteTracking->HeadPose.Pose.Orientation; - QuatToYawPitchRoll(quatRemote, weaponangles); + //Set gun angles + const ovrQuatf quatRemote = leftRemoteTracking_new.HeadPose.Pose.Orientation; + QuatToYawPitchRoll(quatRemote, weaponangles); - if (weaponStabilisation && - //Don't trigger stabilisation if controllers are close together (holding Glock for example) - (distance > 0.15f)) - { - float z = offHandRemoteTracking->HeadPose.Pose.Position.z - dominantRemoteTracking->HeadPose.Pose.Position.z; - float x = offHandRemoteTracking->HeadPose.Pose.Position.x - dominantRemoteTracking->HeadPose.Pose.Position.x; - float y = offHandRemoteTracking->HeadPose.Pose.Position.y - dominantRemoteTracking->HeadPose.Pose.Position.y; - float zxDist = length(x, z); + if (weaponStabilisation && + //Don't trigger stabilisation if controllers are close together (holding Glock for example) + (distance > 0.15f)) + { + float z = rightRemoteTracking_new.HeadPose.Pose.Position.z - leftRemoteTracking_new.HeadPose.Pose.Position.z; + float x = rightRemoteTracking_new.HeadPose.Pose.Position.x - leftRemoteTracking_new.HeadPose.Pose.Position.x; + float y = rightRemoteTracking_new.HeadPose.Pose.Position.y - leftRemoteTracking_new.HeadPose.Pose.Position.y; + float zxDist = length(x, z); - if (zxDist != 0.0f && z != 0.0f) { - weaponangles[YAW] = (cl.refdef.cl_viewangles[YAW] - hmdorientation[YAW]) - degrees(atan2f(x, -z)); - weaponangles[PITCH] = degrees(atanf(y / zxDist)); - } - } - else - { - weaponangles[YAW] += (cl.refdef.cl_viewangles[YAW] - hmdorientation[YAW]); - weaponangles[PITCH] *= -1.0f; + if (zxDist != 0.0f && z != 0.0f) { + weaponangles[YAW] = (cl.refdef.cl_viewangles[YAW] - hmdorientation[YAW]) - degrees(atan2f(x, -z)); + weaponangles[PITCH] = degrees(atanf(y / zxDist)); + } + } + else + { + weaponangles[YAW] += (cl.refdef.cl_viewangles[YAW] - hmdorientation[YAW]); + weaponangles[PITCH] *= -1.0f; - //Slight gun angle adjustment - weaponangles[PITCH] += vr_weapon_pitchadjust->value; - } + //Slight gun angle adjustment + weaponangles[PITCH] += vr_weapon_pitchadjust->value; + } - //Use (Action) - if ((dominantTrackedRemoteState->Buttons & ovrButton_Joystick) != - (dominantTrackedRemoteStateOld->Buttons & ovrButton_Joystick)) { + //Use (Action) + if ((leftTrackedRemoteState_new.Buttons & ovrButton_Joystick) != + (leftTrackedRemoteState_old.Buttons & ovrButton_Joystick)) { - sendButtonAction("+use", (dominantTrackedRemoteState->Buttons & ovrButton_Joystick)); - } + sendButtonAction("+use", (leftTrackedRemoteState_new.Buttons & ovrButton_Joystick)); + } - static bool finishReloadNextFrame = false; - if (finishReloadNextFrame) - { - sendButtonActionSimple("-reload"); - finishReloadNextFrame = false; - } + static bool finishReloadNextFrame = false; + if (finishReloadNextFrame) + { + sendButtonActionSimple("-reload"); + finishReloadNextFrame = false; + } - if ((dominantTrackedRemoteState->Buttons & ovrButton_GripTrigger) != - (dominantTrackedRemoteStateOld->Buttons & ovrButton_GripTrigger)) { + if ((leftTrackedRemoteState_new.Buttons & ovrButton_GripTrigger) != + (leftTrackedRemoteState_old.Buttons & ovrButton_GripTrigger)) { - dominantGripPushed = (dominantTrackedRemoteState->Buttons & ovrButton_GripTrigger); + dominantGripPushed = (leftTrackedRemoteState_new.Buttons & ovrButton_GripTrigger); - if (dominantGripPushed) - { - dominantGripPushTime = GetTimeInMilliSeconds(); - } - else - { - if ((GetTimeInMilliSeconds() - dominantGripPushTime) < vr_reloadtimeoutms->integer) - { - sendButtonActionSimple("+reload"); - finishReloadNextFrame = true; - } - } - } - } - - float controllerYawHeading = 0.0f; - //off-hand stuff - { - flashlightoffset[0] = offHandRemoteTracking->HeadPose.Pose.Position.x - hmdPosition[0]; - flashlightoffset[1] = offHandRemoteTracking->HeadPose.Pose.Position.y - hmdPosition[1]; - flashlightoffset[2] = offHandRemoteTracking->HeadPose.Pose.Position.z - hmdPosition[2]; - - QuatToYawPitchRoll(offHandRemoteTracking->HeadPose.Pose.Orientation, flashlightangles); - - flashlightangles[YAW] += (cl.refdef.cl_viewangles[YAW] - hmdorientation[YAW]); - controllerYawHeading = -cl.refdef.cl_viewangles[YAW] + flashlightangles[YAW]; - } - - //Right-hand specific stuff - { - ALOGV(" Right-Controller-Position: %f, %f, %f", - rightRemoteTracking_new.HeadPose.Pose.Position.x, - rightRemoteTracking_new.HeadPose.Pose.Position.y, - rightRemoteTracking_new.HeadPose.Pose.Position.z); - - //This section corrects for the fact that the controller actually controls direction of movement, but we want to move relative to the direction the - //player is facing for positional tracking - float multiplier = vr_positional_factor->value / cl_forwardspeed->value; - - vec2_t v; - rotateAboutOrigin(-positionDeltaThisFrame[0] * multiplier, - positionDeltaThisFrame[2] * multiplier, -hmdorientation[YAW], v); - positional_movementSideways = v[0]; - positional_movementForward = v[1]; - - ALOGV(" positional_movementSideways: %f, positional_movementForward: %f", - positional_movementSideways, - positional_movementForward); - - //Jump (B Button) - handleTrackedControllerButton(&rightTrackedRemoteState_new, - &rightTrackedRemoteState_old, ovrButton_B, K_SPACE); - - //We need to record if we have started firing primary so that releasing trigger will stop firing, if user has pushed grip - //in meantime, then it wouldn't stop the gun firing and it would get stuck - static bool firingPrimary = false; - if (!r_lefthand->integer) { - if (!firingPrimary && dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer) - { - //Fire Secondary - if ((rightTrackedRemoteState_new.Buttons & ovrButton_Trigger) != - (rightTrackedRemoteState_old.Buttons & ovrButton_Trigger)) { - - sendButtonAction("+attack2", (rightTrackedRemoteState_new.Buttons & ovrButton_Trigger)); + if (dominantGripPushed) + { + dominantGripPushTime = GetTimeInMilliSeconds(); + } + else + { + if ((GetTimeInMilliSeconds() - dominantGripPushTime) < vr_reloadtimeoutms->integer) + { + sendButtonActionSimple("+reload"); + finishReloadNextFrame = true; } - } - else - { - //Fire Primary - if ((rightTrackedRemoteState_new.Buttons & ovrButton_Trigger) != - (rightTrackedRemoteState_old.Buttons & ovrButton_Trigger)) { + } + } + } - firingPrimary = (rightTrackedRemoteState_new.Buttons & ovrButton_Trigger); - sendButtonAction("+attack", firingPrimary); - } - } - } else { - //Run - handleTrackedControllerButton(&rightTrackedRemoteState_new, - &rightTrackedRemoteState_old, - ovrButton_Trigger, K_SHIFT); - } + float controllerYawHeading = 0.0f; + //off-hand stuff + { + flashlightoffset[0] = rightRemoteTracking_new.HeadPose.Pose.Position.x - hmdPosition[0]; + flashlightoffset[1] = rightRemoteTracking_new.HeadPose.Pose.Position.y - hmdPosition[1]; + flashlightoffset[2] = rightRemoteTracking_new.HeadPose.Pose.Position.z - hmdPosition[2]; - //Duck with A - if ((rightTrackedRemoteState_new.Buttons & ovrButton_A) != - (rightTrackedRemoteState_old.Buttons & ovrButton_A)) { + QuatToYawPitchRoll(rightRemoteTracking_new.HeadPose.Pose.Orientation, flashlightangles); - sendButtonAction("+duck", (rightTrackedRemoteState_new.Buttons & ovrButton_A)); - } + flashlightangles[YAW] += (cl.refdef.cl_viewangles[YAW] - hmdorientation[YAW]); + controllerYawHeading = -cl.refdef.cl_viewangles[YAW] + flashlightangles[YAW]; + } + + //Right-hand specific stuff + { + ALOGV(" Right-Controller-Position: %f, %f, %f", + leftRemoteTracking_new.HeadPose.Pose.Position.x, + leftRemoteTracking_new.HeadPose.Pose.Position.y, + leftRemoteTracking_new.HeadPose.Pose.Position.z); + + //This section corrects for the fact that the controller actually controls direction of movement, but we want to move relative to the direction the + //player is facing for positional tracking + float multiplier = vr_positional_factor->value / cl_forwardspeed->value; + + vec2_t v; + rotateAboutOrigin(-positionDeltaThisFrame[0] * multiplier, + positionDeltaThisFrame[2] * multiplier, -hmdorientation[YAW], v); + positional_movementSideways = v[0]; + positional_movementForward = v[1]; + + ALOGV(" positional_movementSideways: %f, positional_movementForward: %f", + positional_movementSideways, + positional_movementForward); + + //Jump (Y Button) + handleTrackedControllerButton(&leftTrackedRemoteState_new, + &leftTrackedRemoteState_old, ovrButton_Y, K_SPACE); + + //We need to record if we have started firing primary so that releasing trigger will stop firing, if user has pushed grip + //in meantime, then it wouldn't stop the gun firing and it would get stuck + static bool firingPrimary = false; + + if (!firingPrimary && dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer) + { + //Fire Secondary + if ((leftTrackedRemoteState_new.Buttons & ovrButton_Trigger) != + (leftTrackedRemoteState_old.Buttons & ovrButton_Trigger)) { + + sendButtonAction("+attack2", (leftTrackedRemoteState_new.Buttons & ovrButton_Trigger)); + } + } + else + { + //Fire Primary + if ((leftTrackedRemoteState_new.Buttons & ovrButton_Trigger) != + (leftTrackedRemoteState_old.Buttons & ovrButton_Trigger)) { + + firingPrimary = (leftTrackedRemoteState_new.Buttons & ovrButton_Trigger); + sendButtonAction("+attack", firingPrimary); + } + } + + //Duck with X + if ((leftTrackedRemoteState_new.Buttons & ovrButton_X) != + (leftTrackedRemoteState_old.Buttons & ovrButton_X)) { + + sendButtonAction("+duck", (leftTrackedRemoteState_new.Buttons & ovrButton_X)); + } //Weapon Chooser static bool weaponSwitched = false; - if (between(-0.2f, rightTrackedRemoteState_new.Joystick.x, 0.2f) && - (between(0.8f, rightTrackedRemoteState_new.Joystick.y, 1.0f) || - between(-1.0f, rightTrackedRemoteState_new.Joystick.y, -0.8f))) + if (between(-0.2f, leftTrackedRemoteState_new.Joystick.x, 0.2f) && + (between(0.8f, leftTrackedRemoteState_new.Joystick.y, 1.0f) || + between(-1.0f, leftTrackedRemoteState_new.Joystick.y, -0.8f))) { if (!weaponSwitched) { - if (between(0.8f, rightTrackedRemoteState_new.Joystick.y, 1.0f)) + if (between(0.8f, leftTrackedRemoteState_new.Joystick.y, 1.0f)) { sendButtonActionSimple("invnext"); } @@ -349,107 +335,80 @@ void HandleInput_Left( ovrMobile * Ovr, double displayTime ) } else { weaponSwitched = false; } - } + } - //Left-hand specific stuff - { - ALOGV(" Left-Controller-Position: %f, %f, %f", - leftRemoteTracking_new.HeadPose.Pose.Position.x, - leftRemoteTracking_new.HeadPose.Pose.Position.y, - leftRemoteTracking_new.HeadPose.Pose.Position.z); - - //Menu button - handleTrackedControllerButton(&leftTrackedRemoteState_new, &leftTrackedRemoteState_old, - ovrButton_Enter, K_ESCAPE); + //Left-hand specific stuff + { + ALOGV(" Left-Controller-Position: %f, %f, %f", + rightRemoteTracking_new.HeadPose.Pose.Position.x, + rightRemoteTracking_new.HeadPose.Pose.Position.y, + rightRemoteTracking_new.HeadPose.Pose.Position.z); //Use (Action) - if ((leftTrackedRemoteState_new.Buttons & ovrButton_Joystick) != - (leftTrackedRemoteState_old.Buttons & ovrButton_Joystick) - && (leftTrackedRemoteState_new.Buttons & ovrButton_Joystick)) { + if ((rightTrackedRemoteState_new.Buttons & ovrButton_Joystick) != + (rightTrackedRemoteState_old.Buttons & ovrButton_Joystick) + && (rightTrackedRemoteState_new.Buttons & ovrButton_Joystick)) { Cvar_SetFloat("vr_lasersight", 1.0f - vr_lasersight->value); } //Apply a filter and quadratic scaler so small movements are easier to make - float dist = length(leftTrackedRemoteState_new.Joystick.x, leftTrackedRemoteState_new.Joystick.y); + float dist = length(rightTrackedRemoteState_new.Joystick.x, rightTrackedRemoteState_new.Joystick.y); float nlf = nonLinearFilter(dist); - float x = nlf * leftTrackedRemoteState_new.Joystick.x; - float y = nlf * leftTrackedRemoteState_new.Joystick.y; + float x = nlf * rightTrackedRemoteState_new.Joystick.x; + float y = nlf * rightTrackedRemoteState_new.Joystick.y; //Adjust to be off-hand controller oriented - vec2_t v; - rotateAboutOrigin(x, y, vr_walkdirection->integer == 1 ? cl.refdef.cl_viewangles[YAW] : controllerYawHeading,v); + vec2_t v; + rotateAboutOrigin(x, y, vr_walkdirection->integer == 1 ? cl.refdef.cl_viewangles[YAW] : controllerYawHeading,v); - remote_movementSideways = v[0]; - remote_movementForward = v[1]; + remote_movementSideways = v[0]; + remote_movementForward = v[1]; - ALOGV(" remote_movementSideways: %f, remote_movementForward: %f", - remote_movementSideways, - remote_movementForward); + ALOGV(" remote_movementSideways: %f, remote_movementForward: %f", + remote_movementSideways, + remote_movementForward); - //flashlight on/off - if (((leftTrackedRemoteState_new.Buttons & ovrButton_X) != - (leftTrackedRemoteState_old.Buttons & ovrButton_X)) && - (leftTrackedRemoteState_old.Buttons & ovrButton_X)) { - sendButtonActionSimple("impulse 100"); - } + //flashlight on/off + if (((rightTrackedRemoteState_new.Buttons & ovrButton_A) != + (rightTrackedRemoteState_old.Buttons & ovrButton_A)) && + (rightTrackedRemoteState_old.Buttons & ovrButton_A)) { + sendButtonActionSimple("impulse 100"); + } - //We need to record if we have started firing primary so that releasing trigger will stop definitely firing, if user has pushed grip - //in meantime, then it wouldn't stop the gun firing and it would get stuck - static bool firingPrimary = false; - if (!r_lefthand->integer) { - //Run - handleTrackedControllerButton(&leftTrackedRemoteState_new, - &leftTrackedRemoteState_old, - ovrButton_Trigger, K_SHIFT); - } - else - { - if (!firingPrimary && dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer) - { - //Fire Secondary - if ((leftTrackedRemoteState_new.Buttons & ovrButton_Trigger) != - (leftTrackedRemoteState_old.Buttons & ovrButton_Trigger)) { + //We need to record if we have started firing primary so that releasing trigger will stop definitely firing, if user has pushed grip + //in meantime, then it wouldn't stop the gun firing and it would get stuck + static bool firingPrimary = false; - sendButtonAction("+attack2", (leftTrackedRemoteState_new.Buttons & ovrButton_Trigger)); - } - } - else - { - //Fire Primary - if ((leftTrackedRemoteState_new.Buttons & ovrButton_Trigger) != - (leftTrackedRemoteState_old.Buttons & ovrButton_Trigger)) { + //Run + handleTrackedControllerButton(&rightTrackedRemoteState_new, + &rightTrackedRemoteState_old, + ovrButton_Trigger, K_SHIFT); - firingPrimary = (leftTrackedRemoteState_new.Buttons & ovrButton_Trigger); - sendButtonAction("+attack", firingPrimary); - } - } - } - - static increaseSnap = true; - if (rightTrackedRemoteState_new.Joystick.x > 0.6f) + static increaseSnap = true; + if (leftTrackedRemoteState_new.Joystick.x > 0.6f) { if (increaseSnap) { snapTurn -= vr_snapturn_angle->value; - if (vr_snapturn_angle->value > 10.0f) { - increaseSnap = false; - } + if (vr_snapturn_angle->value > 10.0f) { + increaseSnap = false; + } - if (snapTurn < -180.0f) - { - snapTurn += 360.f; - } - } - } else if (rightTrackedRemoteState_new.Joystick.x < 0.4f) { + if (snapTurn < -180.0f) + { + snapTurn += 360.f; + } + } + } else if (leftTrackedRemoteState_new.Joystick.x < 0.4f) { increaseSnap = true; } static decreaseSnap = true; - if (rightTrackedRemoteState_new.Joystick.x < -0.6f) + if (leftTrackedRemoteState_new.Joystick.x < -0.6f) { if (decreaseSnap) { @@ -457,22 +416,22 @@ void HandleInput_Left( ovrMobile * Ovr, double displayTime ) //If snap turn configured for less than 10 degrees if (vr_snapturn_angle->value > 10.0f) { - decreaseSnap = false; - } + decreaseSnap = false; + } - if (snapTurn > 180.0f) - { - snapTurn -= 360.f; - } + if (snapTurn > 180.0f) + { + snapTurn -= 360.f; + } } - } else if (rightTrackedRemoteState_new.Joystick.x > -0.4f) + } else if (leftTrackedRemoteState_new.Joystick.x > -0.4f) { decreaseSnap = true; } - } - } + } + } - //Save state - rightTrackedRemoteState_old = rightTrackedRemoteState_new; - leftTrackedRemoteState_old = leftTrackedRemoteState_new; + //Save state + leftTrackedRemoteState_old = leftTrackedRemoteState_new; + rightTrackedRemoteState_old = rightTrackedRemoteState_new; } \ No newline at end of file diff --git a/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_main.c b/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_main.c index ce6627e..d207d12 100644 --- a/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_main.c +++ b/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_main.c @@ -2272,17 +2272,15 @@ Host_ClientFrame ================== */ -#ifdef VR - int r_stereo_side; // Move this.. this is bad placement - void Host_ClientFrame( int eye ) -#else -void Host_ClientFrame( ) -#endif +void Host_ClientFrame( ) { // if client is not active, skip render functions // decide the simulation time #ifdef VR + + int eye = Cvar_VariableInteger("vr_stereo_side"); + if (eye == VR_EYE_MONO || eye == VR_EYE_LEFT ) { #endif cl.oldtime = cl.time; @@ -2323,7 +2321,6 @@ void Host_ClientFrame( ) #ifdef VR } - r_stereo_side = eye; #endif // update the screen diff --git a/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_view.c b/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_view.c index 49721c7..0d6127b 100644 --- a/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_view.c +++ b/Projects/Android/jni/src/Xash3D/xash3d/engine/client/cl_view.c @@ -331,7 +331,7 @@ sets cl.refdef view values =============== */ #ifdef VR -extern int r_stereo_side; // Move this.. this is bad placement +extern convar_t *vr_stereo_side; #endif void V_CalcRefDef( void ) { @@ -341,7 +341,7 @@ void V_CalcRefDef( void ) do { //Only recalc refdef once - if (r_stereo_side == VR_EYE_LEFT || r_stereo_side == VR_EYE_MONO) { + if (vr_stereo_side->integer == VR_EYE_LEFT || vr_stereo_side->integer == VR_EYE_MONO) { clgame.dllFuncs.pfnCalcRefdef(&cl.refdef); V_MergeOverviewRefdef(&cl.refdef); } diff --git a/Projects/Android/jni/src/Xash3D/xash3d/engine/client/gl_rmain.c b/Projects/Android/jni/src/Xash3D/xash3d/engine/client/gl_rmain.c index ff3a10e..ecf665d 100644 --- a/Projects/Android/jni/src/Xash3D/xash3d/engine/client/gl_rmain.c +++ b/Projects/Android/jni/src/Xash3D/xash3d/engine/client/gl_rmain.c @@ -658,11 +658,15 @@ R_SetupModelviewMatrix ============= */ extern convar_t *vr_worldscale; -extern int r_stereo_side; +extern convar_t *vr_stereo_side; static void R_SetupModelviewMatrix( const ref_params_t *fd, matrix4x4 m ) { Matrix4x4_CreateModelview( m ); - Matrix4x4_ConcatTranslate( m, 0, vr_worldscale->value * (0.065f / 2.0f) * ((r_stereo_side - 0.5f) * 2.0f), 0 ); + Matrix4x4_ConcatTranslate( m, 0, vr_worldscale->value * (0.065f / 2.0f) * ((vr_stereo_side->integer - 0.5f) * 2.0f), 0 ); + + //Move eyes forward 3cm - super rudimentary neck model lol + Matrix4x4_ConcatTranslate( m, vr_worldscale->value * -0.03f, 0, 0 ); + Matrix4x4_ConcatRotate( m, -fd->viewangles[ROLL], 1, 0, 0 ); Matrix4x4_ConcatRotate( m, -fd->viewangles[PITCH], 0, 1, 0 ); Matrix4x4_ConcatRotate( m, -fd->viewangles[YAW], 0, 0, 1 ); diff --git a/Projects/Android/jni/src/Xash3D/xash3d/engine/common/common.h b/Projects/Android/jni/src/Xash3D/xash3d/engine/common/common.h index 025c70f..8ece398 100644 --- a/Projects/Android/jni/src/Xash3D/xash3d/engine/common/common.h +++ b/Projects/Android/jni/src/Xash3D/xash3d/engine/common/common.h @@ -814,11 +814,7 @@ CLIENT / SERVER SYSTEMS */ void CL_Init( void ); void CL_Shutdown( void ); -#ifdef VR -void Host_ClientFrame( int eye ); -#else void Host_ClientFrame( ); -#endif void Host_RenderFrame( void ); void Host_ClientBegin( void ); qboolean CL_Active( void ); diff --git a/Projects/Android/jni/src/Xash3D/xash3d/engine/common/host.c b/Projects/Android/jni/src/Xash3D/xash3d/engine/common/host.c index e3634d6..f5468eb 100644 --- a/Projects/Android/jni/src/Xash3D/xash3d/engine/common/host.c +++ b/Projects/Android/jni/src/Xash3D/xash3d/engine/common/host.c @@ -777,10 +777,10 @@ Host_Frame */ #ifdef VR -void Host_Frame( int eye ) +void Host_Frame( ) { if ( !Host_IsDedicated() ) - Host_ClientFrame (eye); // client frame + Host_ClientFrame ( ); // client frame HTTP_Run(); }