Skip to content

Commit

Permalink
basic hacky mouse support
Browse files Browse the repository at this point in the history
  • Loading branch information
lightmanLP committed Feb 4, 2025
1 parent 85747d3 commit f9aedd0
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 0 deletions.
102 changes: 102 additions & 0 deletions mm/2s2h/BenGui/BenMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,102 @@ void BenMenu::AddEnhancements() {
.DefaultValue(0.5f)
.IsPercentage());

AddWidget(path, "Mouse", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Mouse Enabled", WIDGET_CVAR_CHECKBOX)
.CVar("gEnhancements.Camera.Mouse.Enabled")
.Options(CheckboxOptions().DefaultValue(false))
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_ON).active)
info.activeDisables.push_back(DISABLE_FOR_MOUSE_ON);
});
AddWidget(path, "Invert Camera X Axis", WIDGET_CVAR_CHECKBOX)
.CVar("gEnhancements.Camera.Mouse.InvertX")
.Options(CheckboxOptions().Tooltip("Inverts the Camera X Axis."))
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "Invert Camera Y Axis", WIDGET_CVAR_CHECKBOX)
.CVar("gEnhancements.Camera.Mouse.InvertY")
.Options(CheckboxOptions().Tooltip("Inverts the Camera Y Axis.").DefaultValue(true))
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "Third-Person Horizontal Sensitivity: %.0f", WIDGET_CVAR_SLIDER_FLOAT)
.CVar("gEnhancements.Camera.Mouse.CameraSensitivity.X")
.Options(FloatSliderOptions()
.Tooltip("Adjust the mouse sensitivity of the x axis when in Third Person.")
.Format("%.0f%%")
.Min(0.01f)
.Max(5.0f)
.DefaultValue(1.0f)
.IsPercentage())
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "Third-Person Vertical Sensitivity: %.0f", WIDGET_CVAR_SLIDER_FLOAT)
.CVar("gEnhancements.Camera.Mouse.CameraSensitivity.Y")
.Options(FloatSliderOptions()
.Tooltip("Adjust the mouse sensitivity of the y axis when in Third Person.")
.Format("%.0f%%")
.Min(0.01f)
.Max(5.0f)
.DefaultValue(1.0f)
.IsPercentage())
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "First-Person invert X Axis", WIDGET_CVAR_CHECKBOX)
.CVar("gEnhancements.Camera.Mouse.FirstPerson.InvertX")
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "First-Person invert Y Axis", WIDGET_CVAR_CHECKBOX)
.CVar("gEnhancements.Camera.Mouse.FirstPerson.InvertY")
.Options(CheckboxOptions().DefaultValue(true))
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "First-Person Horizontal Sensitivity: %.0f", WIDGET_CVAR_SLIDER_FLOAT)
.CVar("gEnhancements.Camera.Mouse.FirstPerson.SensitivityX")
.Options(FloatSliderOptions()
.Tooltip("Adjust the mouse sensitivity of the x axis when in First Person.")
.Format("%.0f%%")
.Min(0.01f)
.Max(5.0f)
.DefaultValue(1.0f)
.IsPercentage())
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});
AddWidget(path, "First-Person Vertical Sensitivity: %.0f", WIDGET_CVAR_SLIDER_FLOAT)
.CVar("gEnhancements.Camera.Mouse.FirstPerson.SensitivityY")
.Options(FloatSliderOptions()
.Tooltip("Adjust the mouse sensitivity of the y axis when in First Person.")
.Format("%.0f%%")
.Min(0.01f)
.Max(5.0f)
.DefaultValue(1.0f)
.IsPercentage())
.PreFunc([](WidgetInfo& info) {
if (mBenMenu->disabledMap.at(DISABLE_FOR_MOUSE_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_MOUSE_OFF);
}
});

