refactor(world): extract live projection mechanics
Move appearance rebinding, collision construction, default-pose resolution, local shadow ownership, and exact leave-world presentation into focused owners. Preserve retail parent ordering with staged validation, committed recovery, recursive attached-subtree withdrawal, and retryable exact teardown across parent, pickup, position, unwield, and pose-loss edges. Co-Authored-By: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
c87bac31a0
commit
69a2ca0c6d
26 changed files with 4172 additions and 430 deletions
|
|
@ -50,11 +50,16 @@ public static class ShadowShapeBuilder
|
|||
/// placement frame per part (entities with no motion table, and the
|
||||
/// CylSphere/Sphere shapes, are unaffected — retail poses those from
|
||||
/// the setup too).</param>
|
||||
/// <param name="effectivePartGfxObjIds">Current part identities after
|
||||
/// retail <c>AnimPartChanged</c> processing. Collision keeps each Setup
|
||||
/// index and pose, but reads PhysicsBSP from the installed replacement.
|
||||
/// Null or short lists fall back to the Setup identity.</param>
|
||||
public static IReadOnlyList<ShadowShape> FromSetup(
|
||||
Setup setup,
|
||||
float entScale,
|
||||
Func<uint, bool> hasPhysicsBsp,
|
||||
IReadOnlyList<Frame>? partPoseOverride = null)
|
||||
IReadOnlyList<Frame>? partPoseOverride = null,
|
||||
IReadOnlyList<uint>? effectivePartGfxObjIds = null)
|
||||
{
|
||||
if (setup is null) throw new ArgumentNullException(nameof(setup));
|
||||
if (hasPhysicsBsp is null) throw new ArgumentNullException(nameof(hasPhysicsBsp));
|
||||
|
|
@ -102,7 +107,14 @@ public static class ShadowShapeBuilder
|
|||
AnimationFrame? placementFrame = ResolvePlacementFrame(setup);
|
||||
for (int i = 0; i < setup.Parts.Count; i++)
|
||||
{
|
||||
uint gfxId = (uint)setup.Parts[i];
|
||||
// Retail CPhysicsPart::SetPart installs AnimPartChanged's current
|
||||
// degrade array before CPartArray::FindObjCollisions reads it.
|
||||
// Keep the stable Setup part index/pose, but source collision
|
||||
// identity from that effective part when one was supplied.
|
||||
uint gfxId = effectivePartGfxObjIds is not null
|
||||
&& i < effectivePartGfxObjIds.Count
|
||||
? effectivePartGfxObjIds[i]
|
||||
: (uint)setup.Parts[i];
|
||||
if (!hasPhysicsBsp(gfxId)) continue;
|
||||
|
||||
Frame partFrame;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue