bone_sse: verify remaining particle sections from assembly
Section 12c (model_hdr+0x134): visibility byte animation pattern verified from assembly at 0x7176C2-0x717774. Byte array indexing, crossfade output at +0xCC (not +0xBC). Position track at entry+0x24 with 12-byte keyframes. Section 12e (model_hdr+0x13C): all 10 tracks verified. Tracks 1-6 use scalar float interpolation (findInterpIdx + 4-byte keyframes). Tracks 7-10 use getInterpolatedFloat (0x71AF20). Track offsets, gate checks, and output positions all confirmed from assembly. SSE dispatch remains disabled pending final testing.
This commit is contained in:
@@ -1621,7 +1621,7 @@ pub fn lateInit() void {
|
||||
// math_sse replacements -- restore original prologues (clobber UnitXP), then hook
|
||||
// A/B tested: CUSTOM=our SSE, BASELINE=original x87
|
||||
// Set MATH_TEST_HOOK to 0 to disable all, 1-18 to enable only that one, 99 for all
|
||||
const MATH_TEST_HOOK: u32 = 99;
|
||||
const MATH_TEST_HOOK: u32 = 14;
|
||||
const MathHook = struct { addr: u32, prologue: []const u8 };
|
||||
const math_hooks = [_]MathHook{
|
||||
.{ .addr = 0x7BCA80, .prologue = &.{ 0x55, 0x8b, 0xec, 0x56, 0x8b, 0x75, 0x08 } }, // 1: vecMulMat4
|
||||
@@ -1643,48 +1643,7 @@ pub fn lateInit() void {
|
||||
.{ .addr = 0x637480, .prologue = &.{ 0x55, 0x8b, 0xec, 0x83, 0xec, 0x18 } }, // 17: planeNormal
|
||||
.{ .addr = 0x6DC470, .prologue = &.{ 0x55, 0x8b, 0xec, 0x83, 0xec, 0x0c } }, // 18: transformAABox
|
||||
};
|
||||
const math_detours = .{
|
||||
abDetour3r(&vecMulMat4_ColMajor, &math_vecMulMat4_hook),
|
||||
abDetour3r(&matMulVec3_RowMajor, &math_matMulVec3_hook),
|
||||
abDetour3r(&quatMulMat4, &math_quatMulMat4_hook),
|
||||
abDetour3r(&vec3MulScalar, &math_vec3MulScalar_hook),
|
||||
abDetour2r(&vec3MulAssign, &math_vec3MulAssign_hook),
|
||||
abDetour2r(&applyTranslationMatrix, &math_applyTranslation_hook),
|
||||
abDetour2r(&scaleMatrix3x3ByVector, &math_scaleByVec_hook),
|
||||
abDetour2v(&scaleMatrix3x3ByScalar, &math_scaleByScalar_hook),
|
||||
abDetour3r(&multiply3x3Matrix, &math_mul3x3_hook),
|
||||
abDetour4r(&createAxisAngleRotMat3x3, &math_rotMat3x3_hook),
|
||||
abDetour4r(&createAxisAngleRotMat4x4, &math_rotMat4x4_hook),
|
||||
abDetour3r(&crossProduct, &math_cross_hook),
|
||||
abDetour2d(&dotProduct, &math_dot_hook),
|
||||
abDetour1d(&squaredMagnitude, &math_sqmag_hook),
|
||||
abDetour2v(&vectorNormalize, &math_normalize_hook),
|
||||
abDetour3d(&evaluatePolynomial, &math_evalPoly_hook),
|
||||
abDetour4v(&calculatePlaneNormal, &math_planeNormal_hook),
|
||||
abDetour5v(&transformAABox, &math_transformAABox_hook),
|
||||
};
|
||||
_ = math_detours; // used below via indexed access
|
||||
const math_hook_ptrs = .{
|
||||
&math_vecMulMat4_hook, &math_matMulVec3_hook, &math_quatMulMat4_hook,
|
||||
&math_vec3MulScalar_hook, &math_vec3MulAssign_hook, &math_applyTranslation_hook,
|
||||
&math_scaleByVec_hook, &math_scaleByScalar_hook, &math_mul3x3_hook,
|
||||
&math_rotMat3x3_hook, &math_rotMat4x4_hook, &math_cross_hook,
|
||||
&math_dot_hook, &math_sqmag_hook, &math_normalize_hook,
|
||||
&math_evalPoly_hook, &math_planeNormal_hook, &math_transformAABox_hook,
|
||||
};
|
||||
_ = math_hook_ptrs; // used conceptually
|
||||
var math_count: u32 = 0;
|
||||
inline for (math_hooks, 0..) |mh, i| {
|
||||
const idx = i + 1;
|
||||
if (MATH_TEST_HOOK == 99 or MATH_TEST_HOOK == idx) {
|
||||
hook.writeProtected(mh.addr, mh.prologue);
|
||||
_ = comptime blk: {
|
||||
_ = i;
|
||||
break :blk {};
|
||||
};
|
||||
}
|
||||
}
|
||||
// Can't do heterogeneous attach in inline for, so do them individually gated by MATH_TEST_HOOK
|
||||
if (MATH_TEST_HOOK == 99 or MATH_TEST_HOOK == 1) { hook.writeProtected(0x7BCA80, math_hooks[0].prologue); _ = math_vecMulMat4_hook.attach(0x7BCA80, abDetour3r(&vecMulMat4_ColMajor, &math_vecMulMat4_hook)); math_count += 1; }
|
||||
if (MATH_TEST_HOOK == 99 or MATH_TEST_HOOK == 2) { hook.writeProtected(0x7BCAE0, math_hooks[1].prologue); _ = math_matMulVec3_hook.attach(0x7BCAE0, abDetour3r(&matMulVec3_RowMajor, &math_matMulVec3_hook)); math_count += 1; }
|
||||
if (MATH_TEST_HOOK == 99 or MATH_TEST_HOOK == 3) { hook.writeProtected(0x7BCB40, math_hooks[2].prologue); _ = math_quatMulMat4_hook.attach(0x7BCB40, abDetour3r(&quatMulMat4, &math_quatMulMat4_hook)); math_count += 1; }
|
||||
|
||||
Reference in New Issue
Block a user