using System.Numerics; using AcDream.App.Rendering; namespace AcDream.App.Tests.Rendering; public sealed class TerrainParticleCellVisibilityTests { [Fact] public void CollectVisibleCells_PublishesLandscapeCellsWithoutEntitySurvivors() { var cells = new HashSet(); TerrainModernRenderer.CollectVisibleCells( cells, 0xA9B4FFFFu, Vector3.Zero, zMin: 0f, zMax: 20f, frustum: null, Matrix4x4.Identity, ReadOnlySpan.Empty); Assert.Equal(64, cells.Count); Assert.Contains(0xA9B40001u, cells); Assert.Contains(0xA9B40040u, cells); } [Fact] public void CollectVisibleCells_ForceDrawnParentStillUsesCellFrustum() { var cells = new HashSet(); FrustumPlanes frustum = FrustumPlanes.FromViewProjection(Matrix4x4.Identity); // The parent landblock may have entered TerrainModernRenderer's draw // list through neverCullLandblockId. The cell collector deliberately // receives no such bypass and still rejects its off-frustum cells. TerrainModernRenderer.CollectVisibleCells( cells, 0xA9B4FFFFu, new Vector3(100f, 100f, 100f), zMin: 100f, zMax: 120f, frustum, Matrix4x4.Identity, ReadOnlySpan.Empty); Assert.Empty(cells); } [Fact] public void CollectVisibleCells_RejectsCellsOutsideDoorwayClipPlanes() { var cells = new HashSet(); var planes = new[] { new Vector4(-1f, 0f, 0f, -2f) }; TerrainModernRenderer.CollectVisibleCells( cells, 0xA9B4FFFFu, Vector3.Zero, zMin: 0f, zMax: 20f, frustum: null, Matrix4x4.Identity, planes); Assert.Empty(cells); } [Fact] public void CollectVisibleCells_RejectsCellsOutsideDoorwayScissorAabb() { var cells = new HashSet(); TerrainModernRenderer.CollectVisibleCells( cells, 0xA9B4FFFFu, Vector3.Zero, zMin: 0f, zMax: 20f, frustum: null, Matrix4x4.Identity, ReadOnlySpan.Empty, ndcClipAabb: new Vector4(-4f, -4f, -2f, -2f)); Assert.Empty(cells); } [Fact] public void CollectVisibleCells_UnionsCellsFromEveryLandscapeSlice() { var cells = new HashSet(); TerrainModernRenderer.CollectVisibleCells( cells, 0xA9B4FFFFu, Vector3.Zero, zMin: 0f, zMax: 20f, frustum: null, Matrix4x4.Identity, ReadOnlySpan.Empty, ndcClipAabb: new Vector4(1f, -1_000f, 23f, 1_000f)); TerrainModernRenderer.CollectVisibleCells( cells, 0xA9B4FFFFu, Vector3.Zero, zMin: 0f, zMax: 20f, frustum: null, Matrix4x4.Identity, ReadOnlySpan.Empty, ndcClipAabb: new Vector4(49f, -1_000f, 71f, 1_000f)); Assert.Equal(16, cells.Count); Assert.Contains(0xA9B40001u, cells); Assert.Contains(0xA9B40011u, cells); Assert.DoesNotContain(0xA9B40009u, cells); } }