Skip to content

mover: the character mover's plane solver, and the dynamics plan - #12

Merged
nicolas-maman merged 1 commit into
mainfrom
feat/mover
Sep 20, 2026
Merged

nicolas-maman merged 1 commit into
mainfrom
feat/mover

Conversation

@nicolas-maman

Copy link
Copy Markdown
Contributor

The twelfth layer, and the plan for the rest.

  • aephysics.mover: solve_planes (twenty Gauss-Seidel sweeps, pushes accumulated and clamped to each plane's limit, the slop keeping the mover just off the surface) and clip_vector.
  • test_mover.ae: the reference's solver cases plus every mover collision that needs no world (sphere, capsule, hull, mesh, height field), a corner, a soft plane and the clip. 56 checks. The world-bound cases (materials through a world, filters, the time of impact) come with the world.
  • bench/mover.ae vs bench/mover_box3d.c: equal sums, one iteration's difference in 1.7 million, 0.9x.
  • design.md item 13: the dynamics cut. The reference's world files call into each other freely; in Aether that becomes mesh_contact, broad_phase (pair filter and emission as visitors), dynamics (the world's state and bookkeeping, no stepping, with its own tests plus the step-free parts of test_body/test_world), contact_solver, joint_solver, solver, physics_world (the step, queries, events; test_body/joint/world/body_query/determinism/large_world and bench pairs on the reference's benchmark scenes).

aephysics.mover, Box3D's mover.c in Aether: the plane solver (twenty
Gauss-Seidel sweeps, the pushes accumulated and clamped to each plane's
limit, the linear slop keeping the mover just off the surface, done
when a sweep's total push falls under the slop) and the velocity clip
against the planes that pushed.

test_mover.ae: the reference's solver cases (two parallel planes, a
game's pair with a deep target) and every mover collision that needs
no world -- the sphere, capsule and hull separated, touching and in
deep overlap, the mesh's back side and mirrored scale, the height
field's back side, report and clockwise winding -- plus a corner, a
soft plane and the clip. 56 checks.

bench/mover.ae against bench/mover_box3d.c: equal sums, one iteration's
difference in 1.7 million, 0.9x the reference's time.

design.md lays out the dynamics: the reference's world is one mutually
recursive body of C, so it becomes mesh_contact, broad_phase (with the
pair filter and emission as visitors), dynamics (the world's state and
bookkeeping without a step), contact_solver, joint_solver, solver and
physics_world, in that order, each with the tests it can carry.
@nicolas-maman
nicolas-maman merged commit 6f0ec09 into main Sep 20, 2026
1 check passed
@nicolas-maman
nicolas-maman deleted the feat/mover branch September 20, 2026 02:14
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