Fix ADV and BUNKI animation polish

This commit is contained in:
gamer147
2026-07-27 11:15:41 -04:00
parent 843b282cc4
commit 50a6bd5a40
11 changed files with 199 additions and 19 deletions

View File

@@ -84,6 +84,15 @@ public readonly record struct RenderObject(long Handle, long SurfaceResId, long
Affine2D? RangeTransform = null,
bool TimeVarying = false);
/// <summary>The retained handle interval selected by an op-0x222 backbuffer publication.</summary>
public readonly record struct GfxHandleRange(long First, long Count)
{
public static GfxHandleRange All => new(0, long.MaxValue);
public bool Contains(long handle)
=> Count > 0 && handle >= First && (ulong)(handle - First) < (ulong)Count;
}
/// <summary>Host-agnostic model of the AGE native gfx command-buffer (reversed in
/// docs/engine-re.md, gfx op-contract table). One registry maps an object handle to a GfxObject — the
/// native retained-gfx owner+0x408 map (EngineCtx+0x46a1c) that op 0x215 queries and the geometry get/set ops share. Each object carries a

View File

@@ -31,6 +31,20 @@ public readonly record struct Affine2D(double XX, double XY, double YX, double Y
inverse = new(xx, xy, yx, yy, -(TX * xx + TY * yx), -(TX * xy + TY * yy));
return true;
}
/// <summary>Decompose the projected axes for a Godot-style canvas item. AGE's ordinary retained
/// transforms contain scale/rotation but no shear; the determinant preserves reflected Y axes.</summary>
public (double RotationRadians, double ScaleX, double ScaleY) DecomposeCanvasAxes()
{
double scaleX = System.Math.Sqrt(XX * XX + XY * XY);
double scaleY = System.Math.Sqrt(YX * YX + YY * YY);
double determinant = XX * YY - XY * YX;
if (determinant < 0) scaleY = -scaleY;
double rotation = scaleX > 1e-12
? System.Math.Atan2(XY, XX)
: System.Math.Atan2(-YX, YY);
return (rotation, scaleX, scaleY);
}
}
/// <summary>Exact 2D projection of AGE's row-vector retained-object matrix. Native call order is anchored