phase(N.4) Tasks 16+18+19: AnimatedEntityState + AnimPartChange + HiddenParts
Per-entity render state for the per-instance rendering tier (server-spawned characters / creatures / equipped items). Holds: - partGfxObjOverrides: Dictionary<int, ulong> — AnimPartChange swaps (e.g. wielding a weapon replaces a hand-part's GfxObj). - hiddenMask: ulong — HiddenParts bitmask. Bit i set hides part i. - AnimationSequencer reference — N.4 doesn't touch the sequencer; this just exposes it for the draw dispatcher. Public API: HideParts / IsPartHidden / SetPartOverride / TryGetPartOverride / ResolvePartGfxObj. Bounds-checked (partIdx < 0 or >= 64 → IsPartHidden returns false). Twelve tests covering the type, the AnimPartChange resolution helper, and the HiddenParts bitmask edge cases (theories for 0b0/0b1/MSB/all-ones, plus negative-index + out-of-range guards). Consumed by Task 17's EntitySpawnAdapter (creates one per CreateObject) and Task 22's WbDrawDispatcher (reads via per-part draw loop). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
36f7a601c4
commit
ce72c574e9
4 changed files with 230 additions and 0 deletions
|
|
@ -0,0 +1,45 @@
|
|||
using AcDream.App.Rendering.Wb;
|
||||
using AcDream.Core.Physics;
|
||||
using DatReaderWriter.DBObjs;
|
||||
using Xunit;
|
||||
|
||||
namespace AcDream.Core.Tests.Rendering.Wb;
|
||||
|
||||
public sealed class AnimatedEntityStateTests
|
||||
{
|
||||
[Fact]
|
||||
public void DefaultState_HasNoOverridesAndNoHiddenParts()
|
||||
{
|
||||
var state = MakeState();
|
||||
|
||||
Assert.False(state.IsPartHidden(0));
|
||||
Assert.False(state.IsPartHidden(63));
|
||||
Assert.False(state.TryGetPartOverride(0, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sequencer_AccessibleAsProperty()
|
||||
{
|
||||
var sequencer = MakeSequencer();
|
||||
var state = new AnimatedEntityState(sequencer);
|
||||
|
||||
Assert.Same(sequencer, state.Sequencer);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Construct_WithNullSequencer_ThrowsArgumentNull()
|
||||
{
|
||||
Assert.Throws<System.ArgumentNullException>(
|
||||
() => new AnimatedEntityState(null!));
|
||||
}
|
||||
|
||||
private static AnimatedEntityState MakeState() => new(MakeSequencer());
|
||||
|
||||
private static AnimationSequencer MakeSequencer()
|
||||
=> new AnimationSequencer(new Setup(), new MotionTable(), new NullAnimationLoader());
|
||||
|
||||
private sealed class NullAnimationLoader : IAnimationLoader
|
||||
{
|
||||
public Animation? LoadAnimation(uint id) => null;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue