wip(tunnels): room wins over tunnels -- no shelf, smooth mouths; stopped before final checks
Stopped by the owner (he wanted his PC back to play) after most acceptance was in. Measured with the owner's assets: the shelf across rooms came from the tunnel core reasserting solid below its floor inside room volumes, plus the landing-floor post. Room ownership now suppresses the tunnel bottom in the generic tunnel SDF, the core evaluator and both native fallbacks: tunnel-attributed solid inside rooms 469 -> 0, and a matched-camera re-render shows the slab gone. Trimmed mouth endpoints now take their height from the room's own vertical zero crossing (join offsets -2.08/+0.40 -> -1.13/-0.71 voxels). Mouth surface periodic amplitude 1.49 cm floor / 0 cm wall (degree-six trend removal; raw local-median audit 6.19 cm kept). Canonical walk Connected, 42,870 fit / 17,413 walk-reachable (was 41,184 / 13,879); export 141,054 triangles, geometry hash 86A99075. Launches use an isolated engine saved/config directory so the owner's editor settings are not rewritten. NOT DONE: the -voxel.CrtFma3=0 export comparison, TilePostReachProof / DetSinCos / strate crossing, the perf pair vs the experimental tip, the EditorSettings.ini diff. Unvalidated in game. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
1 parent
01cb9d47f1
commit
d01af4606d
5 files changed
+821
-51
No files matched your search
@@ -3475,10 +3475,18 @@ float UVoxelGenerator::GetDensityAt(float WorldX, float WorldY, float WorldZ) co
|
||||
{
|
||||
VoxelDensityProfile::FScopedTimer ProfileTimer(
|
||||
VoxelDensityProfile::EBucket::TunnelCorePosts);
|
||||
FVector RoomQueryPosition(WorldX, WorldY, WorldZ);
|
||||
if (CP_Tunnel.VerticalScale != 1.0f && CP_Tunnel.VerticalScale > 0.0f)
|
||||
{
|
||||
RoomQueryPosition.Z = WorldZ / CP_Tunnel.VerticalScale;
|
||||
}
|
||||
RoomQueryPosition = VoxelCaveMorphology::ApplyCaveWarp(
|
||||
RoomQueryPosition, CP_Tunnel, static_cast<uint32>(Seed));
|
||||
PreDisturbanceTunnelCore = VoxelCaveMorphology::EvaluateTunnelCoreWorld(
|
||||
WorldX, WorldY, WorldZ, ActiveTunnelCoreCache->Cache, nullptr,
|
||||
VoxelGenLOD::ShouldUseSpatialIndex(
|
||||
CP_UseOpStack ? bUsedFusedEvaluator : true));
|
||||
CP_UseOpStack ? bUsedFusedEvaluator : true),
|
||||
&RoomQueryPosition);
|
||||
bHavePreDisturbanceTunnelCore = true;
|
||||
}
|
||||
|
||||
@@ -3573,6 +3581,8 @@ float UVoxelGenerator::GetDensityAt(float WorldX, float WorldY, float WorldZ) co
|
||||
return;
|
||||
}
|
||||
const bool bOwnsSweptBottom =
|
||||
!Core.bRoomFloor
|
||||
&&
|
||||
Core.bHasSweptFloor
|
||||
&& VoxelMath::IsFinite(Core.SweptFloorZ)
|
||||
&& VoxelMath::IsFinite(Core.SweptFloorRadius)
|
||||
@@ -3669,11 +3679,19 @@ float UVoxelGenerator::GetDensityAt(float WorldX, float WorldY, float WorldZ) co
|
||||
{
|
||||
VoxelDensityProfile::FScopedTimer ProfileTimer(
|
||||
VoxelDensityProfile::EBucket::TunnelCorePosts);
|
||||
FVector RoomQueryPosition(WorldX, WorldY, WorldZ);
|
||||
if (CP_Tunnel.VerticalScale != 1.0f && CP_Tunnel.VerticalScale > 0.0f)
|
||||
{
|
||||
RoomQueryPosition.Z = WorldZ / CP_Tunnel.VerticalScale;
|
||||
}
|
||||
RoomQueryPosition = VoxelCaveMorphology::ApplyCaveWarp(
|
||||
RoomQueryPosition, CP_Tunnel, static_cast<uint32>(Seed));
|
||||
TunnelCore = VoxelCaveMorphology::EvaluateTunnelCoreWorld(
|
||||
WorldX, WorldY, WorldZ, ActiveTunnelCoreCache->Cache,
|
||||
nullptr,
|
||||
VoxelGenLOD::ShouldUseSpatialIndex(
|
||||
CP_UseOpStack ? bUsedFusedEvaluator : true));
|
||||
CP_UseOpStack ? bUsedFusedEvaluator : true),
|
||||
&RoomQueryPosition);
|
||||
bHaveTunnelCore = true;
|
||||
}
|
||||
if (bHaveTunnelCore)
|
||||
@@ -3689,7 +3707,14 @@ float UVoxelGenerator::GetDensityAt(float WorldX, float WorldY, float WorldZ) co
|
||||
ApplyTunnelCoreShape(TunnelCore);
|
||||
|
||||
}
|
||||
if (bHaveTunnelCore || (!bTunnelCoreReachable && !bTunnelCoreBypass))
|
||||
if (bHaveTunnelCore)
|
||||
{
|
||||
if (!TunnelCore.bRoomFloor)
|
||||
{
|
||||
ApplyGraphLandingFloors();
|
||||
}
|
||||
}
|
||||
else if (!bTunnelCoreReachable && !bTunnelCoreBypass)
|
||||
{
|
||||
ApplyGraphLandingFloors();
|
||||
}
|
||||
@@ -4279,8 +4304,10 @@ float UVoxelGenerator::GetDensityWithParams(float WorldX, float WorldY, float Wo
|
||||
// floor projection for the current point without eagerly materialising a whole XY table.
|
||||
// The interpreted source has a lazy worker LRU for block evaluation; building that table
|
||||
// here would turn a cache-window change into hundreds of unnecessary column builds.
|
||||
const FVector RoomQueryPosition(WarpedX, WarpedY, WarpedZ);
|
||||
*OutTunnelCore = VoxelCaveMorphology::EvaluateTunnelCoreWorld(
|
||||
WorldX, WorldY, WorldZ, SDFCache, nullptr, bUseSpatialIndex);
|
||||
WorldX, WorldY, WorldZ, SDFCache, nullptr, bUseSpatialIndex,
|
||||
&RoomQueryPosition);
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
|
||||
Reference in new issue
Block a user