diff --git a/Projects/Android/AndroidManifest.xml b/Projects/Android/AndroidManifest.xml index 45bc8c0..d945b44 100644 --- a/Projects/Android/AndroidManifest.xml +++ b/Projects/Android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="4" + android:versionName="0.3.0" android:installLocation="auto" > diff --git a/Projects/Android/jni/QzDoom/VrInputDefault.c b/Projects/Android/jni/QzDoom/VrInputDefault.c index 3e1d801..f2897b3 100644 --- a/Projects/Android/jni/QzDoom/VrInputDefault.c +++ b/Projects/Android/jni/QzDoom/VrInputDefault.c @@ -19,7 +19,7 @@ Authors : Simon Brown #include "doomkeys.h" int getGameState(); -int isMenuActive(); +int getMenuState(); void Joy_GenerateButtonEvents(int oldbuttons, int newbuttons, int numbuttons, int base); void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking, @@ -30,7 +30,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, //Menu button - invoke menu handleTrackedControllerButton(&leftTrackedRemoteState_new, &leftTrackedRemoteState_old, ovrButton_Enter, KEY_ESCAPE); - if (getGameState() != 0 || isMenuActive()) //gamestate != GS_LEVEL + if (getGameState() != 0 || getMenuState() != 0) // If getMenuState returns 2, then we are waiting for a key mapping input, so send normal keymappings { Joy_GenerateButtonEvents((pOffTrackedRemoteOld->Joystick.x > 0.7f ? 1 : 0), (pOffTrackedRemoteNew->Joystick.x > 0.7f ? 1 : 0), 1, KEY_PAD_DPAD_RIGHT); Joy_GenerateButtonEvents((pDominantTrackedRemoteOld->Joystick.x > 0.7f ? 1 : 0), (pDominantTrackedRemoteNew->Joystick.x > 0.7f ? 1 : 0), 1, KEY_PAD_DPAD_RIGHT); @@ -43,53 +43,52 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, Joy_GenerateButtonEvents((pOffTrackedRemoteOld->Joystick.y > 0.7f ? 1 : 0), (pOffTrackedRemoteNew->Joystick.y > 0.7f ? 1 : 0), 1, KEY_PAD_DPAD_UP); Joy_GenerateButtonEvents((pDominantTrackedRemoteOld->Joystick.y > 0.7f ? 1 : 0), (pDominantTrackedRemoteNew->Joystick.y > 0.7f ? 1 : 0), 1, KEY_PAD_DPAD_UP); - - handleTrackedControllerButton(pDominantTrackedRemoteNew, pDominantTrackedRemoteOld, domButton1, KEY_PAD_A); - handleTrackedControllerButton(pDominantTrackedRemoteNew, pDominantTrackedRemoteOld, ovrButton_Trigger, KEY_PAD_A); - handleTrackedControllerButton(pDominantTrackedRemoteNew, pDominantTrackedRemoteOld, domButton2, KEY_PAD_B); - - handleTrackedControllerButton(pOffTrackedRemoteNew, pOffTrackedRemoteOld, domButton1, KEY_PAD_A); - handleTrackedControllerButton(pOffTrackedRemoteNew, pOffTrackedRemoteOld, ovrButton_Trigger, KEY_PAD_A); - handleTrackedControllerButton(pOffTrackedRemoteNew, pOffTrackedRemoteOld, domButton2, KEY_PAD_B); - - handleTrackedControllerButton(&leftTrackedRemoteState_new, &leftTrackedRemoteState_old, ovrButton_Enter, KEY_PAD_B); } - else + + //Dominant Grip works like a shift key + bool dominantGripPushedOld = + (pDominantTrackedRemoteOld->Buttons & ovrButton_GripTrigger) != 0; + bool dominantGripPushedNew = + (pDominantTrackedRemoteNew->Buttons & ovrButton_GripTrigger) != 0; + + + // Only do the following if we are definitely not in the menu + if (getMenuState() == 0) { - float distance = sqrtf(powf(pOffTracking->HeadPose.Pose.Position.x - pDominantTracking->HeadPose.Pose.Position.x, 2) + - powf(pOffTracking->HeadPose.Pose.Position.y - pDominantTracking->HeadPose.Pose.Position.y, 2) + - powf(pOffTracking->HeadPose.Pose.Position.z - pDominantTracking->HeadPose.Pose.Position.z, 2)); + float distance = sqrtf(powf(pOffTracking->HeadPose.Pose.Position.x - + pDominantTracking->HeadPose.Pose.Position.x, 2) + + powf(pOffTracking->HeadPose.Pose.Position.y - + pDominantTracking->HeadPose.Pose.Position.y, 2) + + powf(pOffTracking->HeadPose.Pose.Position.z - + pDominantTracking->HeadPose.Pose.Position.z, 2)); //Turn on weapon stabilisation? if ((pOffTrackedRemoteNew->Buttons & ovrButton_GripTrigger) != (pOffTrackedRemoteOld->Buttons & ovrButton_GripTrigger)) { - if (pOffTrackedRemoteNew->Buttons & ovrButton_GripTrigger) - { - if (distance < 0.50f) - { + if (pOffTrackedRemoteNew->Buttons & ovrButton_GripTrigger) { + if (distance < 0.50f) { weaponStabilised = true; } - } - else - { + } else { weaponStabilised = false; } } //dominant hand stuff first { - ///Weapon location relative to view + ///Weapon location relative to view weaponoffset[0] = pDominantTracking->HeadPose.Pose.Position.x - hmdPosition[0]; weaponoffset[1] = pDominantTracking->HeadPose.Pose.Position.y - hmdPosition[1]; weaponoffset[2] = pDominantTracking->HeadPose.Pose.Position.z - hmdPosition[2]; - { - vec2_t v; - rotateAboutOrigin(weaponoffset[0], weaponoffset[2], -(doomYaw - hmdorientation[YAW]), v); - weaponoffset[0] = v[1]; - weaponoffset[2] = v[0]; - } + { + vec2_t v; + rotateAboutOrigin(weaponoffset[0], weaponoffset[2], + -(doomYaw - hmdorientation[YAW]), v); + weaponoffset[0] = v[1]; + weaponoffset[2] = v[0]; + } //Set gun angles const ovrQuatf quatRemote = pDominantTracking->HeadPose.Pose.Orientation; @@ -99,15 +98,18 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, QuatToYawPitchRoll(quatRemote, rotation, weaponangles); - if (weaponStabilised) - { - float z = pOffTracking->HeadPose.Pose.Position.z - pDominantTracking->HeadPose.Pose.Position.z; - float x = pOffTracking->HeadPose.Pose.Position.x - pDominantTracking->HeadPose.Pose.Position.x; - float y = pOffTracking->HeadPose.Pose.Position.y - pDominantTracking->HeadPose.Pose.Position.y; + if (weaponStabilised) { + float z = pOffTracking->HeadPose.Pose.Position.z - + pDominantTracking->HeadPose.Pose.Position.z; + float x = pOffTracking->HeadPose.Pose.Position.x - + pDominantTracking->HeadPose.Pose.Position.x; + float y = pOffTracking->HeadPose.Pose.Position.y - + pDominantTracking->HeadPose.Pose.Position.y; float zxDist = length(x, z); if (zxDist != 0.0f && z != 0.0f) { - VectorSet(weaponangles, -degrees(atanf(y / zxDist)), -degrees(atan2f(x, -z)), weaponangles[ROLL]); + VectorSet(weaponangles, -degrees(atanf(y / zxDist)), -degrees(atan2f(x, -z)), + weaponangles[ROLL]); } } } @@ -120,33 +122,33 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, offhandoffset[1] = pOffTracking->HeadPose.Pose.Position.y - hmdPosition[1]; offhandoffset[2] = pOffTracking->HeadPose.Pose.Position.z - hmdPosition[2]; - vec2_t v; - rotateAboutOrigin(offhandoffset[0], offhandoffset[2], -(doomYaw - hmdorientation[YAW]), v); - offhandoffset[0] = v[1]; - offhandoffset[2] = v[0]; + vec2_t v; + rotateAboutOrigin(offhandoffset[0], offhandoffset[2], -(doomYaw - hmdorientation[YAW]), + v); + offhandoffset[0] = v[1]; + offhandoffset[2] = v[0]; vec3_t rotation = {0}; rotation[PITCH] = 20; QuatToYawPitchRoll(pOffTracking->HeadPose.Pose.Orientation, rotation, offhandangles); - if (vr_moveuseoffhand != 0) { - controllerYawHeading = offhandangles[YAW] - hmdorientation[YAW]; - } - else - { - controllerYawHeading = 0.0f; - } + if (vr_moveuseoffhand != 0) { + controllerYawHeading = offhandangles[YAW] - hmdorientation[YAW]; + } else { + controllerYawHeading = 0.0f; + } } //Positional movement { ALOGV(" Right-Controller-Position: %f, %f, %f", pDominantTracking->HeadPose.Pose.Position.x, - pDominantTracking->HeadPose.Pose.Position.y, - pDominantTracking->HeadPose.Pose.Position.z); + pDominantTracking->HeadPose.Pose.Position.y, + pDominantTracking->HeadPose.Pose.Position.z); vec2_t v; - rotateAboutOrigin(positionDeltaThisFrame[0], positionDeltaThisFrame[2], -(doomYaw - hmdorientation[YAW]), v); + rotateAboutOrigin(positionDeltaThisFrame[0], positionDeltaThisFrame[2], + -(doomYaw - hmdorientation[YAW]), v); positional_movementSideways = v[1]; positional_movementForward = v[0]; @@ -159,11 +161,11 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, { ALOGV(" Left-Controller-Position: %f, %f, %f", pOffTracking->HeadPose.Pose.Position.x, - pOffTracking->HeadPose.Pose.Position.y, - pOffTracking->HeadPose.Pose.Position.z); + pOffTracking->HeadPose.Pose.Position.y, + pOffTracking->HeadPose.Pose.Position.z); - //Teleport - only does anything if vr_teleport cvar is true - if (vr_use_teleport) { + //Teleport - only does anything if vr_teleport cvar is true + if (vr_use_teleport) { if (pOffTrackedRemoteOld->Joystick.y > 0.7f && !ready_teleport) { ready_teleport = true; } else if (pOffTrackedRemoteOld->Joystick.y < 0.7f & ready_teleport) { @@ -173,10 +175,10 @@ 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); + //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; @@ -185,7 +187,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, x = player_moving ? x : 0; y = player_moving ? y : 0; - //Adjust to be off-hand controller oriented + //Adjust to be off-hand controller oriented vec2_t v; rotateAboutOrigin(x, y, controllerYawHeading, v); @@ -197,86 +199,73 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, // Turning logic static int increaseSnap = true; - if (pDominantTrackedRemoteNew->Joystick.x > 0.6f) - { - if (increaseSnap) - { + if (pDominantTrackedRemoteNew->Joystick.x > 0.6f) { + if (increaseSnap) { resetDoomYaw = true; snapTurn -= vr_snapturn_angle; if (vr_snapturn_angle > 10.0f) { increaseSnap = false; } - if (snapTurn < -180.0f) - { + if (snapTurn < -180.0f) { snapTurn += 360.f; } } - } else if (pDominantTrackedRemoteNew->Joystick.x < 0.4f) { - increaseSnap = true; - } + } else if (pDominantTrackedRemoteNew->Joystick.x < 0.4f) { + increaseSnap = true; + } - static int decreaseSnap = true; - if (pDominantTrackedRemoteNew->Joystick.x < -0.6f) - { - if (decreaseSnap) - { + static int decreaseSnap = true; + if (pDominantTrackedRemoteNew->Joystick.x < -0.6f) { + if (decreaseSnap) { resetDoomYaw = true; - snapTurn += vr_snapturn_angle; + snapTurn += vr_snapturn_angle; - //If snap turn configured for less than 10 degrees - if (vr_snapturn_angle > 10.0f) { + //If snap turn configured for less than 10 degrees + if (vr_snapturn_angle > 10.0f) { decreaseSnap = false; } - if (snapTurn > 180.0f) - { + if (snapTurn > 180.0f) { snapTurn -= 360.f; } - } - } else if (pDominantTrackedRemoteNew->Joystick.x > -0.4f) - { - decreaseSnap = true; - } + } + } else if (pDominantTrackedRemoteNew->Joystick.x > -0.4f) { + decreaseSnap = true; + } } + } - //Now handle all the buttons + //Now handle all the buttons - irrespective of menu state - we might be trying to remap stuff + { { - //Dominant Grip works like a shift key - bool dominantGripPushedOld = (pDominantTrackedRemoteOld->Buttons & ovrButton_GripTrigger) != 0; - bool dominantGripPushedNew = (pDominantTrackedRemoteNew->Buttons & ovrButton_GripTrigger) != 0; - - //Weapon Chooser + //Weapon Chooser - This _could_ be remapped static int itemSwitched = 0; if (between(-0.2f, pDominantTrackedRemoteNew->Joystick.x, 0.2f) && (between(0.8f, pDominantTrackedRemoteNew->Joystick.y, 1.0f) || - between(-1.0f, pDominantTrackedRemoteNew->Joystick.y, -0.8f))) - { + between(-1.0f, pDominantTrackedRemoteNew->Joystick.y, -0.8f))) { if (itemSwitched == 0) { - if (between(0.8f, pDominantTrackedRemoteNew->Joystick.y, 1.0f)) - { + if (between(0.8f, pDominantTrackedRemoteNew->Joystick.y, 1.0f)) { Joy_GenerateButtonEvents(0, 1, 1, KEY_MWHEELDOWN); itemSwitched = 1; - } - else - { + } else { Joy_GenerateButtonEvents(0, 1, 1, KEY_MWHEELUP); itemSwitched = 2; } } } else { - if (itemSwitched == 1) - { + if (itemSwitched == 1) { Joy_GenerateButtonEvents(1, 0, 1, KEY_MWHEELDOWN); - } - else if (itemSwitched == 2) - { + } else if (itemSwitched == 2) { Joy_GenerateButtonEvents(1, 0, 1, KEY_MWHEELUP); } itemSwitched = 0; } - //Dominant Hand - Primary keys (no grip pushed) - All keys are remappable, default bindngs are shown below + } + + { + //Dominant Hand - Primary keys (no grip pushed) - All keys are re-mappable, default bindngs are shown below //Fire Joy_GenerateButtonEvents(((pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger) != 0) && !dominantGripPushedOld ? 1 : 0, @@ -323,7 +312,6 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, - //Off Hand - Primary keys (no grip pushed) //No Default Binding @@ -350,10 +338,10 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, //Off Hand - Secondary keys (grip pushed) - //Toggle Run + //No Default Binding Joy_GenerateButtonEvents(((pOffTrackedRemoteOld->Buttons & ovrButton_Trigger) != 0) && dominantGripPushedOld ? 1 : 0, ((pOffTrackedRemoteNew->Buttons & ovrButton_Trigger) != 0) && dominantGripPushedNew ? 1 : 0, - 1, AKEYCODE_CAPS_LOCK); + 1, KEY_LALT); //Move Down Joy_GenerateButtonEvents(((pOffTrackedRemoteOld->Buttons & offButton1) != 0) && dominantGripPushedOld ? 1 : 0, diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/doomstat.h b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/doomstat.h index 2068659..cfb518e 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/doomstat.h +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/doomstat.h @@ -120,7 +120,7 @@ extern EMenuState menuactive; // Menu overlayed? extern int paused; // Game Pause? extern bool pauseext; -extern "C" int isMenuActive(); +extern "C" int getMenuState(); extern bool viewactive; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/g_statusbar/sbar_mugshot.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/g_statusbar/sbar_mugshot.cpp index 2e17cf5..c9b3695 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/g_statusbar/sbar_mugshot.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/g_statusbar/sbar_mugshot.cpp @@ -46,6 +46,8 @@ #define ST_RAMPAGEDELAY (2*TICRATE) #define ST_MUCHPAIN 20 +EXTERN_CVAR(Float, vr_pickup_haptic_level) + TArray MugShotStates; @@ -351,8 +353,10 @@ int FMugShot::UpdateState(player_t *player, StateFlags stateflags) if (player->bonuscount) { //Short haptic blip on pickup - QzDoom_Vibrate(80, 0, 1.0); // left - QzDoom_Vibrate(80, 1, 1.0); // right + if (vr_pickup_haptic_level > 0.0) { + QzDoom_Vibrate(80, 0, vr_pickup_haptic_level); // left + QzDoom_Vibrate(80, 1, vr_pickup_haptic_level); // right + } SetState("grin", false); return 0; 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 f2d4c4d..d4012d0 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 @@ -808,7 +808,7 @@ void FGLRenderer::Flush() glScissor(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); //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(); + if (!is2D && !getMenuState()) 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 256317f..68f7ce7 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 @@ -405,7 +405,7 @@ namespace s3d movebob = 0; } - if (gamestate == GS_LEVEL && !isMenuActive()) { + if (gamestate == GS_LEVEL && !getMenuState()) { cachedScreenBlocks = screenblocks; screenblocks = 12; QzDoom_setUseScreenLayer(false); @@ -429,13 +429,13 @@ namespace s3d QzDoom_getTrackedRemotesOrientation(vr_control_scheme); //Some crazy stuff to ascertain the actual yaw that doom is using at the right times! - if (gamestate != GS_LEVEL || isMenuActive() || (gamestate == GS_LEVEL && resetDoomYaw)) + if (gamestate != GS_LEVEL || getMenuState() || (gamestate == GS_LEVEL && resetDoomYaw)) { doomYaw = (float)r_viewpoint.Angles.Yaw.Degrees; if (gamestate == GS_LEVEL && resetDoomYaw) { resetDoomYaw = false; } - if (gamestate != GS_LEVEL || isMenuActive()) + if (gamestate != GS_LEVEL || getMenuState()) { resetDoomYaw = true; } @@ -561,7 +561,7 @@ namespace s3d G_AddViewPitch(mAngleFromRadians(dPitch)); } - if (gamestate == GS_LEVEL && !isMenuActive()) + if (gamestate == GS_LEVEL && !getMenuState()) { doomYaw += hmdYawDeltaDegrees; } diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp index bce29b0..ff14886 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp @@ -67,6 +67,9 @@ CVAR(Float, vr_snapTurn, 45.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Int, vr_move_speed, 24, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_run_multiplier, 1.6, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Float, vr_pickup_haptic_level, 0.2, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Float, vr_quake_haptic_level, 0.8, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) + //HUD control CVAR(Float, vr_hud_scale, 0.3f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_hud_stereo, 1.8f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp index 7bf2169..11bd149 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp @@ -370,12 +370,11 @@ void M_StartControlPanel (bool makeSound) BackbuttonAlpha = 0; } -int isMenuActive() +int getMenuState() { - return menuactive == MENU_On ? 1 : 0; + return (int)menuactive; } - //============================================================================= // // diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp index b9348bc..fa00499 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp @@ -75,6 +75,7 @@ extern bool DrawFSHUD; // [RH] Defined in d_main.cpp EXTERN_CVAR (Bool, cl_capfps) +EXTERN_CVAR (Float, vr_quake_haptic_level) // TYPES ------------------------------------------------------------------- @@ -749,6 +750,8 @@ static double QuakePower(double factor, double intensity, double offset) return factor * (offset + randumb); } +extern "C" void QzDoom_Vibrate(float duration, int channel, float intensity ); + //========================================================================== // // R_SetupFrame @@ -920,6 +923,14 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor { viewpoint.Pos.Z += QuakePower(quakefactor, jiggers.Intensity.Z, jiggers.Offset.Z); } + + //Haptic Quake + if (vr_quake_haptic_level > 0.0) { + double left = QuakePower(vr_quake_haptic_level, jiggers.Intensity.X, jiggers.Offset.X); + double right = QuakePower(vr_quake_haptic_level, jiggers.Intensity.Y, jiggers.Offset.Y); + QzDoom_Vibrate(10, 0, (float)left); // left + QzDoom_Vibrate(10, 1, (float)right); // right + } } } diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_blend.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_blend.cpp index a12bd75..a55f67f 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_blend.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_blend.cpp @@ -57,6 +57,8 @@ CVAR( Float, blood_fade_scalar, 0.0f, CVAR_ARCHIVE ) // Default ro 0.0 for VR CVAR( Float, pickup_fade_scalar, 0.0f, CVAR_ARCHIVE ) // Default ro 0.0 for VR +EXTERN_CVAR(Float, vr_pickup_haptic_level) + // [RH] Amount of red flash for up to 114 damage points. Calculated by hand // using a logarithmic scale and my trusty HP48G. static uint8_t DamageToAlpha[114] = @@ -129,8 +131,10 @@ void V_AddPlayerBlend (player_t *CPlayer, float blend[4], float maxinvalpha, int cnt = CPlayer->bonuscount << 3; //Super short haptic blip on pickup - QzDoom_Vibrate(50, 0, 0.7); // left - QzDoom_Vibrate(50, 1, 0.7); // right + if (vr_pickup_haptic_level > 0.0) { + QzDoom_Vibrate(50, 0, vr_pickup_haptic_level); // left + QzDoom_Vibrate(50, 1, vr_pickup_haptic_level); // right + } // [SP] Allow player to tone down intensity of pickup flash. cnt = (int)( cnt * pickup_fade_scalar ); diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h index 876df5f..c8a6274 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h @@ -41,7 +41,7 @@ const char *GetVersionString(); /** Lots of different version numbers **/ -#define VERSIONSTR "QuestZDoom Beta-0.2 - LZDoom 3.83a" +#define VERSIONSTR "QuestZDoom Beta-0.3 - LZDoom 3.83a" // The version as seen in the Windows resource #define RC_FILEVERSION 3,83,1 diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/menudef.txt b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/menudef.txt index d7132fd..6495242 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/menudef.txt +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/menudef.txt @@ -2288,6 +2288,10 @@ OptionMenu VROptionsMenu protected Option "Use Teleport", "vr_teleport", "OnOff" Slider "Snap-turn Angle", "vr_snapTurn", 0.0, 90.0, 1.0, 2 + StaticText " " + Slider "Item Pickup Haptic Level", "vr_pickup_haptic_level", 0.0, 1.0, 0.1, 2 + Slider "Quake Haptic Level", "vr_quake_haptic_level", 0.0, 1.0, 0.1, 2 + StaticText " " Slider "Walking Speed", "vr_move_speed", 5, 50, 1, 2 Slider "Run Multiplier", "vr_run_multiplier", 0.0, 4.0, 0.1, 2 diff --git a/assets/res/lzdoom.pk3 b/assets/res/lzdoom.pk3 index 756f798..cf69d19 100644 Binary files a/assets/res/lzdoom.pk3 and b/assets/res/lzdoom.pk3 differ