diff --git a/Source/VoxelForge/Private/Tests/VoxelForgeClipmapNoOverlapTest.cpp b/Source/VoxelForge/Private/Tests/VoxelForgeClipmapNoOverlapTest.cpp index 0d02b01..b5c54e6 100644 --- a/Source/VoxelForge/Private/Tests/VoxelForgeClipmapNoOverlapTest.cpp +++ b/Source/VoxelForge/Private/Tests/VoxelForgeClipmapNoOverlapTest.cpp @@ -122,22 +122,15 @@ namespace const int32 MaxLevel = FMath::Clamp(Parameters.MaxClipLevel, 0, 8); const int32 OuterRadius = VoxelClipmapDesiredTiles::OuterShellRadius( Parameters, Radius, MaxLevel); - int32 SheetLevel = MaxLevel; - int32 SheetRadius = OuterRadius; - VoxelClipmapDesiredTiles::OuterShell( - Parameters, Radius, MaxLevel, SheetLevel, SheetRadius); - const bool bSheetRing = SheetLevel > MaxLevel; - const int32 MaxMCRingLevel = bSheetRing ? SheetLevel - 1 : MaxLevel; - for (int32 Level = 0; Level <= MaxMCRingLevel; ++Level) + for (int32 Level = 0; Level <= MaxLevel; ++Level) { const int32 Pow = 1 << Level; const FIntVector CenterLevel = VoxelClipmapDesiredTiles::FloorDiv(Center, Pow); const FIntVector CenterFiner = Level > 0 ? VoxelClipmapDesiredTiles::FloorDiv(Center, Pow >> 1) : FIntVector::ZeroValue; - const int32 LevelRadius = (Level == MaxLevel && !bSheetRing) - ? OuterRadius : Radius; + const int32 LevelRadius = (Level == MaxLevel) ? OuterRadius : Radius; int32 DeltaZMin = -LevelRadius; int32 DeltaZMax = LevelRadius; @@ -178,50 +171,6 @@ namespace OutTiles.Emplace(Tile, Level); } } - - if (bSheetRing) - { - const int32 SheetPow = 1 << SheetLevel; - const FIntVector CenterSheet = VoxelClipmapDesiredTiles::FloorDiv(Center, SheetPow); - const FIntVector CenterMC = VoxelClipmapDesiredTiles::FloorDiv( - Center, 1 << MaxMCRingLevel); - const int32 LevelDelta = SheetLevel - MaxMCRingLevel; - - int32 DeltaZMin = -SheetRadius; - int32 DeltaZMax = SheetRadius; - if (MinChunkZ != MIN_int32) - { - DeltaZMin = FMath::Max(DeltaZMin, - VoxelClipmapDesiredTiles::FloorDiv(MinChunkZ, SheetPow) - CenterSheet.Z); - DeltaZMax = FMath::Min(DeltaZMax, - VoxelClipmapDesiredTiles::FloorDiv(MaxChunkZ, SheetPow) - CenterSheet.Z); - } - - for (int32 DeltaZ = DeltaZMin; DeltaZ <= DeltaZMax; ++DeltaZ) - for (int32 DeltaY = -SheetRadius; DeltaY <= SheetRadius; ++DeltaY) - for (int32 DeltaX = -SheetRadius; DeltaX <= SheetRadius; ++DeltaX) - { - const FIntVector Tile = CenterSheet + FIntVector(DeltaX, DeltaY, DeltaZ); - const int32 TileMinZ = Tile.Z << SheetLevel; - const int32 TileMaxZ = ((Tile.Z + 1) << SheetLevel) - 1; - if (TileMaxZ < MinChunkZ || TileMinZ > MaxChunkZ) - { - continue; - } - - const bool bCovered = - ((Tile.X << LevelDelta) >= CenterMC.X - Radius) - && ((((Tile.X + 1) << LevelDelta) - 1) <= CenterMC.X + Radius) - && ((Tile.Y << LevelDelta) >= CenterMC.Y - Radius) - && ((((Tile.Y + 1) << LevelDelta) - 1) <= CenterMC.Y + Radius) - && ((Tile.Z << LevelDelta) >= CenterMC.Z - Radius) - && ((((Tile.Z + 1) << LevelDelta) - 1) <= CenterMC.Z + Radius); - if (!bCovered) - { - OutTiles.Emplace(Tile, SheetLevel); - } - } - } } static FString DescribeMeasure(const FOverlapMeasure& Measure) @@ -245,7 +194,6 @@ bool FVoxelForgeClipmapNoOverlapTest::RunTest(const FString& Parameters) Owner.ClipRadius = 3; Owner.MaxClipLevel = 5; Owner.RenderDistanceChunks = 768; - Owner.bFarSheetRing = false; FParameters Defaults; @@ -291,16 +239,13 @@ bool FVoxelForgeClipmapNoOverlapTest::RunTest(const FString& Parameters) int32 Radius; int32 MaxLevel; int32 RenderDistance; - bool bSheet; - int32 SheetSpan; }; static const FSweepSettings SweepSettings[] = { - {1, 0, 0, false, 2}, - {2, 2, 0, false, 2}, - {3, 4, 0, false, 2}, - {2, 3, 49, false, 2}, - {2, 3, 49, true, 2}, - {2, 4, 87, true, 3}, + {1, 0, 0}, + {2, 2, 0}, + {3, 4, 0}, + {2, 3, 49}, + {2, 4, 87}, }; int32 SweptCases = 0; @@ -319,8 +264,6 @@ bool FVoxelForgeClipmapNoOverlapTest::RunTest(const FString& Parameters) P.ClipRadius = Sweep.Radius; P.MaxClipLevel = Sweep.MaxLevel; P.RenderDistanceChunks = Sweep.RenderDistance; - P.bFarSheetRing = Sweep.bSheet; - P.FarSheetSpanLevels = Sweep.SheetSpan; // Exercise the unbounded view, a tight local clamp, and a clamp crossing a tile boundary. for (int32 ClampCase = 0; ClampCase < 3; ++ClampCase) @@ -353,9 +296,9 @@ bool FVoxelForgeClipmapNoOverlapTest::RunTest(const FString& Parameters) if (FirstFailure.IsEmpty()) { FirstFailure = FString::Printf( - TEXT("overlap center=(%d,%d,%d) radius=%d level=%d distance=%d sheet=%d clamp=%d: %s"), + TEXT("overlap center=(%d,%d,%d) radius=%d level=%d distance=%d clamp=%d: %s"), X, Y, Z, Sweep.Radius, Sweep.MaxLevel, Sweep.RenderDistance, - Sweep.bSheet ? 1 : 0, ClampCase, *DescribeMeasure(CurrentOverlap)); + ClampCase, *DescribeMeasure(CurrentOverlap)); } } if (!CoversEveryLegacyTile(Legacy, Current, MinZ, MaxZ)) @@ -364,9 +307,9 @@ bool FVoxelForgeClipmapNoOverlapTest::RunTest(const FString& Parameters) if (FirstFailure.IsEmpty()) { FirstFailure = FString::Printf( - TEXT("coverage center=(%d,%d,%d) radius=%d level=%d distance=%d sheet=%d clamp=%d"), + TEXT("coverage center=(%d,%d,%d) radius=%d level=%d distance=%d clamp=%d"), X, Y, Z, Sweep.Radius, Sweep.MaxLevel, Sweep.RenderDistance, - Sweep.bSheet ? 1 : 0, ClampCase); + ClampCase); } } } diff --git a/Source/VoxelForge/Private/Tests/VoxelForgeVerticalStrateReachTest.cpp b/Source/VoxelForge/Private/Tests/VoxelForgeVerticalStrateReachTest.cpp index 9815bac..5eac2a3 100644 --- a/Source/VoxelForge/Private/Tests/VoxelForgeVerticalStrateReachTest.cpp +++ b/Source/VoxelForge/Private/Tests/VoxelForgeVerticalStrateReachTest.cpp @@ -29,15 +29,13 @@ bool FVoxelForgeVerticalStrateReachTest::RunTest(const FString& Parameters) Clipmap.ClipRadius = 3; Clipmap.MaxClipLevel = 3; Clipmap.RenderDistanceChunks = 768; - Clipmap.bFarSheetRing = true; - Clipmap.FarSheetSpanLevels = 2; TArray Desired; VoxelClipmapDesiredTiles::Build( FIntVector(0, 0, PlayerChunkZ), MinChunkZ, MaxChunkZ, Clipmap, Desired); TArray CountsByLevel; - CountsByLevel.Init(0, 6); + CountsByLevel.Init(0, 4); for (const FVoxelTileKey& Tile : Desired) { if (CountsByLevel.IsValidIndex(Tile.Level)) @@ -46,7 +44,9 @@ bool FVoxelForgeVerticalStrateReachTest::RunTest(const FString& Parameters) } } - const int32 ExpectedCounts[] = {343, 218, 178, 178, 178, 9586}; + // Aligned rings (child-pair boundaries) below MaxClipLevel; the MaxClipLevel ring is stretched + // to the 768-chunk render distance (radius 96 at level 3) and clamped to the strate's Z band. + const int32 ExpectedCounts[] = {512, 320, 272, 372442}; for (int32 Level = 0; Level < static_cast(UE_ARRAY_COUNT(ExpectedCounts)); ++Level) { TestEqual(FString::Printf(TEXT("desired tile count at level %d"), Level), @@ -63,26 +63,28 @@ bool FVoxelForgeVerticalStrateReachTest::RunTest(const FString& Parameters) TestTrue(TEXT("level 0 tile around the high pawn is present"), HasTile(0, FIntVector(0, 0, 0))); - TestTrue(TEXT("level 4 bridge tile covering the ground below the pawn is present"), - HasTile(4, FIntVector(0, 0, -3))); - TestTrue(TEXT("adjacent level 4 ground tile is present"), - HasTile(4, FIntVector(1, 0, -3))); - TestTrue(TEXT("outer level 5 sheet reaches the 768-chunk horizon"), - HasTile(5, FIntVector(24, 0, 0))); + TestTrue(TEXT("level 3 tile covering the ground below the pawn is present"), + HasTile(3, FIntVector(0, 0, -8))); + TestTrue(TEXT("adjacent level 3 ground tile is present"), + HasTile(3, FIntVector(1, 0, -8))); + TestTrue(TEXT("the outer level 3 ring reaches the 768-chunk horizon"), + HasTile(3, FIntVector(96, 0, 0))); + TestFalse(TEXT("the outer ring stops at the 768-chunk horizon"), + HasTile(3, FIntVector(97, 0, 0))); TestFalse(TEXT("clamping does not request a full hidden LOD0 column"), HasTile(0, FIntVector(0, 0, -47))); - for (int32 Level = 0; Level <= 5; ++Level) + for (int32 Level = 0; Level <= 3; ++Level) { TestTrue(FString::Printf(TEXT("clip level %d is non-empty"), Level), CountsByLevel[Level] > 0); } AddInfo(FString::Printf( - TEXT("center_z=%d strate=[%d..%d] view=[%d..%d] levels=[%d,%d,%d,%d,%d,%d] total=%d"), + TEXT("center_z=%d strate=[%d..%d] view=[%d..%d] levels=[%d,%d,%d,%d] total=%d"), PlayerChunkZ, StrateBottomZ, StrateTopZ, MinChunkZ, MaxChunkZ, CountsByLevel[0], CountsByLevel[1], CountsByLevel[2], CountsByLevel[3], - CountsByLevel[4], CountsByLevel[5], Desired.Num())); + Desired.Num())); return true; } diff --git a/Source/VoxelForge/Private/VoxelClipmapDesiredTiles.h b/Source/VoxelForge/Private/VoxelClipmapDesiredTiles.h index afb71e7..6cf9c2f 100644 --- a/Source/VoxelForge/Private/VoxelClipmapDesiredTiles.h +++ b/Source/VoxelForge/Private/VoxelClipmapDesiredTiles.h @@ -9,10 +9,6 @@ namespace VoxelClipmapDesiredTiles int32 ClipRadius = 3; int32 MaxClipLevel = 4; int32 RenderDistanceChunks = 0; - // Far sheet ring selection. AVoxelWorld always passes false (the runtime does not mesh - // sheets); it stays here because the clipmap automation tests still exercise it. - bool bFarSheetRing = true; - int32 FarSheetSpanLevels = 2; }; FORCEINLINE int32 FloorDiv(int32 Value, int32 Divisor) @@ -62,12 +58,6 @@ namespace VoxelClipmapDesiredTiles { OutLevel = MaxLevel; OutRadius = OuterShellRadius(Parameters, Radius, MaxLevel); - if (Parameters.bFarSheetRing && OutRadius > Radius) - { - OutLevel = MaxLevel + FMath::Clamp(Parameters.FarSheetSpanLevels, 1, 4); - OutRadius = FMath::Max(1, - (Parameters.RenderDistanceChunks + (1 << OutLevel) - 1) >> OutLevel); - } } FORCEINLINE void ResolveVerticalBounds( @@ -99,37 +89,21 @@ namespace VoxelClipmapDesiredTiles const int32 Radius = FMath::Max(1, Parameters.ClipRadius); const int32 MaxLevel = FMath::Clamp(Parameters.MaxClipLevel, 0, 8); const int32 OuterRadius = OuterShellRadius(Parameters, Radius, MaxLevel); - int32 SheetLevel = MaxLevel; - int32 SheetRadius = OuterRadius; - OuterShell(Parameters, Radius, MaxLevel, SheetLevel, SheetRadius); - const bool bSheetRing = SheetLevel > MaxLevel; - const int32 MaxMCRingLevel = bSheetRing ? SheetLevel - 1 : MaxLevel; FIntVector PreviousRingMin = FIntVector::ZeroValue; FIntVector PreviousRingMax = FIntVector::ZeroValue; - FIntVector MCRingMin = FIntVector::ZeroValue; - FIntVector MCRingMax = FIntVector::ZeroValue; - for (int32 Level = 0; Level <= MaxMCRingLevel; ++Level) + for (int32 Level = 0; Level <= MaxLevel; ++Level) { const int32 Pow = 1 << Level; const FIntVector CenterLevel = FloorDiv(Center, Pow); - const int32 LevelRadius = (Level == MaxLevel && !bSheetRing) - ? OuterRadius : Radius; + const int32 LevelRadius = (Level == MaxLevel) ? OuterRadius : Radius; // Every finer shell must end on a complete child-pair boundary so a coarser tile is - // either wholly inside it or wholly outside it. The final MC ring uses the sheet's - // grouping width when a sheet ring follows it; otherwise the ordinary LOD boundary - // only needs pair alignment. - const int32 RingAlignment = Level < MaxMCRingLevel - ? 2 - : (bSheetRing ? (1 << (SheetLevel - MaxMCRingLevel)) : 1); + // either wholly inside it or wholly outside it. The outermost ring has no coarser + // neighbour and needs no alignment. + const int32 RingAlignment = Level < MaxLevel ? 2 : 1; FIntVector RingMin, RingMax; AlignedRingBounds(CenterLevel, LevelRadius, RingAlignment, RingMin, RingMax); - if (Level == MaxMCRingLevel) - { - MCRingMin = RingMin; - MCRingMax = RingMax; - } int32 DeltaZMin = RingMin.Z - CenterLevel.Z; int32 DeltaZMax = RingMax.Z - CenterLevel.Z; @@ -174,48 +148,5 @@ namespace VoxelClipmapDesiredTiles PreviousRingMin = RingMin; PreviousRingMax = RingMax; } - - if (bSheetRing) - { - const int32 SheetPow = 1 << SheetLevel; - const FIntVector CenterSheet = FloorDiv(Center, SheetPow); - const int32 LevelDelta = SheetLevel - MaxMCRingLevel; - const int32 MCPerSheet = 1 << LevelDelta; - - int32 DeltaZMin = -SheetRadius; - int32 DeltaZMax = SheetRadius; - if (MinChunkZ != MIN_int32) - { - DeltaZMin = FMath::Max(DeltaZMin, - FloorDiv(MinChunkZ, SheetPow) - CenterSheet.Z); - DeltaZMax = FMath::Min(DeltaZMax, - FloorDiv(MaxChunkZ, SheetPow) - CenterSheet.Z); - } - - for (int32 DeltaZ = DeltaZMin; DeltaZ <= DeltaZMax; ++DeltaZ) - for (int32 DeltaY = -SheetRadius; DeltaY <= SheetRadius; ++DeltaY) - for (int32 DeltaX = -SheetRadius; DeltaX <= SheetRadius; ++DeltaX) - { - const FIntVector Tile = CenterSheet + FIntVector(DeltaX, DeltaY, DeltaZ); - const int32 TileMinZ = Tile.Z << SheetLevel; - const int32 TileMaxZ = ((Tile.Z + 1) << SheetLevel) - 1; - if (TileMaxZ < MinChunkZ || TileMinZ > MaxChunkZ) - { - continue; - } - - const bool bCovered = - (Tile.X * MCPerSheet >= MCRingMin.X) - && ((Tile.X + 1) * MCPerSheet - 1 <= MCRingMax.X) - && (Tile.Y * MCPerSheet >= MCRingMin.Y) - && ((Tile.Y + 1) * MCPerSheet - 1 <= MCRingMax.Y) - && (Tile.Z * MCPerSheet >= MCRingMin.Z) - && ((Tile.Z + 1) * MCPerSheet - 1 <= MCRingMax.Z); - if (!bCovered) - { - OutTiles.Emplace(Tile, SheetLevel); - } - } - } } } diff --git a/Source/VoxelForge/Private/VoxelWorld.cpp b/Source/VoxelForge/Private/VoxelWorld.cpp index 2eb2737..a956d42 100644 --- a/Source/VoxelForge/Private/VoxelWorld.cpp +++ b/Source/VoxelForge/Private/VoxelWorld.cpp @@ -1584,16 +1584,12 @@ void AVoxelWorld::BeginPlay() int32 TestMaxClipLevel = -1; const bool bTestMaxClipLevel = FParse::Value(FCommandLine::Get(), TEXT("voxel.TestMaxClipLevel="), TestMaxClipLevel); - int32 TestFarSheetRing = -1; - const bool bTestFarSheetRing = - FParse::Value(FCommandLine::Get(), TEXT("voxel.TestFarSheetRing="), TestFarSheetRing); - if (bTestRenderDistance || bTestMaxClipLevel || bTestFarSheetRing) + if (bTestRenderDistance || bTestMaxClipLevel) { if (UVoxelSettings* TestSettings = DuplicateObject(Settings, this)) { const int32 AuthoredRenderDistance = Settings->RenderDistanceChunks; const int32 AuthoredMaxClipLevel = Settings->MaxClipLevel; - const bool bAuthoredFarSheetRing = Settings->bFarSheetRing; if (bTestRenderDistance) { TestSettings->RenderDistanceChunks = TestRenderDistanceChunks; @@ -1602,18 +1598,12 @@ void AVoxelWorld::BeginPlay() { TestSettings->MaxClipLevel = FMath::Clamp(TestMaxClipLevel, 0, 8); } - if (bTestFarSheetRing) - { - TestSettings->bFarSheetRing = TestFarSheetRing != 0; - } Settings = TestSettings; UE_LOG(LogTemp, Display, TEXT("[VoxelForgeHorizonMeasure] transient_settings=1 " - "render_distance_chunks=%d authored=%d max_clip_level=%d authored=%d " - "far_sheet_ring=%d authored=%d"), + "render_distance_chunks=%d authored=%d max_clip_level=%d authored=%d"), Settings->RenderDistanceChunks, AuthoredRenderDistance, - Settings->MaxClipLevel, AuthoredMaxClipLevel, - Settings->bFarSheetRing ? 1 : 0, bAuthoredFarSheetRing ? 1 : 0); + Settings->MaxClipLevel, AuthoredMaxClipLevel); } } @@ -1705,18 +1695,17 @@ void AVoxelWorld::BeginPlay() TEXT("\"asset\":\"%s\",\"seed\":%d,\"total_strates\":%d,\"inter_strate_gap_chunks\":%d," "\"strate_pool\":%d,\"strate_content_cut_min_level\":%d," "\"effective_strate_content_cut_min_level\":%d,\"max_clip_level\":%d,\"clip_radius\":%d," - "\"render_distance_chunks\":%d,\"far_sheet_ring\":%d,\"far_sheet_span_levels\":%d," + "\"render_distance_chunks\":%d," "\"enable_density_volume\":%d,\"density_volume_resolution\":%d,\"density_volume_levels\":%d," - "\"density_volume_max_tasks\":%d,\"density_volume_gpu_upload\":%d"), + "\"density_volume_gpu_upload\":%d"), *SettingsPath, Settings->GetEffectiveWorldSeed(), Settings->TotalStrates, Settings->InterStrateGapChunks, Settings->StratePool.Num(), Settings->StrateContentCutMinLevel, Settings->GetEffectiveStrateContentCutMinLevel(), Settings->MaxClipLevel, Settings->ClipRadius, Settings->RenderDistanceChunks, - Settings->bFarSheetRing ? 1 : 0, Settings->FarSheetSpanLevels, Settings->bEnableDensityVolume ? 1 : 0, Settings->DensityVolumeResolution, - Settings->DensityVolumeLevels, Settings->DensityVolumeMaxTasks, + Settings->DensityVolumeLevels, Settings->bDensityVolumeGPUUpload ? 1 : 0)); } @@ -2291,7 +2280,6 @@ void AVoxelWorld::WriteTileHashDump() Writer->WriteValue(TEXT("coarse_tile_cells"), Settings->CoarseTileCells); Writer->WriteValue(TEXT("max_clip_level"), Settings->MaxClipLevel); Writer->WriteValue(TEXT("render_distance_chunks"), Settings->RenderDistanceChunks); - Writer->WriteValue(TEXT("far_sheet_ring"), Settings->bFarSheetRing); Writer->WriteValue(TEXT("strate_content_cut_min_level"), Settings->GetEffectiveStrateContentCutMinLevel()); Writer->WriteObjectEnd(); @@ -3016,11 +3004,10 @@ void AVoxelWorld::AdvanceHeadlessCollisionGateStressTest( { UE_LOG(LogTemp, Display, TEXT("[VoxelForgeCollisionGateStressTest] owner_settings clip_radius=%d " - "max_clip_level=%d render_distance_chunks=%d far_sheet_ring=%d"), + "max_clip_level=%d render_distance_chunks=%d"), Settings != nullptr ? Settings->ClipRadius : -1, Settings != nullptr ? Settings->MaxClipLevel : -1, - Settings != nullptr ? Settings->RenderDistanceChunks : -1, - Settings != nullptr && Settings->bFarSheetRing ? 1 : 0); + Settings != nullptr ? Settings->RenderDistanceChunks : -1); float CapsuleHalfHeightCm = 0.0f; if (const ACharacter* Character = Cast(PlayerPawn)) { @@ -6468,14 +6455,12 @@ static FORCEINLINE FIntVector VF_FloorDiv(const FIntVector& V, int32 D) } // The outer shell is the MaxClipLevel ring stretched to RenderDistanceChunks. Shared by desired -// selection and range culling so both use the same outer horizon. The selector's far sheet ring -// is not part of the runtime, so it is always switched off here. +// selection and range culling so both use the same outer horizon. static FORCEINLINE void VF_OuterShell(const UVoxelSettings* Settings, int32 R, int32 MaxLevel, int32& OutLevel, int32& OutRadius) { VoxelClipmapDesiredTiles::FParameters Parameters; Parameters.RenderDistanceChunks = Settings ? Settings->RenderDistanceChunks : 0; - Parameters.bFarSheetRing = false; VoxelClipmapDesiredTiles::OuterShell(Parameters, R, MaxLevel, OutLevel, OutRadius); } @@ -6520,7 +6505,6 @@ void AVoxelWorld::BuildDesiredTiles(const FIntVector& Center, const FVector& Pla TileParameters.ClipRadius = R; TileParameters.MaxClipLevel = MaxLevel; TileParameters.RenderDistanceChunks = Settings ? Settings->RenderDistanceChunks : 0; - TileParameters.bFarSheetRing = false; VoxelClipmapDesiredTiles::Build(Center, ZLo, ZHi, TileParameters, DesiredSorted); for (const FVoxelTileKey& Key : DesiredSorted) { diff --git a/Source/VoxelForge/Public/VoxelSettings.h b/Source/VoxelForge/Public/VoxelSettings.h index 3e820c8..31297db 100644 --- a/Source/VoxelForge/Public/VoxelSettings.h +++ b/Source/VoxelForge/Public/VoxelSettings.h @@ -123,21 +123,6 @@ public: return FMath::Clamp(FMath::Max(StrateContentCutMinLevel, 1), 1, 9); } - // Open-world SKY reach: the sky-cap ceiling of an open strate (SurfaceWorld / FloatingIslands) - // is FAR, so the ceiling BAND is streamed across a wider horizontal radius = ViewDistanceXY × - // this, so the sky reaches toward the horizon instead of being a patch over the player's head. - // Only the ceiling band (top CeilingBandChunks of the strate) gets the wide radius — the empty - // air below it stays at base XY. Cost grows ~ multiplier² (more far chunks/draws; gen is cheap - // and batching keeps the game-thread cost low). 1 = off. Live-tunable on the asset — push to 4 - // if the draw budget allows; a proper to-the-horizon view (terrain too) is the chunk-LOD clipmap. - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Streaming", meta = (ClampMin = "1")) - int32 CeilingViewMultiplier = 2; - - // How many chunks down from the strate top get the wide CeilingViewMultiplier radius (covers - // the sky-cap slab). Bigger = no gaps if the ceiling surface dips, but more far chunks. - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Streaming", meta = (ClampMin = "1")) - int32 CeilingBandChunks = 4; - //========================================================================= // CLIPMAP (chunked-LOD streaming — supersedes the ViewDistance box above) //========================================================================= @@ -183,16 +168,6 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Clipmap", meta = (ClampMin = "0")) int32 RenderDistanceChunks = 768; - // UNUSED: the far sheet ring was removed from the runtime; the render-distance ring is always - // marching-cubes tiles at MaxClipLevel. Kept only so saved assets and the test harness's - // `voxel.TestFarSheetRing` switch still load; it has no effect. - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Clipmap") - bool bFarSheetRing = false; - - // UNUSED (see bFarSheetRing). Kept so saved assets still load; it has no effect. - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Clipmap", meta = (ClampMin = "1", ClampMax = "4", EditCondition = "bFarSheetRing")) - int32 FarSheetSpanLevels = 2; - // SKIRTS — seal the thin cracks where neighbouring clipmap shells (different resolutions) meet. // A short wall is extruded into the solid from each surface edge on the tile's outer faces. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Clipmap") @@ -336,12 +311,6 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Lighting", meta = (ClampMin = "1", ClampMax = "5")) int32 DensityVolumeLevels = 3; - // DEPRECATED / unused: the volume fill no longer runs on the shared UE::Tasks pool (where it - // starved behind mesh-gen). It now runs on ONE dedicated thread off the pool, so there's no task - // budget to cap. Kept only so existing saved assets don't error; safe to ignore. - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Voxel|Lighting", meta = (ClampMin = "1", ClampMax = "16")) - int32 DensityVolumeMaxTasks = 4; - // A fill box is split into Z-slabs of at most this many cells per task, so no single task is // huge (a full level refill on startup/teleport fans out across workers). Lower = more, smaller // tasks (better parallelism / latency); higher = fewer, fatter tasks. diff --git a/Tools/VoxelForgeTest.ps1 b/Tools/VoxelForgeTest.ps1 index 1334cab..9936dd2 100644 --- a/Tools/VoxelForgeTest.ps1 +++ b/Tools/VoxelForgeTest.ps1 @@ -54,7 +54,6 @@ $HorizonMetrics = [ordered]@{ status = 'not_run' level = $HorizonLevel render_distance_chunks = $HorizonRenderDistanceChunks - far_sheet_ring = $false } $HorizonRenderMetrics = [ordered]@{ requested = $Scenario -eq 'horizon-render'; status = 'not_run' } $DeterminismEvidence = [ordered]@{ requested = $Scenario -eq 'determinism'; status = 'not_run' } @@ -1293,7 +1292,6 @@ try { $tracePath = Join-Path $RunRoot 'horizon_trace.jsonl' $baseCvars['voxel.TestRenderDistanceChunks'] = $HorizonRenderDistanceChunks $baseCvars['voxel.TestMaxClipLevel'] = $HorizonLevel - $baseCvars['voxel.TestFarSheetRing'] = 0 $baseCvars['voxel.StartupTraceFile'] = $tracePath $baseCvars['voxel.StartupTraceMaxTiles'] = 16384 $baseCvars['voxel.TestExitOnSteady'] = 1 @@ -1311,7 +1309,6 @@ try { $tracePath = Join-Path $RunRoot 'horizon_render_trace.jsonl' $baseCvars['voxel.TestRenderDistanceChunks'] = $HorizonRenderDistanceChunks $baseCvars['voxel.TestMaxClipLevel'] = $HorizonLevel - $baseCvars['voxel.TestFarSheetRing'] = 0 $baseCvars['voxel.StartupTraceFile'] = $tracePath $baseCvars['voxel.StartupTraceMaxTiles'] = 16384 $baseCvars['voxel.TestCeilingView'] = 1 @@ -1340,7 +1337,6 @@ try { $determinismBase = [ordered]@{ 'voxel.TestRenderDistanceChunks' = $HorizonRenderDistanceChunks 'voxel.TestMaxClipLevel' = $HorizonLevel - 'voxel.TestFarSheetRing' = 0 'voxel.TestExitOnSteady' = 1 'voxel.StartupTraceMaxTiles' = 16384 'voxel.OuterClassifierMode' = 0 @@ -1369,7 +1365,6 @@ try { $DeterminismEvidence = Compare-DeterminismDumps $defaultDump $crtFma3OffDump $DeterminismEvidence.level = $HorizonLevel $DeterminismEvidence.render_distance_chunks = $HorizonRenderDistanceChunks - $DeterminismEvidence.far_sheet_ring = $false $DeterminismEvidence.default_measurement = $defaultMetrics $DeterminismEvidence.crt_fma3_off_measurement = $crtFma3OffMetrics $GameMetrics = $crtFma3OffMetrics