path = { "Enhancements", "Cheats", 1 };
AddSidebarEntry("Enhancements", "Cheats", 3);
AddWidget(path, "Infinite Health", WIDGET_CVAR_CHECKBOX)
Expand Down Expand Up @@ -1470,6 +1566,12 @@ void BenMenu::InitElement() {
{ DISABLE_FOR_FREE_LOOK_OFF,
{ [](disabledInfo& info) -> bool { return !CVarGetInteger("gEnhancements.Camera.FreeLook.Enable", 0); },
"Free Look is Disabled" } },
{ DISABLE_FOR_MOUSE_ON,
{ [](disabledInfo& info) -> bool { return CVarGetInteger("gEnhancements.Camera.Mouse.Enabled", 0); },
"Mouse is Enabled" } },
{ DISABLE_FOR_MOUSE_OFF,
{ [](disabledInfo& info) -> bool { return !CVarGetInteger("gEnhancements.Camera.Mouse.Enabled", 0); },
"Mouse is Disabled" } },
{ DISABLE_FOR_GYRO_OFF,
{ [](disabledInfo& info) -> bool {
return !CVarGetInteger("gEnhancements.Camera.FirstPerson.GyroEnabled", 0);
Expand Down
2 changes: 2 additions & 0 deletions mm/2s2h/BenGui/MenuTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ typedef enum {
DISABLE_FOR_DEBUG_CAM_OFF,
DISABLE_FOR_FREE_LOOK_ON,
DISABLE_FOR_FREE_LOOK_OFF,
DISABLE_FOR_MOUSE_ON,
DISABLE_FOR_MOUSE_OFF,
DISABLE_FOR_GYRO_OFF,
DISABLE_FOR_GYRO_ON,
DISABLE_FOR_RIGHT_STICK_OFF,
Expand Down
21 changes: 21 additions & 0 deletions mm/2s2h/Enhancements/Camera/FreeLook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "2s2h/GameInteractor/GameInteractor.h"
#include "2s2h/ShipInit.hpp"
#include "CameraUtils.h"
#include "Mouse.h"

extern "C" {
#include "macros.h"
Expand Down Expand Up @@ -100,6 +101,18 @@ bool Camera_FreeLook(Camera* camera) {
yaw += yawDiff * GameInteractor_InvertControl(GI_INVERT_CAMERA_RIGHT_STICK_X);
pitch += pitchDiff * -GameInteractor_InvertControl(GI_INVERT_CAMERA_RIGHT_STICK_Y);

if (CVarGetInteger("gEnhancements.Camera.Mouse.Enabled", 0) && Mouse_IsCaptured()
// Disable mouse movement when holding down the shield
// TODO: test if this check still needed
// !(player->stateFlags1 & 0x400000)
) {
MouseDelta mouseDelta = Mouse_GetDelta();
yaw -= mouseDelta.x * 40.0f * CVarGetFloat("gEnhancements.Camera.Mouse.CameraSensitivity.X", 1.0f) *
GameInteractor_InvertControl(GI_INVERT_CAMERA_MOUSE_X);
pitch += mouseDelta.y * 40.0f * CVarGetFloat("gEnhancements.Camera.Mouse.CameraSensitivity.Y", 1.0f) *
-GameInteractor_InvertControl(GI_INVERT_CAMERA_MOUSE_Y);
}

s16 maxPitch = DEG_TO_BINANG(CVarGetFloat("gEnhancements.Camera.FreeLook.MaxPitch", 72.0f));
s16 minPitch = DEG_TO_BINANG(CVarGetFloat("gEnhancements.Camera.FreeLook.MinPitch", -49.0f));

Expand Down Expand Up @@ -140,9 +153,17 @@ bool Camera_FreeLook(Camera* camera) {
bool Camera_CanFreeLook(Camera* camera) {
f32 camX = sCamPlayState->state.input[0].cur.right_stick_x * 10.0f;
f32 camY = sCamPlayState->state.input[0].cur.right_stick_y * 10.0f;

if (CVarGetInteger("gEnhancements.Camera.Mouse.Enabled", 0) && Mouse_IsCaptured()) {
MouseDelta mouseDelta = Mouse_GetDelta();
camX -= mouseDelta.x * 40.0f;
camY += mouseDelta.y * 40.0f;
}

if (!sCanFreeLook && (fabsf(camX) >= 15.0f || fabsf(camY) >= 15.0f)) {
sCanFreeLook = true;
}
// TODO: check Z target mode potential
// Pressing Z will "Reset" Camera
if (CHECK_BTN_ALL(sCamPlayState->state.input[0].press.button, BTN_Z)) {
sCanFreeLook = false;
Expand Down
31 changes: 31 additions & 0 deletions mm/2s2h/Enhancements/Camera/Mouse.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include "Mouse.h"

#include "Context.h"

static MouseDelta current;

#ifdef __cplusplus
extern "C" {
#endif

void Mouse_Update() {
Ship::Coords coords = Ship::Context::GetInstance()->GetWindow()->GetMouseDelta();
current.x = coords.x;
current.y = coords.y;
}

MouseDelta Mouse_GetDelta() {
return current;
}

void Mouse_SetCursorPos(s32 x, s32 y) {
Ship::Context::GetInstance()->GetWindow()->SetMousePos({ x, y });
}

bool Mouse_IsCaptured() {
return Ship::Context::GetInstance()->GetWindow()->IsMouseCaptured();
}

#ifdef __cplusplus
} // extern "C"
#endif
22 changes: 22 additions & 0 deletions mm/2s2h/Enhancements/Camera/Mouse.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// TODO: Maybe this file should be part of BenPort
#pragma once

#include "ultratypes.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct MouseDelta {
s32 x;
s32 y;
} MouseDelta;

void Mouse_Update();
MouseDelta Mouse_GetDelta();
void Mouse_SetCursorPos(s32 x, s32 y);
bool Mouse_IsCaptured();

#ifdef __cplusplus
} // extern "C"
#endif
22 changes: 22 additions & 0 deletions mm/2s2h/GameInteractor/GameInteractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,16 @@ int GameInteractor_InvertControl(GIInvertType type) {
result *= -1;
}
break;
case GI_INVERT_CAMERA_MOUSE_X:
if (CVarGetInteger("gEnhancements.Camera.Mouse.InvertX", 0)) {
result *= -1;
}
break;
case GI_INVERT_CAMERA_MOUSE_Y:
if (CVarGetInteger("gEnhancements.Camera.Mouse.InvertY", 1)) {
result *= -1;
}
break;
case GI_INVERT_FIRST_PERSON_AIM_X:
if (CVarGetInteger("gEnhancements.Camera.FirstPerson.InvertX", 0)) {
result *= -1;
Expand Down Expand Up @@ -308,12 +318,23 @@ int GameInteractor_InvertControl(GIInvertType type) {
result *= -1;
}
break;
case GI_INVERT_FIRST_PERSON_MOUSE_X:
if (CVarGetInteger("gEnhancements.Camera.Mouse.FirstPerson.InvertX", 0)) {
result *= -1;
}
break;
case GI_INVERT_FIRST_PERSON_MOUSE_Y:
if (CVarGetInteger("gEnhancements.Camera.Mouse.FirstPerson.InvertY", 1)) {
result *= -1;
}
break;
}

// Invert all X axis inputs if the Mirrored World mode is enabled
if (CVarGetInteger("gModes.MirroredWorld.State", 0)) {
switch (type) {
case GI_INVERT_CAMERA_RIGHT_STICK_X:
case GI_INVERT_CAMERA_MOUSE_X:
case GI_INVERT_MOVEMENT_X:
case GI_INVERT_SHIELD_X:
case GI_INVERT_SHOP_X:
Expand All @@ -324,6 +345,7 @@ int GameInteractor_InvertControl(GIInvertType type) {
case GI_INVERT_FIRST_PERSON_AIM_X:
case GI_INVERT_FIRST_PERSON_GYRO_X:
case GI_INVERT_FIRST_PERSON_RIGHT_STICK_X:
case GI_INVERT_FIRST_PERSON_MOUSE_X:
case GI_INVERT_FIRST_PERSON_MOVING_X:
result *= -1;
break;
Expand Down
4 changes: 4 additions & 0 deletions mm/2s2h/GameInteractor/GameInteractor.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@ typedef enum {
typedef enum {
GI_INVERT_CAMERA_RIGHT_STICK_X,
GI_INVERT_CAMERA_RIGHT_STICK_Y,
GI_INVERT_CAMERA_MOUSE_X,
GI_INVERT_CAMERA_MOUSE_Y,
GI_INVERT_MOVEMENT_X,
GI_INVERT_SHIELD_X,
GI_INVERT_SHOP_X,
Expand All @@ -116,6 +118,8 @@ typedef enum {
GI_INVERT_FIRST_PERSON_GYRO_Y,
GI_INVERT_FIRST_PERSON_RIGHT_STICK_X,
GI_INVERT_FIRST_PERSON_RIGHT_STICK_Y,
GI_INVERT_FIRST_PERSON_MOUSE_X,
GI_INVERT_FIRST_PERSON_MOUSE_Y,
GI_INVERT_FIRST_PERSON_MOVING_X,
} GIInvertType;

Expand Down
2 changes: 2 additions & 0 deletions mm/src/code/padmgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "global.h"
#include "PR/controller.h"
#include "PR/os_motor.h"
#include "2s2h/Enhancements/Camera/Mouse.h"
#include "fault.h"
#include <stdio.h>
#include <string.h>
Expand Down Expand Up @@ -603,6 +604,7 @@ void PadMgr_HandleRetrace(void) {

// Begin reading controller data
osContStartReadData(serialEventQueue);
Mouse_Update();

// Execute rumble callback
if (sPadMgrInstance->rumbleRetraceCallback != NULL) {
Expand Down
16 changes: 16 additions & 0 deletions mm/src/overlays/actors/ovl_player_actor/z_player.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@

#include "2s2h/BenPort.h"
#include "2s2h/GameInteractor/GameInteractor.h"
#include "2s2h/Enhancements/Camera/Mouse.h"

#define THIS ((Player*)thisx)

Expand Down Expand Up @@ -13038,6 +13039,21 @@ s32 Ship_HandleFirstPersonAiming(PlayState* play, Player* this, s32 arg2) {
stickY += leftStickY * CVarGetFloat("gEnhancements.Camera.FirstPerson.SensitivityY", 1.0f);
}

if (CVarGetInteger("gEnhancements.Camera.Mouse.Enabled", 0) && Mouse_IsCaptured()) {
MouseDelta mouseDelta = Mouse_GetDelta();

if (mouseDelta.x != 0) {
this->actor.focus.rot.y += mouseDelta.x * 12.0f *
CVarGetFloat("gEnhancements.Camera.Mouse.FirstPerson.SensitivityX", 1.0f) *
-GameInteractor_InvertControl(GI_INVERT_FIRST_PERSON_MOUSE_X);
}
if (mouseDelta.y != 0) {
this->actor.focus.rot.x += mouseDelta.y * 12.0f *
CVarGetFloat("gEnhancements.Camera.Mouse.FirstPerson.SensitivityY", 1.0f) *
-GameInteractor_InvertControl(GI_INVERT_FIRST_PERSON_MOUSE_Y);
}
}

if (CVarGetInteger("gEnhancements.Camera.FirstPerson.GyroEnabled", 0)) {
gyroX = sPlayerControlInput->cur.gyro_y * 720; // -40 to 40, avg -4 to 4
gyroY = sPlayerControlInput->cur.gyro_x * 720; // -20 to 20, avg -2 to 2
Expand Down

0 comments on commit f9aedd0

Please sign in to comment.