mirror of
https://github.com/patchzyy/wiicompiled
synced 2026-10-19 13:13:48 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3186e5f511 |
@@ -1,7 +1,7 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<!-- The one product version. Release tags must match it. -->
|
||||
<Version>0.2.35</Version>
|
||||
<Version>0.2.34</Version>
|
||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
@@ -372,9 +372,6 @@ static bool HIDAPI_DriverWii_InitDevice(SDL_HIDAPI_Device *device)
|
||||
[==[ x = ((data->rgucAccelerometer[0] << 2) | ((data->rgucBaseButtons[0] >> 5) & 0x03));
|
||||
y = ((data->rgucAccelerometer[1] << 2) | ((data->rgucBaseButtons[1] >> 4) & 0x02));
|
||||
z = ((data->rgucAccelerometer[2] << 2) | ((data->rgucBaseButtons[1] >> 5) & 0x02));
|
||||
if (x == 0 && y == 0 && z == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
values[0] = -(((float)x - ctx->m_fAccelZeroG[0]) / ctx->m_fAccelPerG[0]) * SDL_STANDARD_GRAVITY;
|
||||
values[1] = (((float)z - ctx->m_fAccelZeroG[2]) / ctx->m_fAccelPerG[2]) * SDL_STANDARD_GRAVITY;
|
||||
|
||||
@@ -93,20 +93,12 @@ extern "C" int32_t WUDGetStatus_HLE()
|
||||
}
|
||||
PPC_NATIVE_OVERRIDE(801CDB84, WUDGetStatus_HLE, int32_t, (), ());
|
||||
|
||||
// WPADGetDataFormat: the format KPAD runs the attached extension in (WPAD_FMT_*_ACC_DPD).
|
||||
// WPADClampStick keys off it. Can't reuse the translated SDK implementation: it dereferences
|
||||
// Bluetooth control blocks that HLE'd WPADInit never constructs.
|
||||
// WPADGetDataFormat reads the per-channel format set by WPADSetDataFormat. Can't reuse the
|
||||
// translated SDK implementation: it dereferences Bluetooth control blocks that HLE'd WPADInit
|
||||
// never constructs.
|
||||
extern "C" int32_t WPADGetDataFormat_HLE(uint32_t chan)
|
||||
{
|
||||
const int32_t status = g_state.contract.GetDataFormat(chan);
|
||||
if (status < 0) {
|
||||
return status;
|
||||
}
|
||||
switch (WiiRemoteInput::EffectiveKind(chan)) {
|
||||
case WiiRemoteInput::Kind::RemoteWithNunchuk: return 5;
|
||||
case WiiRemoteInput::Kind::RemoteWithClassic: return 8;
|
||||
default: return 2;
|
||||
}
|
||||
return g_state.contract.GetDataFormat(chan);
|
||||
}
|
||||
PPC_NATIVE_OVERRIDE(801C0B54, WPADGetDataFormat_HLE, int32_t, (uint32_t chan), (chan));
|
||||
|
||||
|
||||
@@ -144,8 +144,8 @@ struct LastAcc {
|
||||
std::array<LastAcc, PAD_MAX_CONTROLLERS> g_lastAcc{};
|
||||
std::array<LastAcc, PAD_MAX_CONTROLLERS> g_lastNunchukAcc{};
|
||||
|
||||
// A zeroed remote report decodes to minus its zero-g point, at least this far out on every axis.
|
||||
constexpr float kZeroReportMinG = 4.0f;
|
||||
// Any axis beyond this is not a reading the remote's +-3 g sensor can produce.
|
||||
constexpr float kMaxPlausibleRemoteG = 4.0f;
|
||||
|
||||
// Case-sensitive substring test that tolerates a null name.
|
||||
bool NameContains(const char* name, const char* needle) {
|
||||
@@ -250,11 +250,10 @@ bool ReadSdlAccel(SDL_Gamepad* gamepad, SDL_SensorType sensor, float* sdl) {
|
||||
|
||||
// True for a sample that cannot have come from the sensor. Over Bluetooth on
|
||||
// Windows the remote delivers, a few times a minute, a report whose
|
||||
// accelerometer bytes are all zero; SDL decodes that as (+a, -b, -c) g with
|
||||
// a, b, c the zero-g point over the units per g of each axis: about 5 g for the
|
||||
// remote (factory calibration) and exactly 2.56 g for the Nunchuk (200 units/g).
|
||||
// Handed to the game as is, one such frame is a full-lock steer plus a 9 g
|
||||
// "shake". Single axes past 4 g are real readings of a hard shake. `g` is the
|
||||
// accelerometer bytes are all zero; SDL decodes that as -0x200 on every axis,
|
||||
// i.e. (+5.12, -5.12, -5.12) g for the remote (100 units/g) and
|
||||
// (+2.56, -2.56, -2.56) g for the Nunchuk (200 units/g). Handed to the game as
|
||||
// is, one such frame is a full-lock steer plus a 9 g "shake". `g` is the
|
||||
// uncorrected SDL sample.
|
||||
bool IsGlitchedSample(SDL_SensorType sensor, const float* g) {
|
||||
// An exact zero vector is SDL's sensor buffer before the first report, not
|
||||
@@ -262,11 +261,16 @@ bool IsGlitchedSample(SDL_SensorType sensor, const float* g) {
|
||||
if (g[0] == 0.0f && g[1] == 0.0f && g[2] == 0.0f) {
|
||||
return true;
|
||||
}
|
||||
if (sensor == SDL_SENSOR_ACCEL) {
|
||||
return g[0] > kZeroReportMinG && g[1] < -kZeroReportMinG && g[2] < -kZeroReportMinG;
|
||||
const float zero = sensor == SDL_SENSOR_ACCEL ? 5.12f : 2.56f;
|
||||
if (std::fabs(g[0] - zero) < 0.03f && std::fabs(g[1] + zero) < 0.03f && std::fabs(g[2] + zero) < 0.03f) {
|
||||
return true;
|
||||
}
|
||||
constexpr float zero = 2.56f;
|
||||
return std::fabs(g[0] - zero) < 0.03f && std::fabs(g[1] + zero) < 0.03f && std::fabs(g[2] + zero) < 0.03f;
|
||||
if (sensor == SDL_SENSOR_ACCEL) {
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
if (std::fabs(g[i]) > kMaxPlausibleRemoteG) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// One accelerometer sample in g, SDL's sensor frame. The remote's own axes are
|
||||
|
||||
Reference in New Issue
Block a user