From ed700f7a70aa1a27ab5a9b6c7ad096c8a06dc36f Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Mar 2020 18:51:35 +0000 Subject: [PATCH] weapon WIP --- .../Android/jni/QzDoom/QzDoom_SurfaceView.c | 24 ++----------- Projects/Android/jni/QzDoom/VrCommon.h | 5 --- Projects/Android/jni/QzDoom/VrInputDefault.c | 22 ++++++------ .../src/gl/renderer/gl_postprocess.cpp | 4 +-- .../src/gl/stereo3d/gl_oculusquest.cpp | 35 ++++++++++++------- 5 files changed, 38 insertions(+), 52 deletions(-) diff --git a/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c b/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c index 97b43ac..38bdf8e 100644 --- a/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c +++ b/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c @@ -59,7 +59,6 @@ bool vr_walkdirection; float vr_snapturn_angle; vec3_t offhandangles; vec3_t offhandoffset; -int ducked; bool player_moving; @@ -1280,32 +1279,13 @@ void VR_Init() remote_movementUp = 0.0f; positional_movementSideways = 0.0f; positional_movementForward = 0.0f; - snapTurn = 0.0f; - ducked = DUCK_NOTDUCKED; + snapTurn = 90.0f; // start partly turned //init randomiser srand(time(NULL)); //Initialise our cvar holders - vr_weapon_pitchadjust = -20.0; - -/* vr_snapturn_angle = Cvar_Get( "vr_snapturn_angle", "45", CVAR_ARCHIVE); - vr_positional_factor = Cvar_Get( "vr_positional_factor", "2000", CVAR_ARCHIVE); - vr_walkdirection = Cvar_Get( "vr_walkdirection", "0", CVAR_ARCHIVE); - vr_weapon_pitchadjust = Cvar_Get( "vr_weapon_pitchadjust", "-20.0", CVAR_ARCHIVE); - vr_control_scheme = Cvar_Get( "vr_control_scheme", "0", CVAR_ARCHIVE); - vr_height_adjust = Cvar_Get( "vr_height_adjust", "0.0", CVAR_ARCHIVE); - vr_weaponscale = Cvar_Get( "vr_weaponscale", "0.56", CVAR_ARCHIVE); - vr_weapon_stabilised = Cvar_Get( "vr_weapon_stabilised", "0.0", CVAR_LATCH); - vr_lasersight = Cvar_Get( "vr_lasersight", "0", CVAR_LATCH); - - //The Engine (which is a derivative of Quake) uses a very specific unit size: - //Wolfenstein 3D, DOOM and QUAKE use the same coordinate/unit system: - //8 foot (96 inch) height wall == 64 units, 1.5 inches per pixel unit - //1.0 pixel unit / 1.5 inch == 0.666666 pixel units per inch - //This make a world scale of: 26.2467 - vr_worldscale = Cvar_Get( "vr_worldscale", "26.2467", CVAR_ARCHIVE); - */ + vr_weapon_pitchadjust = -30.0; } static ovrAppThread * gAppThread = NULL; diff --git a/Projects/Android/jni/QzDoom/VrCommon.h b/Projects/Android/jni/QzDoom/VrCommon.h index aa775e7..3860a43 100644 --- a/Projects/Android/jni/QzDoom/VrCommon.h +++ b/Projects/Android/jni/QzDoom/VrCommon.h @@ -54,11 +54,6 @@ extern float vr_snapturn_angle; extern vec3_t offhandangles; extern vec3_t offhandoffset; -#define DUCK_NOTDUCKED 0 -#define DUCK_BUTTON 1 -#define DUCK_CROUCHED 2 -extern int ducked; - extern bool player_moving; void shutdownVR(); diff --git a/Projects/Android/jni/QzDoom/VrInputDefault.c b/Projects/Android/jni/QzDoom/VrInputDefault.c index 532fc87..9396d34 100644 --- a/Projects/Android/jni/QzDoom/VrInputDefault.c +++ b/Projects/Android/jni/QzDoom/VrInputDefault.c @@ -96,7 +96,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, const ovrQuatf quatRemote = pDominantTracking->HeadPose.Pose.Orientation; QuatToYawPitchRoll(quatRemote, vr_weapon_pitchadjust, weaponangles); weaponangles[YAW] -= VR_GetRawYaw(); - //weaponangles[ROLL] *= -1.0f; + weaponangles[ROLL] = 0.0f; // remove roll for weapons if (weaponStabilised) @@ -107,7 +107,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, float zxDist = length(x, z); if (zxDist != 0.0f && z != 0.0f) { - VectorSet(weaponangles, -degrees(atanf(y / zxDist)), VR_GetRawYaw() - degrees(atan2f(x, -z)), weaponangles[ROLL]); + VectorSet(weaponangles, -degrees(atanf(y / zxDist)), VR_GetRawYaw() - degrees(atan2f(x, -z)), 0.0f); } } } @@ -126,31 +126,27 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, offhandoffset[2] = v[1]; QuatToYawPitchRoll(pOffTracking->HeadPose.Pose.Orientation, 0.0f, offhandangles); - offhandangles[YAW] -= VR_GetRawYaw(); if (vr_walkdirection == 0) { - controllerYawHeading = offhandangles[YAW]; + controllerYawHeading = offhandangles[YAW] - hmdorientation[YAW]; } else { controllerYawHeading = 0.0f; } + + offhandangles[YAW] -= VR_GetRawYaw(); } - //Dominant-hand specific stuff + //Positional movement { ALOGV(" Right-Controller-Position: %f, %f, %f", pDominantTracking->HeadPose.Pose.Position.x, pDominantTracking->HeadPose.Pose.Position.y, pDominantTracking->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 vr_positional_factor = 1.0f;//4.0f; - vec2_t v; - rotateAboutOrigin(-positionDeltaThisFrame[0] * vr_positional_factor, - positionDeltaThisFrame[2] * vr_positional_factor, -(VR_GetRawYaw() + hmdorientation[YAW]), v); + rotateAboutOrigin(-positionDeltaThisFrame[0], positionDeltaThisFrame[2], -(VR_GetRawYaw() + hmdorientation[YAW]), v); positional_movementSideways = v[0]; positional_movementForward = v[1]; @@ -174,12 +170,16 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, } //Apply a filter and quadratic scaler so small movements are easier to make + //and we don't get movement jitter when the joystick doesn't quite center properly float dist = length(pOffTrackedRemoteNew->Joystick.x, pOffTrackedRemoteNew->Joystick.y); float nlf = nonLinearFilter(dist); float x = nlf * pOffTrackedRemoteNew->Joystick.x; float y = nlf * pOffTrackedRemoteNew->Joystick.y; + //Apply a simple deadzone player_moving = (fabs(x) + fabs(y)) > 0.05f; + x = player_moving ? x : 0; + y = player_moving ? y : 0; //Adjust to be off-hand controller oriented vec2_t v; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp index 31cd90b..f2d4c4d 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp @@ -807,8 +807,8 @@ void FGLRenderer::Flush() glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); glScissor(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); - //Only adjust HUD if we are 3D (otherwise we are rendering to a cylinder compositor layer) - //if (!is2D) stereo3dMode.getEyePose(eye_ix)->AdjustHud(); + //Only adjust HUD if we are 3D and not showing menu (otherwise we are rendering to a cylinder compositor layer) + if (!is2D && !isMenuActive()) stereo3dMode.getEyePose(eye_ix)->AdjustHud(); m2DDrawer->Draw(); FGLDebug::PopGroup(); diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp index 8d90dee..90cdf97 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp @@ -66,6 +66,7 @@ EXTERN_CVAR(Bool, vr_moveFollowsOffHand) EXTERN_CVAR(Float, vr_weaponRotate); EXTERN_CVAR(Float, vr_snapTurn); EXTERN_CVAR(Float, vr_ipd); +EXTERN_CVAR(Float, vr_weaponScale); double P_XYMovement(AActor *mo, DVector2 scroll); extern "C" void VR_GetMove( float *joy_forward, float *joy_side, float *hmd_forward, float *hmd_side, float *up, float *yaw, float *pitch, float *roll ); @@ -312,7 +313,7 @@ namespace s3d { GetWeaponTransform(&gl_RenderState.mModelMatrix); - float scale = 0.00125f * 1.0;//oculusquest_weaponScale; + float scale = 0.00125f * vr_weaponScale; gl_RenderState.mModelMatrix.scale(scale, -scale, scale); gl_RenderState.mModelMatrix.translate(-viewwidth / 2, -viewheight * 3 / 4, 0.0f); @@ -326,7 +327,7 @@ namespace s3d bool OculusQuestMode::GetHandTransform(int hand, VSMatrix* mat) const { -/* { + { mat->loadIdentity(); AActor* playermo = r_viewpoint.camera->player->mo; @@ -338,15 +339,26 @@ namespace s3d mat->rotate(-deltaYawDegrees - 180, 0, 1, 0); - mat->translate(-oculusquest_origin.x, -vr_floor_offset, -oculusquest_origin.z); + if ((vr_control_scheme < 10 && hand == 1) + || (vr_control_scheme > 10 && hand == 0)) { + DVector3 weap(weaponoffset[0], weaponoffset[1], weaponoffset[2]); + weap *= vr_vunits_per_meter; + mat->translate(weap.X - hmdPosition[0], weap.Y - vr_floor_offset, + weap.Z - hmdPosition[2]); + } + else + { + DVector3 weap(offhandoffset[0], offhandoffset[1], offhandoffset[2]); + weap *= vr_vunits_per_meter; + mat->translate(weap.X - hmdPosition[0], weap.Y - vr_floor_offset, + weap.Z - hmdPosition[2]); + } - LSMatrix44 handToAbs; - vSMatrixFromHmdMatrix34(handToAbs, controllers[hand].pose.mDeviceToAbsoluteTracking); + //Perform roration here? - mat->multMatrix(handToAbs.transpose()); return true; - }*/ + } return false; } @@ -386,12 +398,9 @@ namespace s3d super::SetUp(); // Set VR-appropriate settings - const bool doAdjustVrSettings = true; - if (doAdjustVrSettings) { + { movebob = 0; gl_billboard_faces_camera = true; -// if (gl_multisample < 2) -// gl_multisample = 4; } if (gamestate == GS_LEVEL && !isMenuActive()) { @@ -419,6 +428,7 @@ namespace s3d { if (player) { + //Weapon firing tracking - Thanks Fishbiter! { player->mo->OverrideAttackPosDir = true; @@ -435,8 +445,9 @@ namespace s3d float dummy=0; VR_GetMove(&dummy, &dummy, &hmd_forward, &hmd_side, &dummy, &dummy, &dummy, &dummy); + //Positional movement - Thanks fishbiter!! auto vel = player->mo->Vel; - player->mo->Vel = DVector3((DVector2(hmd_forward, -hmd_side) * vr_vunits_per_meter), 0); + player->mo->Vel = DVector3((DVector2(hmd_side, hmd_forward) * vr_vunits_per_meter), 0); bool wasOnGround = player->mo->Z() <= player->mo->floorz; double oldZ = player->mo->Z(); P_XYMovement(player->mo, DVector2(0, 0));