• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Tatsh / dade / 33642771235
100%

Build:
DEFAULT BRANCH: master
Ran 02 Sep 2026 02:36PM UTC
Jobs 5
Files 291
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

02 Sep 2026 02:31PM UTC coverage: 99.965% (-0.04%) from 100.0%
33642771235

push

github

Tatsh
fix(maxpayne): place Max Payne 2 props on their mesh midpoint and pace their clips

A dynamic mesh writes its vertices about their own midpoint rather than about the state
machine that places it. The vector stating where that midpoint falls was being read as the
third component of the prop's bounding box, so it was dropped and every prop sat offset by
it.

It is not part of the bounding box. X_LevelDynamicMesh::construct @ 100045b0 reads exactly
two M_Vector3 into stack locals and drops them; the third is read by X_LevelMesh::construct
@ 1000abc0, whose first act is `LEA EDX,[ESI + 0x10]` / `CALL dword ptr [0x10011258]` --
the same M_Vector3 operator>> a room uses for its own two -- ahead of the `TEST BL,BL` that
decides whether geometry follows. It lands on the member X_LevelMesh::getMidpoint returns
(`LEA EAX,[ECX + 0x10]`), which X_LevelDynamicMesh::getMeshMidpoint @ 10003ca0 forwards to.

A prop therefore stands at `(vertex + midpoint) * fsm_matrix`, with the midpoint turned by
the matrix, and its clips need the same correction on both transforms. Two independent
measurements fix the direction. 10_Police_Station's vending machine cover states
(0.047, -0.078, 0.112): mapping its UVs through the machine body's own front-plane mapping
puts the panel at y in [-4.29, -3.19], and the recess it closes spans y in [-4.294, -3.200].
Across the twenty-four Game levels, props whose base meets a floor exactly go from 119 of
1671 to 854. A cell door is the clearest case, its state machine being the hinge at the top:
without the midpoint it hangs 1.5 units over a floor at y = -10.

Clips were also paced wrongly. The second game states a time with every curve sample and
rarely spaces them evenly -- 898 of the 2454 curves in the first six levels are uneven --
and the times were being discarded for an even spread. The curve is a Catmull-Rom spline,
not a straight line between samples: T_GraphCurve::construct @ 100025f0 in T_GraphMFC.dll
stores the type at [ESI+0x4]... (continued)

5338 of 5342 branches covered (99.93%)

Branch coverage included in aggregate %.

64 of 69 new or added lines in 2 files covered. (92.75%)

20546 of 20551 relevant lines covered (99.98%)

5.0 hits per line

Uncovered Changes

Lines Coverage ∆ File
5
98.56
-1.44% dade/maxpayne/gltf.py
Jobs
ID Job ID Ran Files Coverage
1 33642771235.1 02 Sep 2026 02:36PM UTC 291
99.97
GitHub Action Run
2 33642771235.2 02 Sep 2026 02:37PM UTC 291
99.97
GitHub Action Run
3 33642771235.3 02 Sep 2026 02:38PM UTC 291
99.97
GitHub Action Run
4 33642771235.4 02 Sep 2026 02:39PM UTC 291
99.97
GitHub Action Run
5 33642771235.5 02 Sep 2026 02:39PM UTC 291
99.97
GitHub Action Run
Source Files on build 33642771235
  • Tree
  • List 291
  • Changed 2
  • Source Changed 2
  • Coverage Changed 2
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #33642771235
  • 7f42b6f5 on github
  • Prev Build on master (#33599903377)
  • Next Build on master (#33945475088)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc