wip(unreal): round 3 -- owner's in-game defects classified; opening room fixed; Core biome query
Luna, integration round 3, from the owner's four in-game screenshots: - Capsule rings at the opening and the shaft continuing through the cave room were Core world defects: the synthetic bore is removed and the opening gets a finite origin room and floor (solid below). New world version, W1/W8/W16 identical: density a8bcb72d41092503, mesh 90f29ba15e24579f, payload 82c6b489e7bb7fd7, topology 7b99448a1f844f2c. - B-side landing and surface: headless coverage found no missing tiles or LOD-transition gaps (960 / 640 fine tiles compiled after travel); best explained by Core's missing SurfaceWorld representation. Null-RHI cannot rule out a presentation-only issue. - Core mode GetBiomeAtWorldLocation now answers (e.g. Biome_Surface_Plain); biome terrain itself is not generated yet (proposal: native Core SurfaceWorld evaluator). Owner checked the Step29 viewer himself: the surface strate type is absent there too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
1 parent
075e58187e
commit
75210e56f3
8 files changed
+957
-24
No files matched your search
@@ -2502,6 +2502,10 @@ private:
|
||||
AddEllipsoid(Center,{std::max(2.0f,C.Radius),std::max(2.0f,C.Radius),HalfZ},
|
||||
{1,0,0},{0,1,0},{0,0,1},false);
|
||||
}
|
||||
|
||||
// Reproduce the owner's finite, top-anchored origin room in every strate.
|
||||
// Reproduire dans chaque strate la salle d'origine finie et ancrée en haut.
|
||||
AddOriginLandingRoom(FieldForStrate(Slot.StrateIndex));
|
||||
}
|
||||
const double PassageJoinBlend=ActiveBlendRadius;ActiveBlendRadius=JoinBlendRadius;
|
||||
ActiveFloorBlendRadius=FloorClipBlendRadius;
|
||||
@@ -2633,17 +2637,63 @@ private:
|
||||
AddLanding(P.LowerLanding,true);
|
||||
}
|
||||
ActiveBlendRadius=PassageJoinBlend;ActiveFloorBlendRadius=0.0;
|
||||
if(Owner->Settings->bOpenSurfaceEntry)
|
||||
}
|
||||
|
||||
const FLayerField* FieldForStrate(int32 StrateIndex) const
|
||||
{
|
||||
for(const FLayerField& Field:LayerFields)
|
||||
if(Field.StrateIndex==StrateIndex)return &Field;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AddOriginLandingRoom(const FLayerField* Field)
|
||||
{
|
||||
if(Field==nullptr||Owner==nullptr||Owner->Settings==nullptr)return;
|
||||
const double Radius=Owner->Settings->OriginSpineRadius;
|
||||
if(!(Radius>0.0)||!std::isfinite(Radius))return;
|
||||
|
||||
// These constants mirror VoxelPassageGeometry in legacy voxel units.
|
||||
// Ces constantes reprennent VoxelPassageGeometry en voxels historiques.
|
||||
constexpr double MinimumHalfWidth=12.0;
|
||||
constexpr double MinimumRoomHeight=24.0;
|
||||
constexpr double PlayerHeight=14.08;
|
||||
constexpr double Headroom=8.0;
|
||||
constexpr double FloorThickness=6.0;
|
||||
constexpr double SealSafetyMargin=8.0;
|
||||
constexpr double RoomRounding=3.0;
|
||||
constexpr double ShaftFloorClearance=8.0;
|
||||
|
||||
const double SafeRadius=std::max(std::abs(Radius),2.0);
|
||||
const double HalfWidth=std::max({MinimumHalfWidth,SafeRadius+4.0,
|
||||
SafeRadius+ShaftFloorClearance});
|
||||
const double DesiredHeight=std::max({MinimumRoomHeight,PlayerHeight+Headroom,
|
||||
2.0*SafeRadius+4.0});
|
||||
const double Seal=std::max(0.0,static_cast<double>(Field->Params.BoundarySealThickness));
|
||||
const double InnerBottom=static_cast<double>(Field->Lo)+Seal;
|
||||
const double InnerTop=static_cast<double>(Field->Hi)-Seal;
|
||||
const double MinimumFloor=InnerBottom+FloorThickness+SealSafetyMargin;
|
||||
const double MaximumFloor=InnerTop-DesiredHeight-SealSafetyMargin;
|
||||
if(!(InnerTop>InnerBottom)||MaximumFloor<MinimumFloor)return;
|
||||
|
||||
const double FloorZ=MaximumFloor;
|
||||
const double CeilingZ=FloorZ+DesiredHeight;
|
||||
const double HalfZ=(CeilingZ-FloorZ)*0.5;
|
||||
const double HalfExtent=std::max(HalfWidth-RoomRounding,0.5);
|
||||
const double RoundedHalfZ=std::max(HalfZ-RoomRounding,0.5);
|
||||
const size_t Before=Primitives.size();
|
||||
AddRoundedBox(FVector(0,0,(FloorZ+CeilingZ)*0.5),
|
||||
{HalfExtent,HalfExtent,RoundedHalfZ},RoomRounding,true);
|
||||
for(size_t I=Before;I<Primitives.size();++I)
|
||||
{
|
||||
const double Radius=std::max(8.0f,Owner->Settings->OriginSpineRadius);
|
||||
const double Top=LayerRanges[0].Hi;
|
||||
const FVector A(0,0,Top),B(0,0,std::max<double>(LayerRanges[0].Lo,Top-256.0));
|
||||
AddCapsule(A,B,static_cast<float>(Radius),true);
|
||||
// Keep the authored room floor hard and level while leaving all lower seal rock intact.
|
||||
// Garder un sol horizontal net et préserver la roche du joint inférieur.
|
||||
ApplyFloorClip(Primitives[I],FloorZ+0.5,0.0,0.0,0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void AddLanding(const FVoxelPassageLanding& L,bool bCritical=false)
|
||||
{
|
||||
if(!(L.HalfWidth>0.0f)||!(L.CeilingZ>L.FloorZ))return;
|
||||
const double HalfZ=std::max(2.0,(L.CeilingZ-L.FloorZ)*0.5);
|
||||
const FVector Center(L.StandingPoint.X,L.StandingPoint.Y,(L.CeilingZ+L.FloorZ)*0.5);
|
||||
const double Width=std::max(6.0f,L.HalfWidth);
|
||||
|
||||
Reference in new issue
Block a user