Skip to content

Commit e6695dd

Browse files
committed
Add more hooks
1 parent 48113d4 commit e6695dd

6 files changed

Lines changed: 54 additions & 16 deletions

File tree

include/game_structs.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,8 +656,17 @@ struct InlineParamBool {
656656
BEType<uint32_t> keyPtr;
657657
};
658658

659+
struct InlineParamFloat {
660+
BEType<float> value;
661+
BaseProcLink procLink;
662+
BEType<uint8_t> gap1C[16+4+4+4];
663+
BEType<uint32_t> type;
664+
BEType<uint32_t> keyPtr;
665+
};
666+
659667
static_assert(sizeof(InlineParamVec3) == 0x34, "InlineParamVec3 size mismatch");
660668
static_assert(sizeof(InlineParamBool) == 0x34, "InlineParamBool size mismatch");
669+
static_assert(sizeof(InlineParamFloat) == 0x34, "InlineParamFloat size mismatch");
661670

662671

663672

resources/BreathOfTheWild_BetterVR/patch_debug_CTRL_Logging_Physics.asm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ bctr
3939
;0x02D66B58 = bla import.coreinit.hook_TestPlayerSetMtxTeleport
4040

4141
; hooks arrow shooting parameters (and other dynamically loaded bools/values inside AI Actions)
42+
0x020E3924 = ba import.coreinit.hook_LoadArrowFallSpeedRatioByRange
43+
0x030EC7B4 = ba import.coreinit.hook_LoadDynamicFloat
4244
0x030EC840 = ba import.coreinit.hook_LoadDynamicVec3
4345
0x030EC8C0 = bla import.coreinit.hook_LoadDynamicBool
4446

src/hooking/cemu_hooks.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ class CemuHooks {
9393
osLib_registerHLEFunction("coreinit", "hook_ProfileSectionEnd", &hook_ProfileSectionEnd);
9494
osLib_registerHLEFunction("coreinit", "hook_LoadDynamicVec3", &hook_LoadDynamicVec3);
9595
osLib_registerHLEFunction("coreinit", "hook_LoadDynamicBool", &hook_LoadDynamicBool);
96+
osLib_registerHLEFunction("coreinit", "hook_LoadDynamicFloat", &hook_LoadDynamicFloat);
97+
osLib_registerHLEFunction("coreinit", "hook_LoadArrowFallSpeedRatioByRange", &hook_LoadArrowFallSpeedRatioByRange);
9698
osLib_registerHLEFunction("coreinit", "hook_VisualizeRayCastHits", &hook_VisualizeRayCastHits);
9799
};
98100
~CemuHooks() {
@@ -256,6 +258,8 @@ class CemuHooks {
256258
static void hook_ProfileSectionEnd(PPCInterpreter_t* hCPU);
257259
static void hook_LoadDynamicVec3(PPCInterpreter_t* hCPU);
258260
static void hook_LoadDynamicBool(PPCInterpreter_t* hCPU);
261+
static void hook_LoadDynamicFloat(PPCInterpreter_t* hCPU);
262+
static void hook_LoadArrowFallSpeedRatioByRange(PPCInterpreter_t* hCPU);
259263

260264
public:
261265
template <typename T>

src/hooking/entity_controller.cpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,24 +1059,39 @@ void CemuHooks::hook_LoadDynamicBool(PPCInterpreter_t* hCPU) {
10591059
hCPU->instructionPointer = hCPU->sprNew.LR;
10601060
hCPU->sprNew.LR = hCPU->gpr[0];
10611061

1062-
InlineParamBool boolParam;
1062+
InlineParamBool boolParam = {};
10631063
readMemory(hCPU->gpr[30], &boolParam);
1064-
1065-
const char* paramString = (char*)(boolParam.keyPtr.getLE() + s_memoryBaseAddress);
1066-
Log::print<PPC>("[{:08X}] Loaded dynamic bool parameter for {}: {}", hCPU->gpr[0], paramString, boolParam.value.getLE());
1067-
1068-
if (std::string(paramString) == "IsShootByPlayer" && boolParam.value.getLE() == 1) {
1069-
Log::print<PPC>("Arrow is being shot by the player!");
1070-
shouldAdjustArrowTarget = true;
1071-
}
1064+
ArrowShotParamCapture::RecordBool(boolParam);
10721065
}
10731066

10741067
void CemuHooks::hook_LoadDynamicVec3(PPCInterpreter_t* hCPU) {
10751068
hCPU->instructionPointer = 0x030EC844;
10761069

1077-
InlineParamVec3 vec3Param;
1070+
InlineParamVec3 vec3Param = {};
10781071
readMemory(hCPU->gpr[31], &vec3Param);
10791072

10801073
vec3Param.value.z = hCPU->fpr[0].fp0;
10811074
writeMemory(hCPU->gpr[31], &vec3Param);
1075+
ArrowShotParamCapture::RecordVec3(vec3Param);
1076+
}
1077+
1078+
void CemuHooks::hook_LoadDynamicFloat(PPCInterpreter_t* hCPU) {
1079+
hCPU->instructionPointer = 0x030EC7B8;
1080+
1081+
uint32_t keyPtr = hCPU->gpr[12];
1082+
writeMemoryBE(hCPU->gpr[31] + 0x30, &keyPtr);
1083+
1084+
InlineParamFloat floatParam = {};
1085+
readMemory(hCPU->gpr[31], &floatParam);
1086+
ArrowShotParamCapture::RecordFloat(floatParam);
1087+
}
1088+
1089+
void CemuHooks::hook_LoadArrowFallSpeedRatioByRange(PPCInterpreter_t* hCPU) {
1090+
hCPU->instructionPointer = 0x020E3928;
1091+
hCPU->gpr[0] = 0x10020000;
1092+
1093+
float fallSpeedRatioByRange = 0.0f;
1094+
readMemoryBE(hCPU->gpr[31] + 0x4C, &fallSpeedRatioByRange);
1095+
ArrowShotParamCapture::RecordFallSpeedRatioByRange(fallSpeedRatioByRange);
1096+
}
10821097
}

src/utils/debug_draw.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ static void AddSolidBox(DebugDrawRenderData& renderData, const glm::vec3* corner
191191
}
192192
}
193193

