feat(R1-P4): verbatim update_internal / update / advance_to_next_animation
The CSequence frame-advance core (gaps G3/G4/G5/G6/G8/G9/G19), ACE-verified skeleton + retail constants + the P0-pinned leftover carry: - update_internal (0x005255d0): frame_number += framerate*dt; overshoot clamps to the RAW high/low frame with leftover-time computation + animDone; the pose/physics/hook triple fires for EVERY crossed integer frame (ascending fwd / descending rev, strict > < boundaries, NO epsilon, NO safety cap); AnimDone is a LIST-STRUCTURE gate (head != first_cyclic) queuing the global AnimDoneHook; iterative loop carries the leftover into the next node (P0 pin — a lag spike fast-forwards through multiple queued nodes in one tick). - advance_to_next_animation (0x005252b0): four pose ops per transition (subtract1 outgoing @ current frame + residual physics; step — fwd wraps to first_cyclic, REVERSE wraps to the LIST TAIL, asymmetric by design; reseed from the incoming direction-aware boundary; combine incoming + physics). Pose ops run in BOTH directions — ACE's framerate-sign gates are ACE-isms, decomp is unconditional modulo the degenerate-framerate guard. - update (0x00525b80): non-empty -> update_internal + apricot; empty + frame -> accumulated-physics free motion (G8). - execute_hooks (0x00524830): direction filter (Both or match) QUEUING into the IAnimHookQueue host seam (stands in for CPhysicsObj.anim_hooks + the AnimDoneHook singleton; drain placement moves in R6). Null part frame guarded (documented safe divergence vs retail's latent deref). - FrameOps.Combine/Subtract1: the AFrame pose composition (verified math from the pre-R1 port, now against DatReaderWriter Frame). 10 conformance tests: single-tick goldens, exact-integer boundary sit (the old #61 flash class), cyclic wrap without AnimDone, link->cycle fast-forward proving hook order (link hooks -> ANIMDONE -> cycle hooks) AND the carry, reverse descending hooks with the OOB high+1 start, reverse tail-wrap, zero-framerate physics-only, empty-list free motion, pos-frame root motion into the caller Frame, apricot trim via update. Full suite 3346 green. R1 remaining: P5 (adapter cutover — AnimationSequencer rehosted on the core, legacy epsilon/stale-head/safety-cap DELETED) + P6 (root-motion wiring + API narrowing). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
5138b8fb01
commit
658b91d8aa
3 changed files with 518 additions and 0 deletions
|
|
@ -55,4 +55,28 @@ public static class FrameOps
|
|||
/// global through the orientation, then <see cref="GRotate"/>.</summary>
|
||||
public static void Rotate(Frame frame, Vector3 rotationLocal)
|
||||
=> GRotate(frame, Vector3.Transform(rotationLocal, frame.Orientation));
|
||||
|
||||
/// <summary>
|
||||
/// <c>Frame::combine</c> as used by the CSequence pose path (ACE
|
||||
/// <c>AFrame.Combine</c>, verified against the pre-R1 acdream port):
|
||||
/// apply the pose — origin += rotate(pos.Origin by orientation), then
|
||||
/// orientation ∘= pos.Orientation.
|
||||
/// </summary>
|
||||
public static void Combine(Frame frame, Frame pos)
|
||||
{
|
||||
frame.Origin += Vector3.Transform(pos.Origin, frame.Orientation);
|
||||
frame.Orientation = Quaternion.Normalize(frame.Orientation * pos.Orientation);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <c>Frame::subtract1</c> — un-apply the pose: orientation ∘=
|
||||
/// conj(pos.Orientation) FIRST, then origin −= rotate(pos.Origin by the
|
||||
/// UPDATED orientation) (inverse order of <see cref="Combine"/>).
|
||||
/// </summary>
|
||||
public static void Subtract1(Frame frame, Frame pos)
|
||||
{
|
||||
frame.Orientation = Quaternion.Normalize(
|
||||
frame.Orientation * Quaternion.Conjugate(pos.Orientation));
|
||||
frame.Origin -= Vector3.Transform(pos.Origin, frame.Orientation);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue