feat(descent): landing ROOMS and a walkable tunnel -- per Jahni's correction
Jahni corrected the design: "the connection between level is a tiny tunnel
connecting both strate, not vertical, it needs to be walkable" and "'the
spine' shouldn't be carved except optionally from the top first strate,
then it's used to have a landing room".
COMPOSER-NOTES §6.8 had said the spine "provides a clean landing space, not
a continuous open shaft" -- and the implementation carved a vertical
cylinder anyway. A vertical cylinder has no walkable floor except at its
bottom, so a carve guaranteeing open AIR guaranteed nothing STANDABLE.
That one omission is behind five of my dead hypotheses this week.
Now:
origin spine a finite rounded ROOM per strate, no vertical bore.
radius 14 -> 8 m wide, 7.5 m tall
descent a walkable tunnel, single-file by design: 3 m mouth,
2.5 m waist, gradient capped at a NAMED 15 deg
exotic styles VerticalShaft / SpiralDescent / CascadingDrops /
CrackCrevice preserved, no longer the default
⚠️ THE GEOMETRY BITES, and it is worth Jahni's eye: at 15 deg a 32 m drop
needs 119.4 m of horizontal run -- about 59.7 m per switchback leg. That is
a long walk between strates. It is the honest consequence of "walkable",
not a tuning artifact, and the alternative is a steeper number.
⭐ AND THE ROOT CAUSE GOT NAMED A THIRD TIME, by Codex mid-run: "the round
tube was hollow air but had no authored support strip, so 'open' still did
not mean 'standable'." Tunnels now carry a floor band, and the root join
terminates in the finite origin room rather than an annular shaft hub.
Measured, commandlet sweep, 8 archetypes x 8 seeds, 64/64 valid:
origin column has player-fit cells 17/64 -> 63/64
origin column reachable 0/64 -> 7/64
arrival landing probes 315/320 fit AND in the arrival component
tunnel audit 5,916/5,916 floor and capsule samples pass; zero gradient,
floor, capsule, geometry or seal failures
narrow-gap events 0 box verdicts 14 checked, 0 violations
⚠️ arrival->departure is 6/64. The landings and tunnels are now provably
walkable; what remains is the INTRA-STRATE vertical connectivity problem
found in 6b91669 -- floors at different levels inside a strate with nothing
joining them. Separate and larger. Not tuned toward.
⚠️ PROCESS: this took 5.7 hours, of which Codex used 4 SECONDS of CPU. The
rest was polling the 73-minute automation suite at ~10% machine load. The
commandlet exists to avoid exactly that. New rule recorded: iterate with the
commandlet, full suite ONCE at the end.
Editor + Shipping builds clean. Automation 32/32, 0 failed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012aheo2crrZmHuYtPpdY2Cb
This commit is contained in:
1 parent
6b916699af
commit
55bf807f60
19 files changed
+1996
-334
No files matched your search
@@ -26,6 +26,7 @@
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "VoxelTypes.h" // SmoothStep01
|
||||
#include "VoxelPassageGeometry.h" // shared body-sized landing/tunnel geometry
|
||||
|
||||
//=============================================================================
|
||||
// SEAL DE FRONTIÈRE / BOUNDARY SEAL
|
||||
@@ -110,33 +111,97 @@ FORCEINLINE void VF_ApplyPassageLandingCarving(float& Density, float LandingSDF,
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// SPINE DE DESCENTE (0,0) / (0,0) DESCENT SPINE
|
||||
// LANDING ROOM ORIGINE (0,0) / ORIGIN LANDING ROOM
|
||||
//=============================================================================
|
||||
// Creuse une colonne verticale garantie ouverte au XY monde (0,0) dans l'INTÉRIEUR de la strate
|
||||
// (entre les seals haut et bas). Les seals sont laissés intacts pour que le joueur doive encore
|
||||
// creuser à travers pour descendre — ceci ne fait qu'un espace d'atterrissage propre, indépendant
|
||||
// de l'archétype, aligné à travers toutes les strates.
|
||||
// The old implementation carved a full-height cylinder. That made the origin visually open but
|
||||
// left no floor anywhere except at the bottom, so it was a fall shaft rather than a landing. The
|
||||
// origin primitive is now a top-anchored rounded room with a real flat floor in every strate.
|
||||
// It never crosses either vertical seal. The inter-strate seal remains solid until a passage (or
|
||||
// the player) opens it; there is no default vertical bore between rooms.
|
||||
FORCEINLINE void VF_ApplyOriginSpine(float& Density, float WorldX, float WorldY, float WorldZ,
|
||||
float StrateTopZ, float StrateBottomZ, float SealThickness, float BaseDensity, float Radius)
|
||||
{
|
||||
if (Radius <= 0.0f) return;
|
||||
|
||||
// Stay within the interior — never touch the seal bands.
|
||||
const float InnerTop = StrateTopZ - SealThickness;
|
||||
const float InnerBot = StrateBottomZ + SealThickness;
|
||||
if (WorldZ <= InnerBot || WorldZ >= InnerTop) return;
|
||||
const VoxelPassageGeometry::FOriginLandingGeometry Geometry =
|
||||
VoxelPassageGeometry::BuildOriginLandingGeometry(
|
||||
StrateTopZ, StrateBottomZ, SealThickness, Radius);
|
||||
if (!Geometry.bValid) return;
|
||||
|
||||
const float DistXY = FMath::Sqrt(WorldX * WorldX + WorldY * WorldY);
|
||||
const float SDF = DistXY - Radius; // < 0 inside the column
|
||||
const float Blend = 3.0f;
|
||||
if (SDF < Blend)
|
||||
const float RoomSDF = VoxelPassageGeometry::OriginLandingRoomSDF(
|
||||
FVector(WorldX, WorldY, WorldZ), Geometry);
|
||||
VF_ApplyPassageLandingCarving(
|
||||
Density, RoomSDF, BaseDensity, SealThickness);
|
||||
|
||||
// The floor is intentionally written after the room carve. It is also reasserted after the
|
||||
// passage/disturbance posts by the callers below; doing it here makes the standalone primitive
|
||||
// itself a complete landing-room operation.
|
||||
if (WorldZ <= Geometry.FloorZ + KINDA_SMALL_NUMBER
|
||||
&& WorldZ > Geometry.FloorZ - Geometry.FloorThickness
|
||||
&& FMath::Abs(WorldX) <= FMath::Max(Geometry.HalfWidth - 1.0f, 0.0f)
|
||||
&& FMath::Abs(WorldY) <= FMath::Max(Geometry.HalfWidth - 1.0f, 0.0f))
|
||||
{
|
||||
float Carve = FMath::Clamp((Blend - SDF) / (Blend * 2.0f), 0.0f, 1.0f);
|
||||
Carve = SmoothStep01(Carve);
|
||||
Density -= Carve * (BaseDensity * 2.0f + SealThickness);
|
||||
Density = FMath::Max(Density, BaseDensity);
|
||||
}
|
||||
}
|
||||
|
||||
/** Reassert only the origin-room air volume after a post-process that may add rock. */
|
||||
FORCEINLINE void VF_ApplyOriginLandingAir(float& Density,
|
||||
float WorldX, float WorldY, float WorldZ,
|
||||
float StrateTopZ, float StrateBottomZ, float SealThickness, float BaseDensity, float Radius)
|
||||
{
|
||||
if (Radius <= 0.0f) return;
|
||||
const VoxelPassageGeometry::FOriginLandingGeometry Geometry =
|
||||
VoxelPassageGeometry::BuildOriginLandingGeometry(
|
||||
StrateTopZ, StrateBottomZ, SealThickness, Radius);
|
||||
if (!Geometry.bValid) return;
|
||||
const float RoomSDF = VoxelPassageGeometry::OriginLandingRoomSDF(
|
||||
FVector(WorldX, WorldY, WorldZ), Geometry);
|
||||
VF_ApplyPassageLandingCarving(
|
||||
Density, RoomSDF, BaseDensity, SealThickness);
|
||||
}
|
||||
|
||||
/** Reassert only the origin-room support slab after an air carve/post-process. */
|
||||
FORCEINLINE void VF_ApplyOriginLandingFloor(float& Density,
|
||||
float WorldX, float WorldY, float WorldZ,
|
||||
float StrateTopZ, float StrateBottomZ, float SealThickness, float BaseDensity, float Radius)
|
||||
{
|
||||
if (Radius <= 0.0f) return;
|
||||
const VoxelPassageGeometry::FOriginLandingGeometry Geometry =
|
||||
VoxelPassageGeometry::BuildOriginLandingGeometry(
|
||||
StrateTopZ, StrateBottomZ, SealThickness, Radius);
|
||||
if (!Geometry.bValid) return;
|
||||
if (WorldZ <= Geometry.FloorZ + KINDA_SMALL_NUMBER
|
||||
&& WorldZ > Geometry.FloorZ - Geometry.FloorThickness
|
||||
&& FMath::Abs(WorldX) <= FMath::Max(Geometry.HalfWidth - 1.0f, 0.0f)
|
||||
&& FMath::Abs(WorldY) <= FMath::Max(Geometry.HalfWidth - 1.0f, 0.0f))
|
||||
{
|
||||
Density = FMath::Max(Density, BaseDensity);
|
||||
}
|
||||
}
|
||||
|
||||
/** MC-facing origin-room air backstop for the post-disturbance path. */
|
||||
FORCEINLINE void VF_ApplyOriginLandingAirMC(float& Density,
|
||||
float WorldX, float WorldY, float WorldZ,
|
||||
float StrateTopZ, float StrateBottomZ, float SealThickness, float BaseDensity, float Radius)
|
||||
{
|
||||
float InternalDensity = -Density;
|
||||
VF_ApplyOriginLandingAir(InternalDensity, WorldX, WorldY, WorldZ,
|
||||
StrateTopZ, StrateBottomZ, SealThickness, BaseDensity, Radius);
|
||||
Density = -InternalDensity;
|
||||
}
|
||||
|
||||
/** MC-facing origin-room floor backstop for the post-disturbance path. */
|
||||
FORCEINLINE void VF_ApplyOriginLandingFloorMC(float& Density,
|
||||
float WorldX, float WorldY, float WorldZ,
|
||||
float StrateTopZ, float StrateBottomZ, float SealThickness, float BaseDensity, float Radius)
|
||||
{
|
||||
float InternalDensity = -Density;
|
||||
VF_ApplyOriginLandingFloor(InternalDensity, WorldX, WorldY, WorldZ,
|
||||
StrateTopZ, StrateBottomZ, SealThickness, BaseDensity, Radius);
|
||||
Density = -InternalDensity;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// XY EDGE SEAL / SCELLEMENT DE LA LIMITE XY
|
||||
//=============================================================================
|
||||
|
||||
Reference in new issue
Block a user