Skip to content

Commit

Permalink
GTE: Disable freecam on Android
Browse files Browse the repository at this point in the history
Freecam is disabled on Android because there's no windowed UI for it.
And because users can't be trusted to not crash games and complain.
  • Loading branch information
stenzek committed Jan 1, 2025
1 parent e036318 commit 0fdf984
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 4 deletions.
58 changes: 54 additions & 4 deletions src/core/gte.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@

LOG_CHANNEL(Host);

// Freecam is disabled on Android because there's no windowed UI for it.
// And because users can't be trusted to not crash games and complain.
#ifndef __ANDROID__
#define ENABLE_FREECAM 1
#endif

namespace GTE {

static constexpr s64 MAC0_MIN_VALUE = -(INT64_C(1) << 31);
Expand All @@ -47,14 +53,14 @@ static constexpr float FREECAM_MAX_TURN_SPEED = 360.0f;

namespace {

struct Config
struct ALIGN_TO_CACHE_LINE Config
{
DisplayAspectRatio aspect_ratio = DisplayAspectRatio::R4_3;
u32 custom_aspect_ratio_numerator;
u32 custom_aspect_ratio_denominator;
float custom_aspect_ratio_f;

//////////////////////////////////////////////////////////////////////////
#ifdef ENABLE_FREECAM

Timer::Value freecam_update_time = 0;
std::atomic_bool freecam_transform_changed{false};
Expand All @@ -70,11 +76,13 @@ struct Config
GSVector4 freecam_translation = GSVector4::cxpr(0.0f);

ALIGN_TO_CACHE_LINE GSMatrix4x4 freecam_matrix = GSMatrix4x4::Identity();

#endif
};

} // namespace

ALIGN_TO_CACHE_LINE static Config s_config;
static Config s_config;

#define REGS CPU::g_state.gte_regs

Expand Down Expand Up @@ -209,7 +217,6 @@ static void PushSZ(s32 value);
static void PushRGBFromMAC();
static u32 UNRDivide(u32 lhs, u32 rhs);

static void ApplyFreecam(s64& x, s64& y, s64& z);
static void MulMatVec(const s16* M_, const s16 Vx, const s16 Vy, const s16 Vz, u8 shift, bool lm);
static void MulMatVec(const s16* M_, const s32 T[3], const s16 Vx, const s16 Vy, const s16 Vz, u8 shift, bool lm);
static void MulMatVecBuggy(const s16* M_, const s32 T[3], const s16 Vx, const s16 Vy, const s16 Vz, u8 shift, bool lm);
Expand All @@ -221,6 +228,10 @@ static void NCCS(const s16 V[3], u8 shift, bool lm);
static void NCDS(const s16 V[3], u8 shift, bool lm);
static void DPCS(const u8 color[3], u8 shift, bool lm);

#ifdef ENABLE_FREECAM
static void ApplyFreecam(s64& x, s64& y, s64& z);
#endif

static void Execute_MVMVA(Instruction inst);
static void Execute_SQR(Instruction inst);
static void Execute_OP(Instruction inst);
Expand Down Expand Up @@ -687,8 +698,12 @@ void GTE::RTPS(const s16 V[3], u8 shift, bool lm, bool last)
s64 x = dot3(0);
s64 y = dot3(1);
s64 z = dot3(2);

#ifdef ENABLE_FREECAM
if (s_config.freecam_active)
ApplyFreecam(x, y, z);
#endif

TruncateAndSetMAC<1>(x, shift);
TruncateAndSetMAC<2>(y, shift);
TruncateAndSetMAC<3>(z, shift);
Expand Down Expand Up @@ -1416,6 +1431,8 @@ GTE::InstructionImpl GTE::GetInstructionImpl(u32 inst_bits, TickCount* ticks)
}
}

#ifdef ENABLE_FREECAM

bool GTE::IsFreecamEnabled()
{
return s_config.freecam_enabled;
Expand Down Expand Up @@ -1681,3 +1698,36 @@ void GTE::DrawFreecamWindow(float scale)
if (changed)
s_config.freecam_transform_changed.store(true, std::memory_order_release);
}

#else // ENABLE_FREECAM

bool GTE::IsFreecamEnabled()
{
return false;
}

void GTE::SetFreecamEnabled(bool enabled)
{
}

void GTE::SetFreecamMoveAxis(u32 axis, float x)
{
}

void GTE::SetFreecamRotateAxis(u32 axis, float x)
{
}

void GTE::UpdateFreecam(u64 current_time)
{
}

void GTE::ResetFreecam()
{
}

void GTE::DrawFreecamWindow(float scale)
{
}

#endif // ENABLE_FREECAM
5 changes: 5 additions & 0 deletions src/core/hotkeys.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,9 @@ DEFINE_HOTKEY("RotateCounterclockwise", TRANSLATE_NOOP("Hotkeys", "Graphics"),
}
})

// See gte.cpp.
#ifndef __ANDROID__

DEFINE_HOTKEY("FreecamToggle", TRANSLATE_NOOP("Hotkeys", "Graphics"), TRANSLATE_NOOP("Hotkeys", "Freecam Toggle"),
[](s32 pressed) {
if (!pressed && !Achievements::IsHardcoreModeActive())
Expand Down Expand Up @@ -616,6 +619,8 @@ DEFINE_HOTKEY("FreecamRollRight", TRANSLATE_NOOP("Hotkeys", "Graphics"),
GTE::SetFreecamRotateAxis(2, std::max(static_cast<float>(pressed), 0.0f));
})

#endif // __ANDROID__

DEFINE_HOTKEY("AudioMute", TRANSLATE_NOOP("Hotkeys", "Audio"), TRANSLATE_NOOP("Hotkeys", "Toggle Mute"),
[](s32 pressed) {
if (!pressed && System::IsValid())
Expand Down

0 comments on commit 0fdf984

Please sign in to comment.