Standalone/ (C++20, MSVC /O2 /arch:AVX2 /fp:precise, Build.ps1): copied density pipeline, op stack, cave morphology, passages, strate manager/composer, noise, DetSinCos, mesher, clipmap selection, with a UE compatibility layer (Compat/). Owner data exported once to Standalone/data/owner_world.json by a default-off explore-commandlet exporter (the only plugin-source change). 25 cm voxels. Parity: seed 0, 3,436 samples (strate edges, negative/far coords, rooms, tunnels, passages, landings): bit-identical. Viewer: full 7-level clipmap, per-level toggles 1-7, T = round winding tunnels (standalone option), N/P seed, F wireframe. Timing NOT yet a baseline: 515 s for 12,054 tiles (L0 70 s, L6 296 s); the compat TMap/TSet are vector-backed with linear lookup, which the plugin's caches do not expect. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
89 lines
2.7 KiB
C++
89 lines
2.7 KiB
C++
// VoxelWormField.cpp
|
|
// Shared deterministic exact worm-field evaluation.
|
|
|
|
#include "VoxelWormField.h"
|
|
|
|
#include "VoxelCaveMorphology.h" // VoxelHash::SeedOffset
|
|
#include "VoxelNoise.h"
|
|
#include "VoxelTypes.h" // VOXEL_NOISE_SCALE
|
|
|
|
namespace
|
|
{
|
|
FORCEINLINE FVector3f MakeWormNoiseBase(
|
|
float WorldX,
|
|
float WorldY,
|
|
float WorldZ,
|
|
const VoxelWormField::FParameters& Parameters)
|
|
{
|
|
const float EffectiveZ = (Parameters.VerticalScale != 1.0f
|
|
&& Parameters.VerticalScale > 0.0f)
|
|
? WorldZ / Parameters.VerticalScale : WorldZ;
|
|
const float WormZFrequency = Parameters.Frequency * Parameters.HorizontalBias;
|
|
return FVector3f(
|
|
WorldX * Parameters.Frequency
|
|
+ VoxelHash::SeedOffset(Parameters.Seed, 1.0f),
|
|
WorldY * Parameters.Frequency
|
|
+ VoxelHash::SeedOffset(Parameters.Seed, 1.7f),
|
|
EffectiveZ * WormZFrequency
|
|
+ VoxelHash::SeedOffset(Parameters.Seed, 2.3f));
|
|
}
|
|
|
|
FORCEINLINE float EvaluateN1Field(
|
|
float WorldX,
|
|
float WorldY,
|
|
float WorldZ,
|
|
const VoxelWormField::FParameters& Parameters,
|
|
float NoiseScale)
|
|
{
|
|
const FVector3f NoiseBase = MakeWormNoiseBase(
|
|
WorldX, WorldY, WorldZ, Parameters);
|
|
return FMath::Abs(VoxelNoise::Perlin3D(NoiseBase) * NoiseScale);
|
|
}
|
|
|
|
FORCEINLINE float EvaluateN2Field(
|
|
float WorldX,
|
|
float WorldY,
|
|
float WorldZ,
|
|
const VoxelWormField::FParameters& Parameters,
|
|
float NoiseScale)
|
|
{
|
|
const FVector3f NoiseBase = MakeWormNoiseBase(
|
|
WorldX, WorldY, WorldZ, Parameters);
|
|
const FVector3f N2Position = NoiseBase + FVector3f(137.0f, 259.0f, 431.0f);
|
|
return FMath::Abs(VoxelNoise::Perlin3D(N2Position) * NoiseScale);
|
|
}
|
|
|
|
FORCEINLINE float EvaluateExactField(
|
|
float WorldX,
|
|
float WorldY,
|
|
float WorldZ,
|
|
float Threshold,
|
|
const VoxelWormField::FParameters& Parameters)
|
|
{
|
|
const float NoiseScale = VOXEL_NOISE_SCALE;
|
|
const float N1 = EvaluateN1Field(
|
|
WorldX, WorldY, WorldZ, Parameters, NoiseScale);
|
|
|
|
// N2 is non-negative, so this preserves the exact evaluator's short-circuit.
|
|
if (N1 >= Threshold)
|
|
{
|
|
return N1;
|
|
}
|
|
return N1 + EvaluateN2Field(
|
|
WorldX, WorldY, WorldZ, Parameters, NoiseScale);
|
|
}
|
|
}
|
|
|
|
namespace VoxelWormField
|
|
{
|
|
float Evaluate(
|
|
float WorldX,
|
|
float WorldY,
|
|
float WorldZ,
|
|
float Threshold,
|
|
const FParameters& Parameters)
|
|
{
|
|
return EvaluateExactField(WorldX, WorldY, WorldZ, Threshold, Parameters);
|
|
}
|
|
}
|