standalone: owner LOD0 defects -- relief blended as partition of unity (stairs gone), exposed skirts 0

- Stairs: cave, floor, strata and passage relief were effectively summed in overlaps (owner ray
  ~0.94 voxel of displacement); now partition-of-unity weights: -0.288 voxel there, max detail
  gradient 0.323 voxel/voxel. High-detail patch scan 133 -> 0; exact midpoint edge roots kept
  (removing them: 7,993 bad roots, 46 patches).
- Fins: exposed skirt triangle scan 1,776 -> 0; thin sheets 0; coarse off-surface panels 0.
- Path hash both directions equal; W1/W8 equal; routes 5642/5642; passage detail ratio 0.850;
  far survival passes, bad-shell fails; 30-crossing flight: nearest tile 15.1 ms median, 124 ms max.
Caveats seen in the captures: the owner-ray wall has visibly less relief than before; the fin
before/after captures do not show the fins (evidence is the scan only). Cold StreamFullClipmap
0.758 s vs 0.741 s (+17 ms, Luna's interleaved run). Owner to judge: bin\VoxelForgeLookCheck4.exe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-06 02:42:56 +02:00
1 parent b3af0e589e
commit de14f0042d
6 files changed
+213 -26

No files matched your search

+28 -6
View File
@@ -1299,8 +1299,30 @@ private:
static float DetailContrast(float CaveInfluence,float FloorInfluence)
{
const float Cave=std::clamp(CaveInfluence,0.0f,1.0f);
const float Floor=std::clamp(FloorInfluence,0.0f,1.0f);
return 1.35f-0.80f*Cave+1.85f*Floor;
const float Floor=std::min(Cave,std::clamp(FloorInfluence,0.0f,1.0f));
const float StrataWeight=1.0f-Cave;
const float CaveWeight=Cave-Floor;
const float FloorWeight=Floor;
// The three influences are a partition of unity. Cave floors blend at the
// cave family's amplitude instead of multiplying both family contributions.
return 1.35f*StrataWeight+1.00f*CaveWeight+0.55f*FloorWeight;
}
static float BlendDetailFamilies(float Relief,float OwnerRelief,
float CaveInfluence,float FloorInfluence,float PassageInfluence)
{
const float Cave=std::clamp(CaveInfluence,0.0f,1.0f);
const float Floor=std::min(Cave,std::clamp(FloorInfluence,0.0f,1.0f));
const float Passage=std::clamp(PassageInfluence,0.0f,1.0f);
const float NonPassageWeight=1.0f-Passage;
const float StrataWeight=NonPassageWeight*(1.0f-Cave);
const float CaveWeight=NonPassageWeight*(Cave-Floor);
const float FloorWeight=NonPassageWeight*Floor;
const float StrataRelief=1.35f*(Relief+0.5f*OwnerRelief);
const float CaveRelief=1.00f*Relief;
const float FloorRelief=0.55f*Relief;
const float PassageRelief=0.75f*Relief;
return StrataWeight*StrataRelief+CaveWeight*CaveRelief
+FloorWeight*FloorRelief+Passage*PassageRelief;
}
static constexpr float DetailBandInnerRadius=1.5f;
static float DetailBandFade(float SignedDistance,float Edge)
@@ -3883,8 +3905,8 @@ private:
if(Field)
OwnerRelief=OwnerCaveRoughnessForDetail(X,Y,Z,SurfaceSDF,*Field,
CaveInfluence,PassageWeight,OwnerNoise);
const float Contrast=DetailContrast(CaveInfluence,FloorInfluence);
const float Detail=std::clamp((Relief+OwnerRelief*0.5f)*Contrast,-3.9f,3.9f);
const float Detail=std::clamp(BlendDetailFamilies(Relief,OwnerRelief,
CaveInfluence,FloorInfluence,PassageWeight),-3.9f,3.9f);
return Detail;
}
@@ -3920,8 +3942,8 @@ private:
if(Profile)
Profile->OwnerRoughnessSampleNanoseconds+=static_cast<uint64>(
std::chrono::duration_cast<std::chrono::nanoseconds>(Clock::now()-OwnerStart).count());
const float Contrast=DetailContrast(CaveInfluence,FloorInfluence);
const float Detail=std::clamp((Relief+OwnerRelief*0.5f)*Contrast,-3.9f,3.9f);
const float Detail=std::clamp(BlendDetailFamilies(Relief,OwnerRelief,
CaveInfluence,FloorInfluence,PassageWeight),-3.9f,3.9f);
return Detail;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB