#include "OwnerWorldLoader.h" #include "WorldMesher.h" #include #include #include int main(int argc, char** argv) { const std::string DataPath = argc > 1 ? argv[1] : "Standalone/data/owner_world.json"; FStandaloneOwnerWorld World; std::string Error; if (!StandaloneOwnerLoader::Load(DataPath,World,Error)) { std::cerr << "LOAD FAILED: " << Error << '\n'; return 2; } std::cout << "Loaded owner world: seed=" << World.Seed << " strates=" << World.Manager->GetNumStrates() << " passages=" << World.Manager->GetPassages().Num() << " samples=" << World.DensitySamples.size() << '\n'; struct FMismatch { size_t Index; float Actual; }; std::vector Mismatches; Mismatches.reserve(World.DensitySamples.size()); std::map SampleKinds; for (size_t I = 0; I < World.DensitySamples.size(); ++I) { const FStandaloneParitySample& Sample = World.DensitySamples[I]; const float Actual = World.Generator->GetDensityAt( static_cast(Sample.PositionVoxels.X), static_cast(Sample.PositionVoxels.Y), static_cast(Sample.PositionVoxels.Z)); ++SampleKinds[Sample.Kind]; if (std::bit_cast(Actual) != std::bit_cast(Sample.PluginDensity)) Mismatches.push_back({I,Actual}); } std::cout << "Parity samples by kind:\n"; for (const auto& [Kind,Count] : SampleKinds) std::cout << " " << Kind << ": " << Count << '\n'; for (const FMismatch& M : Mismatches) { const FStandaloneParitySample& S = World.DensitySamples[M.Index]; std::cerr << "MISMATCH index=" << M.Index << " kind=" << S.Kind << " strate=" << S.StrateIndex << " at_voxels=(" << S.PositionVoxels.X << ',' << S.PositionVoxels.Y << ',' << S.PositionVoxels.Z << ") plugin=" << S.PluginDensity << " standalone=" << M.Actual << " plugin_bits=0x" << std::hex << std::bit_cast(S.PluginDensity) << " standalone_bits=0x" << std::bit_cast(M.Actual) << std::dec << '\n'; } std::cout << "Parity: " << (World.DensitySamples.size()-Mismatches.size()) << '/' << World.DensitySamples.size() << " bit-identical; mismatches=" << Mismatches.size() << '\n'; const FStandaloneCpuClipmap Clipmap = StandaloneWorldMesher::Build( World,World.ViewerStartVoxels,6); std::cout << "Clipmap build finished in " << Clipmap.TotalSeconds << " seconds.\n"; return Mismatches.empty() ? 0 : 1; }