Skip to content

Commit

Permalink
d_vibration / d_vib_pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
Aelire committed Jul 21, 2024
1 parent 9f647b6 commit fccc40e
Show file tree
Hide file tree
Showing 6 changed files with 441 additions and 73 deletions.
2 changes: 1 addition & 1 deletion configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ def JSystemLib(lib_name, objects):
Object(Matching, "d/d_kankyo_demo.cpp"),
Object(NonMatching, "d/d_detect.cpp"),
Object(NonMatching, "d/d_vibration.cpp"),
Object(NonMatching, "d/d_vib_pattern.cpp"),
Object(Matching, "d/d_vib_pattern.cpp"),
Object(NonMatching, "d/d_attention.cpp"),
Object(Matching, "d/d_att_dist.cpp"),
Object(Matching, "d/d_bg_s.cpp"),
Expand Down
6 changes: 3 additions & 3 deletions include/JSystem/JUtility/JUTGamePad.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,9 @@ struct JUTGamePad : public JKRDisposer {
static PADMask mEnabled;

enum ERumble {
VAL_0 = 0,
VAL_1 = 1,
VAL_2 = 2,
PREDEF_PATTERN = 0,
FOREVER = 1,
SET_LENGTH = 2,
};

void clear();
Expand Down
85 changes: 57 additions & 28 deletions include/d/d_vibration.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,63 @@
#define D_D_VIBRATION_H

#include "SSystem/SComponent/c_xyz.h"
#include "JSystem/JUtility/JUTGamePad.h"

class dVibration_c {
public:
/* 0x00 */ int field_0x0;
/* 0x04 */ int field_0x4;
/* 0x08 */ s32 field_0x8;
/* 0x0C */ int field_0xc;
/* 0x10 */ int field_0x10;
/* 0x14 */ cXyz field_0x14;
/* 0x20 */ s32 field_0x20;
/* 0x24 */ int field_0x24;
/* 0x28 */ u32 field_0x28;
/* 0x2C */ s32 field_0x2c;
/* 0x30 */ int field_0x30;
/* 0x34 */ int field_0x34;
/* 0x38 */ cXyz field_0x38;
/* 0x44 */ s32 field_0x44;
/* 0x48 */ int field_0x48;
/* 0x4C */ int field_0x4c;
/* 0x50 */ s32 field_0x50;
/* 0x54 */ s32 field_0x54;
/* 0x58 */ s32 field_0x58;
/* 0x5C */ s32 field_0x5c;
/* 0x60 */ int field_0x60;
/* 0x64 */ u32 field_0x64;
/* 0x68 */ u32 field_0x68;
/* 0x6C */ s32 field_0x6c;
/* 0x70 */ s32 field_0x70;
/* 0x74 */ s32 field_0x74;
/* 0x78 */ s32 field_0x78;
/* 0x7C */ int field_0x7c;

struct vib_pattern {
u16 rounds; /* Number of random bits enabled, used by quakes */
u16 length; /* length of the pattern */
s32 patt; /* pattern bits (interpreted as bitstring) */
};

/*
These weak functions in the debug maps point to an anonymous struct from a precompiled header ?
dVibration_c::@class$3553dolzel_pch::@class$3553dolzel_pch()
dVibration_c::@class$3553dolzel_pch::@class$3554dolzel_pch::@class$3554dolzel_pch()
dVibration_c::@class$3553dolzel_pch::@class$3554dolzel_pch::~@class$3554dolzel_pch()
dVibration_c::@class$3553dolzel_pch::~@class$3553dolzel_pch()
*/

enum RumbleState {
STATE_PAUSED = -1,
STATE_WAITING = 0,
STATE_RUNNING = 1,
};
enum RumbleType { /* Used as flags */
RUMBLE_SHOCK = 0x1,
RUMBLE_QUAKE = 0x2,
};

static const struct vib_pattern MS_patt[26];
static const struct vib_pattern CS_patt[26];
static const struct vib_pattern MQ_patt[12];
static const struct vib_pattern CQ_patt[12];

struct camera_rumble_params{
int pattern_idx;
u32 pattern;
s32 length;
s32 rounds;
s32 flags;
cXyz coord;
s32 current_frame;
}; // Size: 0x24
struct motor_rumble_params{
int pattern_idx;
u32 pattern;
s32 length;
s32 rounds;
s32 current_frame;
s32 stop_frame; /* different from lengh for looping rumble */
}; // Size: 0x12
/* 0x0 */ struct camera_rumble_params mCameraShock;
/* 0x24 */ struct camera_rumble_params mCameraQuake;
/* 0x48 */ struct motor_rumble_params mMotorShock;
/* 0x60 */ struct motor_rumble_params mMotorQuake;
/* 0x78 */ s32 mShiftIdx;
/* 0x7C */ enum RumbleState mRumbleState;

public:
dVibration_c();
Expand All @@ -49,6 +75,9 @@ class dVibration_c {
void Init();
void Pause();
void Remove();

inline bool testShake() {return mMotorQuake.pattern_idx != -1;}

}; // Size: 0x84

#endif /* D_D_VIBRATION_H */
20 changes: 10 additions & 10 deletions src/JSystem/JUtility/JUTGamePad.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -431,26 +431,26 @@ void JUTGamePad::CRumble::update(s16 portNo) {
}

/* 802C46CC-802C46F4 .text triggerPatternedRumble__Q210JUTGamePad7CRumbleFUl */
void JUTGamePad::CRumble::triggerPatternedRumble(u32 param_0) {
void JUTGamePad::CRumble::triggerPatternedRumble(u32 length) {
if (mData != NULL && mFrameCount != 0) {
mLength = param_0;
mLength = length;
mFrame = 0;
}
}

/* 802C46F4-802C4770 .text startPatternedRumble__Q210JUTGamePad7CRumbleFPUcQ310JUTGamePad7CRumble7ERumbleUl */
void JUTGamePad::CRumble::startPatternedRumble(u8* param_0, JUTGamePad::CRumble::ERumble param_1, u32 param_2) {
mFrameCount = ((*param_0) << 8) + *(param_0 + 1);
mData = param_0 + 2;
switch (param_1) {
case JUTGamePad::CRumble::VAL_0:
void JUTGamePad::CRumble::startPatternedRumble(u8 *pattern, JUTGamePad::CRumble::ERumble rumbleType, u32 duration) {
mFrameCount = (*pattern << 8) + *(pattern + 1);
mData = pattern + 2;
switch (rumbleType) {
case JUTGamePad::CRumble::PREDEF_PATTERN:
triggerPatternedRumble(mFrameCount);
break;
case JUTGamePad::CRumble::VAL_1:
case JUTGamePad::CRumble::FOREVER:
triggerPatternedRumble(-1);
break;
case JUTGamePad::CRumble::VAL_2:
triggerPatternedRumble(param_2);
case JUTGamePad::CRumble::SET_LENGTH:
triggerPatternedRumble(duration);
break;
}
}
Expand Down
51 changes: 51 additions & 0 deletions src/d/d_vib_pattern.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,54 @@
//

#include "d/d_vibration.h"

/* Motor Shock (MS) predefined patterns */
const dVibration_c::vib_pattern dVibration_c::MS_patt[26] = {
{0, 0, 0 }, {0, 3, 0xc0000000},
{0, 4, 0xe0000000}, {0, 6, 0xe8000000},
{0, 7, 0xec000000}, {0, 8, 0xf6000000},
{0, 9, 0xfb000000}, {0, 10, 0xf6800000},
{0, 11, 0xfb400000}, {0, 3, 0xe0000000},
{0, 5, 0xf8000000}, {0, 23, 0xe0202000},
{0, 13, 0xf0380000}, {0, 13, 0xf0380000},
{0, 3, 0xe0000000}, {0, 8, 0xd0000000},
{0, 7, 0xe0000000}, {0, 8, 0xf0000000},
{0, 5, 0xf8000000}, {0, 2, 0xc0000000},
{0, 8, 0xf5000000}, {0, 12, 0xf8d00000},
{0, 6, 0xc0000000}, {0, 9, 0xe8000000},
{0, 10, 0xf4000000}, {0, 15, 0xfaa00000},
};
/* Camera Shock (CS) predefined patterns */
const dVibration_c::vib_pattern dVibration_c::CS_patt[26] = { /* identical to MS_patt */
{0, 0, 0 }, {0, 3, 0xc0000000},
{0, 4, 0xe0000000}, {0, 6, 0xe8000000},
{0, 7, 0xec000000}, {0, 8, 0xf6000000},
{0, 9, 0xfb000000}, {0, 10, 0xf6800000},
{0, 11, 0xfb400000}, {0, 3, 0xe0000000},
{0, 5, 0xf8000000}, {0, 23, 0xe0202000},
{0, 13, 0xf0380000}, {0, 13, 0xf0380000},
{0, 3, 0xe0000000}, {0, 8, 0xd0000000},
{0, 7, 0xe0000000}, {0, 8, 0xf0000000},
{0, 5, 0xf8000000}, {0, 2, 0xc0000000},
{0, 8, 0xf5000000}, {0, 12, 0xf8d00000},
{0, 6, 0xc0000000}, {0, 9, 0xe8000000},
{0, 10, 0xf4000000}, {0, 15, 0xfaa00000},
};
/* Motor Quake (MQ) predefined patterns */
const dVibration_c::vib_pattern dVibration_c::MQ_patt[12] = {
{0, 0, 0 }, {1, 32, 0x10202020},
{1, 32, 0x42104208}, {2, 32, 0x22222222},
{2, 32, 0x22492249}, {3, 32, 0x52525252},
{3, 32, 0x4a94aa95}, {4, 32, 0x36555655},
{4, 32, 0x6b6d6b6d}, {0, 3, 0x80000000},
{0, 3, 0xc0000000}, {0, 32, 0xaaaaa000},
};
/* Camera Quake (CQ) predefined patterns */
const dVibration_c::vib_pattern dVibration_c::CQ_patt[12] = { /* identical to CQ_patt */
{0, 0, 0 }, {1, 32, 0x10202020},
{1, 32, 0x42104208}, {2, 32, 0x22222222},
{2, 32, 0x22492249}, {3, 32, 0x52525252},
{3, 32, 0x4a94aa95}, {4, 32, 0x36555655},
{4, 32, 0x6b6d6b6d}, {0, 3, 0x80000000},
{0, 3, 0xc0000000}, {0, 32, 0xaaaaa000},
};
Loading

0 comments on commit fccc40e

Please sign in to comment.