194-
static void AddArcRibbon(DebugDrawRenderData& renderData, const glm::vec3& start, const glm::vec3& initialVelocity, const glm::vec3& acceleration, float duration, int segments, uint32_t color, bool xray) {
194+
static void AddArcRibbon(DebugDrawRenderData& renderData, const glm::vec3& start, const glm::vec3& initialVelocity, const glm::vec3& acceleration, float duration, int segments, uint32_t color, bool xray, const glm::vec3& cameraPos) {
195195
if (segments < 2 || duration <= 0.0f) {
196196
return;
197197
}
@@ -201,7 +201,6 @@ static void AddArcRibbon(DebugDrawRenderData& renderData, const glm::vec3& start
201201
};
202202

203203
const float arcWidth = ResolveArcWidth(duration);
204-
const glm::vec3 worldUp = glm::vec3(0.0f, 1.0f, 0.0f);
205204
const uint32_t ribbonColor = ScaleColor(color, 0.95f, 0.45f);
206205

207206
for (int i = 0; i < segments; ++i) {
@@ -215,11 +214,17 @@ static void AddArcRibbon(DebugDrawRenderData& renderData, const glm::vec3& start
215214
}
216215

217216
tangent = glm::normalize(tangent);
218-
glm::vec3 right = glm::cross(tangent, worldUp);
217+
const glm::vec3 midPoint = (p0 + p1) * 0.5f;
218+
const glm::vec3 toCamera = glm::normalize(cameraPos - midPoint);
219+
const glm::vec3 worldUp = glm::vec3(0.0f, 1.0f, 0.0f);
220+
glm::vec3 right = glm::cross(tangent, toCamera);
219221
if (glm::length2(right) <= 0.000001f) {
220-
right = glm::cross(tangent, glm::vec3(1.0f, 0.0f, 0.0f));
222+
right = glm::cross(tangent, worldUp);
221223
if (glm::length2(right) <= 0.000001f) {
222-
continue;
224+
right = glm::cross(tangent, glm::vec3(1.0f, 0.0f, 0.0f));
225+
if (glm::length2(right) <= 0.000001f) {
226+
continue;
227+
}
223228
}
224229
}
225230

@@ -394,6 +399,7 @@ DebugDrawRenderData DebugDraw::TakeRenderData(long frameIdx) {
394399
if (eyeState.IsValid()) {
395400
renderData.viewProjections[eyeIndex] = eyeState.viewProjection;
396401
renderData.hasViewProjections[eyeIndex] = true;
402+
renderData.cameraPos = glm::vec3(glm::inverse(eyeState.view)[3]);
397403
}
398404
s_frameDebugEyeStates[frameIdx][eyeIndex].Reset();
399405
}
@@ -404,6 +410,7 @@ DebugDrawRenderData DebugDraw::TakeRenderData(long frameIdx) {
404410
if (eyeState.IsValid()) {
405411
renderData.viewProjections[eyeIndex] = eyeState.viewProjection;
406412
renderData.hasViewProjections[eyeIndex] = true;
413+
renderData.cameraPos = glm::vec3(glm::inverse(eyeState.view)[3]);
407414
}
408415
}
409416
}
@@ -525,7 +532,7 @@ DebugDrawRenderData DebugDraw::TakeRenderData(long frameIdx) {
525532
break;
526533
}
527534

528-
AddArcRibbon(renderData, prim.a, prim.b, prim.c, prim.duration, segments, prim.color, prim.xray);
535+
AddArcRibbon(renderData, prim.a, prim.b, prim.c, prim.duration, segments, prim.color, prim.xray, renderData.cameraPos);
529536

530537
auto evaluatePoint = [&](float t) {
531538
return prim.a + prim.b * t + prim.c * (0.5f * t * t);

src/utils/debug_draw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct DebugDrawRenderData {
2626
std::vector<DebugDrawLineVertex> xrayLineVertices;
2727
std::array<glm::mat4, 2> viewProjections = { glm::mat4(1.0f), glm::mat4(1.0f) };
2828
std::array<bool, 2> hasViewProjections = { false, false };
29+
glm::vec3 cameraPos = glm::vec3(0.0f);
2930

3031
bool IsEmpty() const { return triangleVertices.empty() && lineVertices.empty() && xrayTriangleVertices.empty() && xrayLineVertices.empty(); }
3132
};

0 commit comments

Comments
 (0)