using System.Collections.Generic; using AcDream.App.Rendering.Wb; using Xunit; namespace AcDream.App.Tests.Rendering.Wb; public sealed class WbDrawDispatcherClipSlotTests { private const uint VisibleCellA = 0xA9B4_0164u; private const uint VisibleCellB = 0xA9B4_0165u; private const uint NotVisibleCell = 0xA9B4_0999u; private const uint OutdoorCell = 0xA9B4_0020u; private const int SlotA = 3; private const int SlotB = 7; private const int OutsideViewSlot = 11; private static IReadOnlyDictionary Routing() => new Dictionary { [VisibleCellA] = SlotA, [VisibleCellB] = SlotB, }; [Fact] public void RawResolve_LiveEntity_WithVisibleIndoorParent_GetsThatCellSlot() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0x5000_000Au, parentCellId: VisibleCellA, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(SlotA, slot); } [Fact] public void RawResolve_LiveEntity_WithHiddenIndoorParent_IsCulled() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0x5000_000Au, parentCellId: NotVisibleCell, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(WbDrawDispatcher.ClipSlotCull, slot); } [Fact] public void RawResolve_LiveEntity_WithOutdoorParent_UsesOutsideViewWhenVisible() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0x5000_000Au, parentCellId: OutdoorCell, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(OutsideViewSlot, slot); } [Fact] public void RawResolve_LiveEntity_WithParentNull_IsCulledWhenRoutingActive() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0x5000_000Au, parentCellId: null, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(WbDrawDispatcher.ClipSlotCull, slot); } [Fact] public void RawResolve_CellStatic_InVisibleSet_GetsThatCellSlot() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0u, parentCellId: VisibleCellB, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(SlotB, slot); } [Fact] public void RawResolve_CellStatic_NotInVisibleSet_IsCulled() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0u, parentCellId: NotVisibleCell, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(WbDrawDispatcher.ClipSlotCull, slot); } [Fact] public void RawResolve_OutdoorStab_OutdoorsVisible_GetsOutsideViewSlot() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0u, parentCellId: null, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(OutsideViewSlot, slot); } [Fact] public void RawResolve_OutdoorStab_OutdoorsNotVisible_IsCulled() { int slot = WbDrawDispatcher.ResolveEntitySlot( serverGuid: 0u, parentCellId: null, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: false); Assert.Equal(WbDrawDispatcher.ClipSlotCull, slot); } [Fact] public void ForFrame_RoutingInactive_EveryEntityIsSlot0AndNotCulled() { var live = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: false, serverGuid: 0x5000_000Au, parentCellId: null, cellIdToSlot: null, outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal(0u, live.Slot); Assert.False(live.Culled); var wouldCull = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: false, serverGuid: 0u, parentCellId: NotVisibleCell, cellIdToSlot: null, outdoorSlot: OutsideViewSlot, outdoorVisible: false); Assert.Equal(0u, wouldCull.Slot); Assert.False(wouldCull.Culled); } [Fact] public void ForFrame_RoutingActive_LiveEntityVisible_GetsCellSlotNotCulled() { var r = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: true, serverGuid: 0x5000_000Au, parentCellId: VisibleCellA, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal((uint)SlotA, r.Slot); Assert.False(r.Culled); } [Fact] public void ForFrame_RoutingActive_LiveEntityParentNull_Culled() { var r = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: true, serverGuid: 0x5000_000Au, parentCellId: null, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.True(r.Culled); Assert.Equal(0u, r.Slot); } [Fact] public void ForFrame_RoutingActive_CellStaticVisible_GetsCellSlotNotCulled() { var r = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: true, serverGuid: 0u, parentCellId: VisibleCellA, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal((uint)SlotA, r.Slot); Assert.False(r.Culled); } [Fact] public void ForFrame_RoutingActive_CellStaticNotVisible_Culled() { var r = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: true, serverGuid: 0u, parentCellId: NotVisibleCell, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.True(r.Culled); Assert.Equal(0u, r.Slot); } [Fact] public void ForFrame_RoutingActive_OutdoorStabVisible_GetsOutsideViewSlot() { var r = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: true, serverGuid: 0u, parentCellId: null, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: true); Assert.Equal((uint)OutsideViewSlot, r.Slot); Assert.False(r.Culled); } [Fact] public void ForFrame_RoutingActive_OutdoorStabNotVisible_Culled() { var r = WbDrawDispatcher.ResolveSlotForFrame( clipRoutingActive: true, serverGuid: 0u, parentCellId: null, cellIdToSlot: Routing(), outdoorSlot: OutsideViewSlot, outdoorVisible: false); Assert.True(r.Culled); Assert.Equal(0u, r.Slot); } }