Skip to content

Refactor wwmath and fix issues in weapon and EulerAnglesClass - #7

Open
Okladnoj wants to merge 7 commits into
okji/feat/deterministic-math-v2from
okji/feat/deterministic-math-v2.2.4
Open

Refactor wwmath and fix issues in weapon and EulerAnglesClass#7
Okladnoj wants to merge 7 commits into
okji/feat/deterministic-math-v2from
okji/feat/deterministic-math-v2.2.4

Conversation

@Okladnoj

@Okladnoj Okladnoj commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Math Refactoring

This PR contains only the math refactoring recommended by @bobtista and @Caball009 in their reviews — 7 commits, 23 files, all under WWMath and its call sites. Scope is closed; further math work will come as separate PRs.

The non-math fixes that used to be bundled here were split out into their own upstream PRs and are no longer part of this branch:

This PR is a sub-part of the fundamental milestone tracked in TheSuperHackers#2670, where the final deterministic math implementation is waiting for its time.

To verify RETAIL=1 compatibility, I use my own workflow that runs retail replays—the golden set—in VC6 mode.

To verify deterministic math support, I use the 1x1x2x2x2_mac_win_3.rep replay (118,800 frames), running it simultaneously on macOS and Windows.

1x1x2x2x2_mac_win_3.rep.zip

@cursor

cursor Bot commented Aug 3, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

…wrappers

These five _Legacy wrappers are bit-identical to their non-Legacy siblings
in every math mode (verified exhaustively and independently), so route all
callers to the siblings and drop the wrappers. Force float binding where a
call site passed a double literal or double expression, to keep the original
single-precision behaviour and avoid selecting the true-double overload.

Kept: Fabsf/Sinf/Cosf/Inv_Sqrt _Legacy, which differ under retail (x87 asm,
bit twiddle, NaN handling) and must stay to preserve RETAIL_COMPATIBLE_CRC.
Matrix3D elements are float, so passing double sy/cy to WWMath::Atan2
produced mixed (double, float) argument lists that matched neither the
float nor the double overload after the _Legacy wrappers were removed
in 3860582, causing error C2666.
…loat

TheSuperHackers @refactor Okladnoj

Sqrt(int) collapsed to the same numeric result as Sqrt(float): in DET it
already truncated the argument to float (gm_sqrtf((float)x)); in RETAIL it
returned (float)sqrt((double)x). After removal an int argument would be
ambiguous between Sqrt(float)/Sqrt(double), so the pathfinding call sites in
AIPathfind (Int dx,dy cell deltas) get an explicit (float) cast.

This preserves CRC bit-for-bit in both modes: DET is identical, RETAIL is
identical because the int magnitudes (dx*dx+dy*dy of cell coordinates) are
far below 2^24 and thus exactly representable in float.
TheSuperHackers @refactor Okladnoj

Finish the constant-only WWMath conversion in W3DMouse::draw() (WWMATH_HALF_PI)
by also routing the scroll-cursor angle through WWMath::Atan2 instead of the
raw libm atan2, per review consensus (either all operations through WWMath or
revert the constant). Cursor rendering is not part of the simulation CRC.
…c branch

TheSuperHackers @refactor Okladnoj

Finish the Sqrt consolidation per review: the non-deterministic branch of
Sqrt(float) now calls sqrtf(x) directly instead of (float)Sqrt((double)x),
dropping the float->double->float round-trip left over from the old
Sqrt_Legacy removal.

CRC is preserved bit-for-bit: sqrtf(x) == (float)sqrt((double)x) == x87 fsqrt
across all 2^31 non-negative float encodings (VC6, MSVC x86/x64; 0 divergences),
and double rounding is harmless for sqrt. The deterministic branch (gm_sqrtf)
is unchanged.
The WWVegas include restructuring removed the per-directory include path from core_wwlib, so the unqualified include of wwmath.h no longer resolves.
@Okladnoj
Okladnoj force-pushed the okji/feat/deterministic-math-v2.2.4 branch from 2a23091 to 4a3002d Compare August 3, 2026 17:18
@Okladnoj
Okladnoj changed the base branch from okji/feat/deterministic-math-v2.2.3 to okji/feat/deterministic-math-v2 August 3, 2026 17:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant