Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
303b7b9f24 | ||
|
|
1276fd11e3 |
No files matched your search
+8
-2
@@ -874,8 +874,14 @@ round-2 matched capture source and results are under
|
|||||||
[`Standalone/Research/WorldAssemblerM3/Round2/`](Standalone/Research/WorldAssemblerM3/Round2/).
|
[`Standalone/Research/WorldAssemblerM3/Round2/`](Standalone/Research/WorldAssemblerM3/Round2/).
|
||||||
`RefineLod8NativeCap` in [`Standalone/Core/src/VoxelForgeCore.cpp`](Standalone/Core/src/VoxelForgeCore.cpp)
|
`RefineLod8NativeCap` in [`Standalone/Core/src/VoxelForgeCore.cpp`](Standalone/Core/src/VoxelForgeCore.cpp)
|
||||||
replaces coarse LOD8 ceiling surfaces with the planned 2D cap field while retaining ceiling skirts.
|
replaces coarse LOD8 ceiling surfaces with the planned 2D cap field while retaining ceiling skirts.
|
||||||
The standalone SurfaceWorld plan composer and capture/audit entry point live in
|
The standalone SurfaceWorld plan composer (`AttachRound1WorldAssemblyPrototype`) lives in
|
||||||
[`Standalone/Source/StandaloneViewer.cpp`](Standalone/Source/StandaloneViewer.cpp).
|
[`Standalone/Source/WorldAssemblyPrototype.h`](Standalone/Source/WorldAssemblyPrototype.h), and the
|
||||||
|
streaming benchmark/hash pipeline (`RunPipelinedStreamingBenchmark`, `HashTileRows`) in
|
||||||
|
[`Standalone/Source/StreamBenchmarkPipeline.h`](Standalone/Source/StreamBenchmarkPipeline.h); both are
|
||||||
|
shared by the D3D11 viewer ([`StandaloneViewer.cpp`](Standalone/Source/StandaloneViewer.cpp), which
|
||||||
|
keeps the capture/audit entry points) and the Linux headless tool
|
||||||
|
([`StreamBenchmarkHeadless.cpp`](Standalone/Source/StreamBenchmarkHeadless.cpp), built by
|
||||||
|
`Standalone/BuildLinux.sh`; see `Standalone/Research/WorldAssemblerM3/Linux1/REPORT.md`).
|
||||||
|
|
||||||
`RunStandaloneWorldExport` in `VoxelForgeExploreCommandlet.cpp` serializes owner assets on the game
|
`RunStandaloneWorldExport` in `VoxelForgeExploreCommandlet.cpp` serializes owner assets on the game
|
||||||
thread to schema-v1 JSON. The adapter parses it through `ResolvedWorldSnapshot::FromJson` and keeps
|
thread to schema-v1 JSON. The adapter parses it through `ResolvedWorldSnapshot::FromJson` and keeps
|
||||||
|
|||||||
Executable
+121
@@ -0,0 +1,121 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [[ "${VOXELFORGE_LIMITED_BUILD:-0}" != "1" ]]; then
|
||||||
|
exec taskset -c 0-11 prlimit --as=6442450944 -- env VOXELFORGE_LIMITED_BUILD=1 "$0" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
ROOT="$SCRIPT_DIR"
|
||||||
|
COMPILER="clang++-19"
|
||||||
|
VARIANT="clang19"
|
||||||
|
FP_CONTRACT="off"
|
||||||
|
JOBS=12
|
||||||
|
|
||||||
|
while (($#)); do
|
||||||
|
case "$1" in
|
||||||
|
--compiler=*) COMPILER="${1#*=}" ;;
|
||||||
|
--variant=*) VARIANT="${1#*=}" ;;
|
||||||
|
--fp-contract=*) FP_CONTRACT="${1#*=}" ;;
|
||||||
|
--jobs=*) JOBS="${1#*=}" ;;
|
||||||
|
*) printf 'Unknown build option: %s\n' "$1" >&2; exit 2 ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ! "$JOBS" =~ ^[0-9]+$ ]] || ((JOBS < 1 || JOBS > 12)); then
|
||||||
|
printf 'jobs must be from 1 to 12\n' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
if [[ "$FP_CONTRACT" != "default" && "$FP_CONTRACT" != "off" && "$FP_CONTRACT" != "on" && "$FP_CONTRACT" != "fast" ]]; then
|
||||||
|
printf 'fp-contract must be default, off, on, or fast\n' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
command -v "$COMPILER" >/dev/null || { printf 'Compiler not found: %s\n' "$COMPILER" >&2; exit 2; }
|
||||||
|
command -v ar >/dev/null || { printf 'ar not found\n' >&2; exit 2; }
|
||||||
|
|
||||||
|
BUILD_DIR="$ROOT/Build/linux-$VARIANT"
|
||||||
|
BIN_DIR="$ROOT/bin/linux"
|
||||||
|
mkdir -p "$BUILD_DIR/wrappers" "$BUILD_DIR/objects" "$BIN_DIR"
|
||||||
|
|
||||||
|
INCLUDES=(
|
||||||
|
"-I$ROOT/Core/include"
|
||||||
|
"-I$ROOT/Core/src"
|
||||||
|
"-I$ROOT/Compat"
|
||||||
|
"-I$ROOT/Source"
|
||||||
|
"-I$ROOT/Source/VoxelForge/Public"
|
||||||
|
"-I$ROOT/Source/VoxelForge/Private"
|
||||||
|
)
|
||||||
|
FLAGS=(
|
||||||
|
-std=c++20 -O2 -mavx2 -mfma -fno-fast-math
|
||||||
|
-fexceptions -pthread "${INCLUDES[@]}"
|
||||||
|
)
|
||||||
|
if [[ "$FP_CONTRACT" != "default" ]]; then
|
||||||
|
FLAGS+=("-ffp-contract=$FP_CONTRACT")
|
||||||
|
fi
|
||||||
|
if [[ "$($COMPILER --version | head -n 1)" == *clang* ]]; then
|
||||||
|
FLAGS+=(-Wno-c++11-narrowing)
|
||||||
|
else
|
||||||
|
FLAGS+=(-Wno-narrowing)
|
||||||
|
fi
|
||||||
|
|
||||||
|
CORE_OBJECTS=()
|
||||||
|
LEGACY_OBJECTS=()
|
||||||
|
PIDS=()
|
||||||
|
wait_oldest() {
|
||||||
|
local pid="${PIDS[0]}"
|
||||||
|
wait "$pid"
|
||||||
|
PIDS=("${PIDS[@]:1}")
|
||||||
|
}
|
||||||
|
compile_background() {
|
||||||
|
local source="$1" output="$2"
|
||||||
|
"$COMPILER" "${FLAGS[@]}" -c "$source" -o "$output" &
|
||||||
|
PIDS+=("$!")
|
||||||
|
if ((${#PIDS[@]} >= JOBS)); then wait_oldest; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
while IFS= read -r source_name || [[ -n "$source_name" ]]; do
|
||||||
|
source_name="${source_name%%#*}"
|
||||||
|
source_name="${source_name//[[:space:]]/}"
|
||||||
|
[[ -z "$source_name" ]] && continue
|
||||||
|
source_path="$ROOT/$source_name"
|
||||||
|
[[ -f "$source_path" ]] || { printf 'Missing source from core_sources.txt: %s\n' "$source_name" >&2; exit 2; }
|
||||||
|
if [[ "$source_name" == "Core/src/VoxelForgeCore.cpp" ]]; then
|
||||||
|
object="$BUILD_DIR/objects/VoxelForgeCore.o"
|
||||||
|
compile_background "$source_path" "$object"
|
||||||
|
CORE_OBJECTS+=("$object")
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
wrapper_name="vfcore_${source_name//[^A-Za-z0-9]/_}"
|
||||||
|
wrapper="$BUILD_DIR/wrappers/$wrapper_name.cpp"
|
||||||
|
cat > "$wrapper" <<WRAPPER
|
||||||
|
#include "CoreNamespacePreamble.h"
|
||||||
|
namespace vfcore::detail
|
||||||
|
{
|
||||||
|
#include "$source_path"
|
||||||
|
}
|
||||||
|
WRAPPER
|
||||||
|
object="$BUILD_DIR/objects/$wrapper_name.o"
|
||||||
|
compile_background "$wrapper" "$object"
|
||||||
|
CORE_OBJECTS+=("$object")
|
||||||
|
|
||||||
|
# The same copied compatibility implementations are also needed by the standalone owner
|
||||||
|
# loader/mesher host. They are compiled globally for that reference layer, as in Build.ps1.
|
||||||
|
legacy_object="$BUILD_DIR/objects/legacy_${wrapper_name}.o"
|
||||||
|
compile_background "$source_path" "$legacy_object"
|
||||||
|
LEGACY_OBJECTS+=("$legacy_object")
|
||||||
|
done < "$ROOT/Core/core_sources.txt"
|
||||||
|
|
||||||
|
headless_object="$BUILD_DIR/objects/StreamBenchmarkHeadless.o"
|
||||||
|
compile_background "$ROOT/Source/StreamBenchmarkHeadless.cpp" "$headless_object"
|
||||||
|
LEGACY_OBJECTS+=("$headless_object")
|
||||||
|
|
||||||
|
for pid in "${PIDS[@]}"; do wait "$pid"; done
|
||||||
|
PIDS=()
|
||||||
|
|
||||||
|
CORE_LIBRARY="$BUILD_DIR/libVoxelForgeCore.a"
|
||||||
|
"$(command -v ar)" rcs "$CORE_LIBRARY" "${CORE_OBJECTS[@]}"
|
||||||
|
OUTPUT="$BIN_DIR/VoxelForgeCoreHeadless-$VARIANT"
|
||||||
|
"$COMPILER" -pthread "${LEGACY_OBJECTS[@]}" "$CORE_LIBRARY" -o "$OUTPUT"
|
||||||
|
printf 'Built Core library: %s\nBuilt headless benchmark: %s\n' "$CORE_LIBRARY" "$OUTPUT"
|
||||||
|
printf 'Compiler: %s | variant: %s | fp-contract: %s | jobs: %s\n' "$COMPILER" "$VARIANT" "$FP_CONTRACT" "$JOBS"
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <charconv>
|
#include <charconv>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <cfloat>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|||||||
@@ -11,6 +11,11 @@ void UVoxelStrateDefinition::PostLoad()
|
|||||||
GenerationParams.bTunnelFloorEnabled = true;
|
GenerationParams.bTunnelFloorEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FPrimaryAssetId UVoxelSeasonAsset::GetPrimaryAssetId() const
|
||||||
|
{
|
||||||
|
return FPrimaryAssetId(TEXT("VoxelSeason"),GetFName());
|
||||||
|
}
|
||||||
|
|
||||||
bool UVoxelSeasonAsset::LoadManifest(FVoxelSeasonManifest& OutManifest, FString& OutReport) const
|
bool UVoxelSeasonAsset::LoadManifest(FVoxelSeasonManifest& OutManifest, FString& OutReport) const
|
||||||
{
|
{
|
||||||
OutManifest = FVoxelSeasonManifest();
|
OutManifest = FVoxelSeasonManifest();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <charconv>
|
#include <charconv>
|
||||||
|
#include <cfloat>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Run one child and report its wait4 peak RSS without /usr/bin/time."""
|
||||||
|
import os
|
||||||
|
import resource
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
raise SystemExit("usage: MeasureProcess.py executable [arguments ...]")
|
||||||
|
|
||||||
|
address_limit, _ = resource.getrlimit(resource.RLIMIT_AS)
|
||||||
|
stack_limit, _ = resource.getrlimit(resource.RLIMIT_STACK)
|
||||||
|
if address_limit in (resource.RLIM_INFINITY, -1) or address_limit > 6 * 1024**3:
|
||||||
|
raise SystemExit("run under prlimit --as=6442450944")
|
||||||
|
if stack_limit in (resource.RLIM_INFINITY, -1) or stack_limit < 64 * 1024**2:
|
||||||
|
raise SystemExit("run under prlimit --stack=67108864:67108864")
|
||||||
|
if not os.sched_getaffinity(0).issubset(set(range(12))):
|
||||||
|
raise SystemExit("run under taskset -c 0-11")
|
||||||
|
print(f"[ProcessLimits] address_limit={address_limit} stack_limit={stack_limit} affinity={sorted(os.sched_getaffinity(0))}", flush=True)
|
||||||
|
|
||||||
|
started = time.monotonic()
|
||||||
|
pid = os.fork()
|
||||||
|
if pid == 0:
|
||||||
|
try:
|
||||||
|
os.execvp(sys.argv[1], sys.argv[1:])
|
||||||
|
except OSError as error:
|
||||||
|
print(f"MeasureProcess: exec failed: {error}", file=sys.stderr, flush=True)
|
||||||
|
os._exit(127)
|
||||||
|
|
||||||
|
_, status, usage = os.wait4(pid, 0)
|
||||||
|
wall = time.monotonic() - started
|
||||||
|
exit_code = os.waitstatus_to_exitcode(status)
|
||||||
|
print(f"[ProcessResources] exit_code={exit_code} wall_s={wall:.6f} peak_rss_kib={usage.ru_maxrss}", flush=True)
|
||||||
|
raise SystemExit(exit_code)
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
# L1 — Linux baseline (abyss)
|
||||||
|
|
||||||
|
## What changed
|
||||||
|
|
||||||
|
- `Standalone/Source/StreamBenchmarkPipeline.h` now holds the S13 streaming benchmark, hash helpers, and per-LOD reporting. The Windows viewer and the headless executable call the same functions.
|
||||||
|
- `Standalone/Source/WorldAssemblyPrototype.h` holds the existing Round 1 plan builder; both executables call it.
|
||||||
|
- `Standalone/Source/StreamBenchmarkHeadless.cpp` is the Linux CLI entry point. It loads the same owner JSON, resolves it through `StandaloneOwnerLoader`, builds the same Core snapshot, and runs the shared pipeline. It has no window, renderer, D3D11, or Win32 setup.
|
||||||
|
- `Standalone/BuildLinux.sh` builds the Core library and headless executable. `Linux1/MeasureProcess.py` checks affinity and memory/stack limits and records child peak RSS.
|
||||||
|
- `Standalone/Source/StandaloneViewer.cpp` now includes and calls the shared headers. `Standalone/Core/src/CoreNamespacePreamble.h` and `Standalone/Compat/CoreMinimal.h` include `<cfloat>` for existing `FLT_MAX` use. `Standalone/Compat/StandaloneDataAssetGlue.cpp` now supplies the standalone `UVoxelSeasonAsset::GetPrimaryAssetId` implementation matching the engine source.
|
||||||
|
|
||||||
|
The headless entry point retains the parsed JSON root for the existing snapshot adapter. The route planner, Core shape compile, tile generator, hash code, and pipeline counters are shared with the viewer, rather than reimplemented. Viewer-only command switches for process affinity, priority, and frame limit are accepted for command-line parity; the Linux runner pins and limits itself externally.
|
||||||
|
|
||||||
|
**Windows compile risk:** MSVC was unavailable here, so the Windows viewer was not compiled. The likely risk spots are the new includes and namespaced calls in `StandaloneViewer.cpp`, and the moved inline bodies in `StreamBenchmarkPipeline.h` and `WorldAssemblyPrototype.h`; `Build.ps1` compiles that viewer with `/std:c++20`. The Linux-only main, script, and RSS helper are not in the explicit Windows source list. The compatibility `GetPrimaryAssetId` mirrors `VoxelSeasonAsset.cpp`; keep the engine `.cpp` out of the Standalone compatibility manifest to avoid a duplicate if that manifest is expanded later. No density formula changed, so no recipe-version bump is needed.
|
||||||
|
|
||||||
|
## Build and run commands
|
||||||
|
|
||||||
|
Run from the repo root. `BuildLinux.sh` enforces CPUs 0–11 and a 6 GiB address-space limit itself; the explicit wrapper below makes those limits visible at the call site too. The build output is under `Standalone/Build/linux-*` and `Standalone/bin/linux/`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
taskset -c 0-11 prlimit --as=6442450944 -- \
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=clang++-19 --variant=clang19 --jobs=12 --fp-contract=off \
|
||||||
|
> Saved/Linux/build-clang19-final.log 2>&1
|
||||||
|
|
||||||
|
taskset -c 0-11 prlimit --as=6442450944 -- \
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=g++-14 --variant=gcc14 --jobs=12 --fp-contract=off \
|
||||||
|
> Saved/Linux/build-gcc14.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
The measured build flags were `-std=c++20 -O2 -mavx2 -mfma -ffp-contract=off -fno-fast-math`; Clang also suppresses the legacy narrowing diagnostic that MSVC accepts. The benchmark wrapper below enforces the 6 GiB address-space cap, a 64 MiB stack, and CPU affinity, then records `wait4` peak RSS. These are the exact run calls; `yes` adds `--profile-column-overlap`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
run_bench() {
|
||||||
|
local variant="$1" workers="$2" overlap="$3" name="$4"
|
||||||
|
local profile=()
|
||||||
|
if [[ "$overlap" == yes ]]; then profile+=(--profile-column-overlap); fi
|
||||||
|
taskset -c 0-11 prlimit --as=6442450944 --stack=67108864:67108864 -- \
|
||||||
|
python3 Standalone/Research/WorldAssemblerM3/Linux1/MeasureProcess.py \
|
||||||
|
"Standalone/bin/linux/VoxelForgeCoreHeadless-$variant" Standalone/data/owner_world.json \
|
||||||
|
--workers="$workers" --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash \
|
||||||
|
--force-generate --clip-radius=3 --max-clip-level=8 \
|
||||||
|
--camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 \
|
||||||
|
--process-priority=Normal --process-affinity=4095 --frame-limit=60 \
|
||||||
|
"${profile[@]}" > "Saved/Linux/$name.log" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
run_bench clang19 1 no bench-clang19-w1-r1
|
||||||
|
run_bench clang19 8 no bench-clang19-w8-r1
|
||||||
|
run_bench clang19 12 no bench-clang19-w12-r1
|
||||||
|
run_bench clang19 8 no bench-clang19-w8-r2
|
||||||
|
run_bench clang19 12 no bench-clang19-w12-r2
|
||||||
|
run_bench clang19 1 no bench-clang19-w1-r2
|
||||||
|
run_bench clang19 12 no bench-clang19-w12-r3
|
||||||
|
run_bench clang19 1 no bench-clang19-w1-r3
|
||||||
|
run_bench clang19 8 no bench-clang19-w8-r3
|
||||||
|
run_bench clang19 8 yes bench-clang19-w8-columns-r1
|
||||||
|
run_bench clang19 8 yes bench-clang19-w8-columns-r2
|
||||||
|
run_bench clang19 8 yes bench-clang19-w8-columns-r3
|
||||||
|
run_bench gcc14 8 no bench-gcc14-w8
|
||||||
|
```
|
||||||
|
|
||||||
|
Every run used a fresh process and a newly constructed streamer; the pipeline reported `cache_hits=0`, so no process or thread-local tile/column cache carried over. `--force-generate` was passed for CLI parity, not relied on for isolation. The kernel file cache was not purged: doing so would require a system-wide setting outside the allowed write boundary. Owner JSON load is included in the cold-start timer and took about 5 ms.
|
||||||
|
|
||||||
|
## Hashes and determinism
|
||||||
|
|
||||||
|
Every Linux hash below covers the same 2,553-tile Round17 view. Clang used `-ffp-contract=off`, matching the intended MSVC `/fp:precise` behavior; GCC used the same contraction setting. Both builds enabled AVX2/FMA instructions but disabled contraction.
|
||||||
|
|
||||||
|
| Build / workers | Runs | Density | Mesh | Payload | Topology | Tiles |
|
||||||
|
|---|---:|---|---|---|---|---:|
|
||||||
|
| Windows S13 reference, W1/W8/W12 | S13 | `c10697a8f48380c7` | `e75c9119a1498cd5` | `49a9a8d1835a6c8c` | `edcb23288b5e8724` | 2,553 |
|
||||||
|
| Linux Clang 19, W1 | 3 | `c10697a8f48380c7` | `e75c9119a1498cd5` | `49a9a8d1835a6c8c` | `edcb23288b5e8724` | 2,553 |
|
||||||
|
| Linux Clang 19, W8 | 3 | `c10697a8f48380c7` | `e75c9119a1498cd5` | `49a9a8d1835a6c8c` | `edcb23288b5e8724` | 2,553 |
|
||||||
|
| Linux Clang 19, W12 | 3 | `c10697a8f48380c7` | `e75c9119a1498cd5` | `49a9a8d1835a6c8c` | `edcb23288b5e8724` | 2,553 |
|
||||||
|
| Linux GCC 14, W8 | 1 | `c10697a8f48380c7` | `e75c9119a1498cd5` | `49a9a8d1835a6c8c` | `edcb23288b5e8724` | 2,553 |
|
||||||
|
|
||||||
|
There was no divergence in this owner seed/view, so there is no first sample or stage to bisect and no density fix to make. The result covers the full hashed view, not every possible seed or platform math-library input. The tested flags show no observable FMA, libm, integer-width, container-order, or SIMD difference here; they do not establish what default Clang contraction would do.
|
||||||
|
|
||||||
|
Clang W1/W8/W12 each produced identical hashes across all three runs. The GCC W8 run agreed too. The overlap-capture counts varied slightly with worker scheduling, while the generated hashes stayed fixed.
|
||||||
|
|
||||||
|
## Linux timing and per-LOD cost
|
||||||
|
|
||||||
|
Machine: Debian 13, Intel i9-12900H, 15 GB RAM, 24 MiB L3. Processes were pinned to logical CPUs 0–11 (the six P-cores and their SMT siblings); CPUs 12–19 remained free. CPUs 0–11 reported `powersave` governor and `balance_performance` EPP. No governor or system setting was changed; priority remained normal. `RLIMIT_AS` was 6 GiB for every build and benchmark process. The benchmark stack was limited to 64 MiB after the default-stack failures below. No run reached the 30-minute limit.
|
||||||
|
|
||||||
|
`whole_view_ready` is the cold-start timer from process start through all 2,553 tiles, including owner load, plan, shape compile, and streamed generation. Values are median `[min–max]` of three interleaved runs. Peak RSS values are the three `wait4` readings in KiB, in run order; the maximum across all successful runs was 604,652 KiB.
|
||||||
|
|
||||||
|
| Workers | `whole_view_ready` median [range] | Peak RSS per run (KiB) |
|
||||||
|
|---:|---:|---|
|
||||||
|
| W1 | 16.555 s [16.069–16.660] | 218,372 / 329,308 / 329,012 |
|
||||||
|
| W8 | 3.562 s [3.558–3.602] | 445,884 / 462,588 / 462,216 |
|
||||||
|
| W12 | 3.512 s [3.482–3.557] | 536,884 / 537,208 / 539,036 |
|
||||||
|
| W8 with overlap capture | 3.718 s [3.638–3.718] | 603,820 / 603,480 / 604,652 |
|
||||||
|
| GCC 14 W8 hash check | 3.789 s (one run) | 463,276 |
|
||||||
|
|
||||||
|
The S13 W8 Windows reference was 3.518 s on the owner’s 5800X3D. The Linux W8 result is 44 ms (about 1.3%) slower for the same source view and timer, but these are different CPUs and this is a baseline comparison, not an optimization result. Round17 documents no corresponding W1/W12 timing for a direct comparison.
|
||||||
|
|
||||||
|
The next table divides S13’s accumulated `worker_sum_s` by tile count. Each cell is median `[min–max]` milliseconds per tile across the three Clang runs. It is average worker time per tile, not a per-tile p95 or whole-pipeline elapsed time.
|
||||||
|
|
||||||
|
| LOD | W1 ms/tile | W8 ms/tile | W12 ms/tile |
|
||||||
|
|---:|---:|---:|---:|
|
||||||
|
| 0 | 2.131 [2.066–2.144] | 4.222 [4.146–4.343] | 6.405 [6.364–6.489] |
|
||||||
|
| 1 | 4.429 [4.281–4.441] | 7.394 [7.335–7.491] | 11.084 [11.000–11.296] |
|
||||||
|
| 2 | 1.319 [1.282–1.319] | 1.871 [1.842–1.943] | 2.771 [2.740–2.813] |
|
||||||
|
| 3 | 5.520 [5.366–5.527] | 7.916 [7.860–8.179] | 11.777 [11.670–11.916] |
|
||||||
|
| 4 | 16.305 [15.787–16.344] | 23.403 [23.382–23.798] | 34.479 [34.229–34.654] |
|
||||||
|
| 5 | 7.389 [7.223–7.443] | 10.714 [10.567–10.926] | 15.520 [15.288–15.605] |
|
||||||
|
| 6 | 15.521 [15.021–15.638] | 22.183 [21.813–22.350] | 32.063 [31.641–32.163] |
|
||||||
|
| 7 | 17.203 [16.495–17.226] | 24.476 [23.925–24.560] | 33.760 [33.085–33.885] |
|
||||||
|
| 8 | 12.087 [11.673–12.228] | 16.591 [16.559–16.617] | 22.738 [22.610–23.673] |
|
||||||
|
|
||||||
|
S13’s exclusive stage counters are also retained per LOD: column evaluation, marching cubes, ground/cap refinement, and mesh assembly. At W8, column evaluation averaged 21.124 ms/tile at LOD4 `[21.083–21.462]`, versus 6.815 ms at LOD3 `[6.761–7.014]`; LOD4 remains the standout cost. Standalone has matching aggregate stage sums, but no BuildHost-style per-tile p95 or per-LOD classify-exclusive p95. It also has no counterpart for full-scan versus candidate feature-list p95, field-point calls p95, column misses p95, or approximate per-LOD hit rate; its field/cache totals are whole-run totals, and its overlap capture measures cross-tile XY reuse instead. BuildHost `UWorld::Tick`, apply, and stationary-ring timings also have no headless equivalent.
|
||||||
|
|
||||||
|
The W8 overlap capture completed for all tiles and all LODs. Each cell is median `[min–max]` across three captures.
|
||||||
|
|
||||||
|
| LOD | Unique XY columns | Repeated tile evaluations | Neighbor repeats | Cross-worker neighbor repeats |
|
||||||
|
|---:|---:|---:|---:|---:|
|
||||||
|
| 0 | 128,240 [128,240–128,240] | 360,764 [359,953–364,225] | 301,491 [300,316–301,913] | 296,573 [294,996–297,862] |
|
||||||
|
| 1 | 103,957 [103,464–104,384] | 300,707 [296,768–312,183] | 243,479 [236,767–246,556] | 238,030 [228,885–241,780] |
|
||||||
|
| 2 | 32,267 [32,263–32,271] | 106,072 [104,091–106,939] | 90,338 [88,410–90,534] | 87,693 [84,976–87,921] |
|
||||||
|
| 3 | 33,286 [33,286–33,286] | 87,531 [87,310–88,408] | 81,853 [79,915–83,171] | 78,814 [76,126–78,903] |
|
||||||
|
| 4 | 91,325 [91,325–91,325] | 231,088 [230,967–231,122] | 228,336 [226,998–228,369] | 207,383 [191,310–207,789] |
|
||||||
|
| 5 | 71,960 [71,960–71,960] | 118,805 [118,676–118,806] | 118,665 [117,782–118,797] | 111,453 [108,197–112,585] |
|
||||||
|
| 6 | 280,336 [280,336–280,336] | 63,463 [63,148–63,624] | 63,463 [63,148–63,624] | 63,204 [62,944–63,579] |
|
||||||
|
| 7 | 71,530 [71,530–71,530] | 7,762 [7,752–7,807] | 7,762 [7,752–7,807] | 7,155 [7,074–7,262] |
|
||||||
|
| 8 | 106,219 [106,219–106,219] | 32,092 [32,013–32,155] | 32,092 [32,013–32,155] | 28,393 [27,959–28,598] |
|
||||||
|
|
||||||
|
## Failed and retried attempts
|
||||||
|
|
||||||
|
- `build-clang19.log` failed because `FLT_MAX` was undeclared; adding `<cfloat>` fixed it.
|
||||||
|
- `build-clang19-retry1.log` failed on existing double-to-float list initializers in `VoxelStrateManager.cpp` and an incorrect dereference in the new runner. The Linux build suppresses that legacy Clang narrowing diagnostic and passes the snapshot value correctly.
|
||||||
|
- `build-clang19-retry2.log` linked with unresolved `typeinfo for UVoxelSeasonAsset`; the compatibility glue now provides the missing `GetPrimaryAssetId`. `build-clang19-retry3.log` and `build-clang19-final.log` succeeded.
|
||||||
|
- A temporary diagnostic relink in `rebuild-headless-crash-handler.log` omitted `main` and failed; `relink-headless-crash-handler.log` corrected it. This was only for diagnosis and is not part of the final source.
|
||||||
|
- `smoke-clang19-w1.log` stopped before launching because `/usr/bin/time` was absent. No package was installed; `MeasureProcess.py` replaced it.
|
||||||
|
- Seven default-stack W1 attempts (`smoke-clang19-w1-r1.log` through `r7.log`) and three instrumented diagnostic runs (`smoke-clang19-direct.log`, `smoke-clang19-entry.log`, `smoke-clang19-stack.log`) exited with SIGSEGV while entering `FStandaloneStreamingGenerator::Generate` under the default 8 MiB stack. Their peak RSS was 211,056–329,008 KiB. A 64 MiB stack completed the diagnostic run (`smoke-clang19-stack64m.log`, 330,288 KiB peak RSS); temporary tracing pointed to worker stack exhaustion. That diagnostic included an extra direct tile and was excluded from the baseline. All clean baseline runs used the 64 MiB stack.
|
||||||
|
|
||||||
|
## Note for the owner
|
||||||
|
|
||||||
|
For this owner seed and view, a Linux server and Windows client generate identical hashed density, mesh, payload, and topology, and the hashes stayed stable across Linux worker counts and compilers. This i9-12900H result is a local Linux speed baseline; the W8 time is close to the S13 Windows number, but the machines differ and it should not be read as a speedup.
|
||||||
|
|
||||||
|
## Orchestrator review (Claude)
|
||||||
|
|
||||||
|
- **The default-stack crash is thread-local storage, not deep recursion.** `-fstack-usage` shows no frame over
|
||||||
|
~4 KB in Core or the headless tool (`Generate` is 8 KB). But the binary's TLS segment is
|
||||||
|
`0x115068d` = **17.3 MiB per thread** (6.1 MiB of it initialised data), and glibc carves static TLS out of
|
||||||
|
each thread's stack, so an 8 MiB default stack overflows before any work runs. Largest pieces:
|
||||||
|
`world_assembly_detail::HeightfieldColumnCache` 6.8 MB, `GFloorReliefCache` 1.3 MB (x2: Core and
|
||||||
|
legacy copies), `IslandColumnCache` 1.1 MB, `GRoomGraphCache` 0.97 MB (x2), `GSurfColCache` 0.83 MB (x2).
|
||||||
|
Windows allocates TLS separately from the 1 MB thread stack, which is why it never showed there.
|
||||||
|
It matters for a Linux dedicated server: every worker thread pays ~17 MB and copies 6 MB on start.
|
||||||
|
Open for a later round (after S14, which reworks the column cache).
|
||||||
|
- **Untested:** the hash match is with `-ffp-contract=off`. Whether the hash would *detect* contraction
|
||||||
|
(`on`/`fast`) has not been shown, so it is not yet proven the flag is load-bearing.
|
||||||
|
- Viewer move checked: of 738 removed viewer lines, all but 12 signature lines (now `inline`/namespaced)
|
||||||
|
reappear verbatim in the two shared headers; every remaining viewer use is qualified or `using`-imported.
|
||||||
|
MSVC compile still unverified.
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Run one child and print its wait4 peak RSS under the Linux2 process limits."""
|
||||||
|
import os
|
||||||
|
import resource
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
raise SystemExit("usage: MeasureProcess.py executable [arguments ...]")
|
||||||
|
|
||||||
|
address_limit, _ = resource.getrlimit(resource.RLIMIT_AS)
|
||||||
|
stack_limit, _ = resource.getrlimit(resource.RLIMIT_STACK)
|
||||||
|
if address_limit in (resource.RLIM_INFINITY, -1) or address_limit > 6 * 1024**3:
|
||||||
|
raise SystemExit("run under prlimit --as=6442450944")
|
||||||
|
if stack_limit in (resource.RLIM_INFINITY, -1) or stack_limit < 8 * 1024**2:
|
||||||
|
raise SystemExit("run with the ordinary process stack limit of at least 8 MiB")
|
||||||
|
if not os.sched_getaffinity(0).issubset(set(range(12))):
|
||||||
|
raise SystemExit("run under taskset -c 0-11")
|
||||||
|
print(f"[ProcessLimits] address_limit={address_limit} stack_limit={stack_limit} affinity={sorted(os.sched_getaffinity(0))}", flush=True)
|
||||||
|
|
||||||
|
started = time.monotonic()
|
||||||
|
pid = os.fork()
|
||||||
|
if pid == 0:
|
||||||
|
try:
|
||||||
|
os.execvp(sys.argv[1], sys.argv[1:])
|
||||||
|
except OSError as error:
|
||||||
|
print(f"MeasureProcess: exec failed: {error}", file=sys.stderr, flush=True)
|
||||||
|
os._exit(127)
|
||||||
|
|
||||||
|
_, status, usage = os.wait4(pid, 0)
|
||||||
|
wall = time.monotonic() - started
|
||||||
|
exit_code = os.waitstatus_to_exitcode(status)
|
||||||
|
print(f"[ProcessResources] exit_code={exit_code} wall_s={wall:.6f} peak_rss_kib={usage.ru_maxrss}")
|
||||||
|
raise SystemExit(exit_code)
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
# WorldAssemblerM3 Linux2
|
||||||
|
|
||||||
|
## Result and changes
|
||||||
|
|
||||||
|
The hash check can go red. `-ffp-contract=on`, `fast`, and GCC's default each change the first stage hash (density) on the L1 view; contraction off still reproduces all four L1 hashes at W1 and W12. No Core cache or density source was changed.
|
||||||
|
|
||||||
|
The standalone now accepts `--seed`, `--recipe`, and `--render-distance-chunks`; the viewer uses those same options for Windows replay. Linux standalone workers use 32 MiB pthread stacks, while the process retains its ordinary 8 MiB stack limit. The build script still defaults to contraction off; `--fp-contract=default` omits that override for the compiler-default probe.
|
||||||
|
|
||||||
|
Environment: i9-12900H, CPUs 0–11, Clang 19.1.7, GCC 14.2.0, governor `powersave`, EPP `balance_performance`. Runs used `taskset -c 0-11`, `RLIMIT_AS=6,442,450,944`, normal priority, and no 64 MiB stack limit. Peak `wait4` RSS was 539,648 KiB on the 2,553-tile checks and 293,460 KiB in the seed sweep.
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
Build variants, with `--fp-contract=off`, `on`, and `fast` as named; `default` leaves the compiler flag unset:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=clang++-19 --variant=clang19-l2-off --jobs=12 --fp-contract=off
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=clang++-19 --variant=clang19-l2-on --jobs=12 --fp-contract=on
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=clang++-19 --variant=clang19-l2-fast --jobs=12 --fp-contract=fast
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=g++-14 --variant=gcc14-l2-off --jobs=12 --fp-contract=off
|
||||||
|
bash Standalone/BuildLinux.sh --compiler=g++-14 --variant=gcc14-l2-default --jobs=12 --fp-contract=default
|
||||||
|
```
|
||||||
|
|
||||||
|
The L1-view call was `taskset -c 0-11 prlimit --as=6442450944 -- python3 Standalone/Research/WorldAssemblerM3/Linux2/MeasureProcess.py <binary> Standalone/data/owner_world.json --workers=<1|12> --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0`. The per-variant commands and resource records are in `Saved/Linux/linux2-contract-final-*.log`.
|
||||||
|
|
||||||
|
The seed matrix ran with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 Standalone/Research/WorldAssemblerM3/Linux2/RunSeedSweep.py 1800
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contraction sensitivity
|
||||||
|
|
||||||
|
All rows cover the same 2,553-tile L1 view, W12. `g++-14 -Q --help=optimizers -O2 -fno-fast-math` reports `-ffp-contract=fast` when no override is given.
|
||||||
|
|
||||||
|
| Build | Density | Mesh | Payload | Topology | First divergence from off |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| Clang 19 off; GCC 14 off | `c10697a8f48380c7` | `e75c9119a1498cd5` | `49a9a8d1835a6c8c` | `edcb23288b5e8724` | — |
|
||||||
|
| Clang 19 on | `acfa7023c3671dd6` | `adacc34b568be881` | `7c1de424738166e3` | `78e77fd29674920f` | density |
|
||||||
|
| Clang 19 fast | `f04bb87094a92a25` | `07596ba1a83f91d5` | `1292f277745a876d` | `b07b82bfb52166f5` | density |
|
||||||
|
| GCC 14 default (effective fast) | `03ed0b826a9ff773` | `07596ba1a83f91d5` | `fb6f82e779be56b2` | `9e5d549138ef2bc0` | density |
|
||||||
|
|
||||||
|
The hashes come from the whole-view pipeline stages in order: density, mesh, payload, topology. The same contraction-off binaries reproduce L1 at W1 as well as W12.
|
||||||
|
|
||||||
|
## Seed sweep
|
||||||
|
|
||||||
|
`seeds.txt` contains seed 0 plus 47 distinct values sampled without replacement from signed int32 using `random.Random(0x564F58454C464F52)`. With no mismatch among the 47 random draws, the one-sided 95% binomial upper bound is 6.18% for a random seed to mismatch on this exact matrix; seed 0 is included as the fixed L1 baseline.
|
||||||
|
|
||||||
|
| Recipe | Seeds | Linux combinations | Coverage per seed |
|
||||||
|
|---|---:|---|---|
|
||||||
|
| SurfaceWorld | 48 | Clang/GCC × W1/W12 (192 rows) | 27 LOD0 tiles; voxels `(-32,-192,-1984)` to `(64,-96,-1888)`, a 96³ cube (24 m per side) |
|
||||||
|
| FloatingIslands | 48 | Clang/GCC × W1/W12 (192 rows) | 27 LOD0 tiles; voxels `(-32,-32,-160)` to `(64,64,-64)`, a 96³ cube (24 m per side) |
|
||||||
|
|
||||||
|
All 384 runs passed. Clang/GCC matched at both worker counts in 192 comparisons; W1/W12 also matched within each compiler in 192 comparisons. The full per-seed, per-stage hashes, tile extents, wall time, and RSS are in [seed_hashes.csv](seed_hashes.csv); the summary is in [seed_sweep_summary.txt](seed_sweep_summary.txt). The sweep took 290.1 seconds; its maximum per-process peak RSS was 293,460 KiB. Coverage is limited to these fixed local cubes.
|
||||||
|
|
||||||
|
For seed 0, SurfaceWorld hashes are `e93491225d0202f9 / 6b2a630951428df2 / fc2798d6a5478b25 / 0c08d7d980a84301`; FloatingIslands hashes are `ea74d3354b5ce671 / 476d49ae2a4ba2a6 / 16078fcd36b68ff0 / cfb6c412b7118172`. Each sequence is density / mesh / payload / topology and matched across both compilers and worker counts.
|
||||||
|
|
||||||
|
The viewer seed override was added in `StandaloneViewer.cpp` and the standalone recipe helper; no Core change is needed. [windows_commands.txt](windows_commands.txt) contains all 192 PowerShell commands. Example from the repository root:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=0 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
```
|
||||||
|
|
||||||
|
Build the viewer with `powershell -ExecutionPolicy Bypass -File Standalone\Build.ps1`, then run the full replay with `powershell -ExecutionPolicy Bypass -File Standalone\Research\WorldAssemblerM3\Linux2\WindowsReplay.ps1`; it writes logs under `Saved\Linux`. Windows/MSVC compilation was unavailable here. Portability risk spots are the new C++20 helpers in `WorldAssemblyPrototype.h`, `strtoll` argument parsing in `StandaloneViewer.cpp`, and the `__linux__`/`std::thread` split in `StandaloneWorkerThread.h`; the pthread path is Linux-guarded.
|
||||||
|
|
||||||
|
## TLS cost and follow-up
|
||||||
|
|
||||||
|
`readelf -lW` reports `PT_TLS` FileSiz 6,093,024 bytes (5.81 MiB initialized image) and MemSiz 18,155,149 bytes (17.31 MiB per thread). Three 12-worker probes under the ordinary 8 MiB process stack measured a median spawn-to-ready time of 5.63 ms per thread (5.07–6.44 ms), and a resident increase of 17,736 KiB per worker after the first (17,936 KiB for the first). At 12 workers, `/proc/self/statm` rose by 213,036 KiB (208.0 MiB); the 32 MiB worker stacks reserve a further 32,772 KiB of virtual address space each. The largest wait4 peak across TLS probes was 268,476 KiB.
|
||||||
|
|
||||||
|
The large TLS symbols include `HeightfieldColumnCache` (0x680000 bytes, about 6.8 MB), `IslandColumnCache` (0x110000), plus duplicated `GFloorReliefCache` (0x140000 each), `GRoomGraphCache` (0xed000 each), and `GSurfColCache` (0xc9e78 each). `GPlayerFitMemo` is also duplicated as a process-wide object in ordinary `.bss`. [core_sources.txt](../../../Core/core_sources.txt) has 18 translation units: `VoxelForgeCore.cpp` is compiled once; each other 17 is compiled both as a `vfcore::detail` wrapper for Core and as a global legacy object for the standalone owner loader/mesher. This isolates the Core copy from Unreal-shaped global symbols and preserves the legacy reference path; the duplicate objects also duplicate cache state.
|
||||||
|
|
||||||
|
The L2 executable's static TLS measurement does not establish the Unreal plugin's model. Inference: a runtime-loaded shared object using general-dynamic TLS can obtain per-thread blocks through the dynamic loader, so it may avoid this exact static-TLS-in-stack footprint; the actual UBT `.so` flags and relocations must be inspected. glibc documents the TLS/dlopen compatibility concern for initial-exec TLS and recommends global-dynamic for more general shared-object loading ([glibc Dynamic Linker Hardening](https://www.sourceware.org/glibc/manual/latest/html_node/Dynamic-Linker-Hardening.html)); GCC describes the per-thread storage model and its loader/libc support ([GCC Thread-Local Storage](https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Thread-Local.html)).
|
||||||
|
|
||||||
|
After S14, prototype a small per-thread TLS handle backed by a bounded worker scratch pool or explicit generation context; share immutable initialized data and remove the Core/legacy duplicate cache where practical. This is a proposal only. The standalone stack wrapper already avoids the external 64 MiB process-stack setting: its own Linux workers request 32 MiB, and the L1 hashes stayed unchanged.
|
||||||
|
|
||||||
|
## Failed and retried runs
|
||||||
|
|
||||||
|
- The first Clang-off build failed because one join loop still named `std::thread&`; it was changed to `FStandaloneWorkerThread&` and rebuilt successfully (`linux2-build-clang-off.log`, then the retry logs). One later GCC-off build attempt stopped with `headless_object: unbound variable` (`linux2-build-gcc-off-final2.log`); an immediate identical build under the same CPU/address-space limits succeeded (`linux2-build-gcc-off-debug.log`), and the failure did not recur.
|
||||||
|
- The first FloatingIslands smoke used the default far ring and planned 186,911 tiles; it was stopped after about 10 seconds before generation (`linux2-floating-smoke-clang-w1.log`). With `--render-distance-chunks=0`, a radius-2/max-LOD-4 smoke completed 791 tiles in 18.94 seconds (`linux2-floating-smoke-clang-w1-r2.log`); the sweep uses radius 1/max-LOD 0 (27 tiles).
|
||||||
|
- The first contraction pass omitted the L1 camera and covered 2,370 tiles (`linux2-contract-*-w12.log`), so those hashes were discarded. The exact L1 camera rerun covered 2,553 tiles and produced the table above (`linux2-contract-final-*.log`).
|
||||||
|
- An optional one-ULP diagnostic attempt did not trigger (no injection line and no hash change; `linux2-negative-one-ulp-clang-off-w12.log`), so that switch was removed. It was unnecessary after the contraction variants made the check go red. The seed sweep had no failed or retried runs.
|
||||||
|
|
||||||
|
## Note for the owner
|
||||||
|
|
||||||
|
Contraction off reproduces L1 at W1/W12, while Clang on/fast and GCC default diverge first at density, so the Unreal Linux build's effective FP flags are decisive. The 48-seed sample matched across compilers and worker counts on 24 m-sided cubes in both recipes; the Windows replay commands are ready, with their MSVC build still unverified.
|
||||||
|
|
||||||
|
## Orchestrator review (Claude)
|
||||||
|
|
||||||
|
- **Surface sweep coverage is 14 effective seeds, not 48.** In `seed_hashes.csv`, 34 of the 48 SurfaceWorld
|
||||||
|
seeds give seed 0's exact density hash `0xe93491225d0202f9`, i.e. the fixed 24 m cube carries no
|
||||||
|
seed-dependent surface for them. Only 14 seeds exercise distinct terrain, so the 6.18% bound applies to
|
||||||
|
FloatingIslands (48 distinct hashes) but not to SurfaceWorld. Future sweeps should place the cube on each
|
||||||
|
seed's surface and report a per-seed non-empty-mesh count, so an empty cube can't count as a pass.
|
||||||
|
- Re-run by me: `VoxelForgeCoreHeadless-clang19-l2-off`, W12, plain 8 MiB `ulimit -s`, L1 view:
|
||||||
|
whole view 3.361 s, hashes `c10697a8f48380c7 / e75c9119a1498cd5 / 49a9a8d1835a6c8c / edcb23288b5e8724`.
|
||||||
|
- **Consequence of the contraction table:** Core's world now provably depends on the toolchain's FP-contract
|
||||||
|
setting, which every build outside `Build.ps1`/`BuildLinux.sh` (UBT on Windows and Linux) sets for itself.
|
||||||
|
Next: make Core immune to, or loudly detect, contraction instead of relying on flags.
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Run the deterministic Linux2 seed/compiler/worker matrix under the owner limits."""
|
||||||
|
import csv
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
ROOT = Path.cwd()
|
||||||
|
ROUND = ROOT / "Standalone/Research/WorldAssemblerM3/Linux2"
|
||||||
|
LOG_DIR = ROOT / "Saved/Linux"
|
||||||
|
MEASURE = ROUND / "MeasureProcess.py"
|
||||||
|
DATA = ROOT / "Standalone/data/owner_world.json"
|
||||||
|
BINARIES = {
|
||||||
|
"clang19": ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-clang19-l2-off",
|
||||||
|
"gcc14": ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-gcc14-l2-off",
|
||||||
|
}
|
||||||
|
CAMERAS = {
|
||||||
|
"surface-world": "0,-35,-487.94,0,-22",
|
||||||
|
"floating-islands": "0,0,-32,0,-22",
|
||||||
|
}
|
||||||
|
HASH_RE = re.compile(
|
||||||
|
r"\[PipelineWholeViewHash\] tiles=(\d+) density=0x([0-9a-f]+) "
|
||||||
|
r"mesh=0x([0-9a-f]+) payload=0x([0-9a-f]+) topology=0x([0-9a-f]+)"
|
||||||
|
)
|
||||||
|
VOLUME_RE = re.compile(
|
||||||
|
r"\[PipelineVolume\] tiles=(\d+) lod=(\d+)\.\.(\d+) "
|
||||||
|
r"min_voxel=\((-?\d+),(-?\d+),(-?\d+)\) "
|
||||||
|
r"max_voxel=\((-?\d+),(-?\d+),(-?\d+)\)"
|
||||||
|
)
|
||||||
|
READY_RE = re.compile(r"\[StreamPipeline\].*whole_view_ready=([0-9.]+)s")
|
||||||
|
RESOURCE_RE = re.compile(r"\[ProcessResources\] exit_code=(-?\d+) wall_s=([0-9.]+) peak_rss_kib=(\d+)")
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
if not (1 <= len(sys.argv) <= 2):
|
||||||
|
raise SystemExit("usage: RunSeedSweep.py [budget-seconds; default 1800]")
|
||||||
|
budget_seconds = int(sys.argv[1]) if len(sys.argv) == 2 else 1800
|
||||||
|
seeds = [int(line.strip()) for line in (ROUND / "seeds.txt").read_text().splitlines() if line.strip()]
|
||||||
|
if len(seeds) != 48 or len(set(seeds)) != len(seeds):
|
||||||
|
raise SystemExit("seeds.txt must contain 48 unique signed int32 seeds")
|
||||||
|
missing = [str(path) for path in [MEASURE, DATA, *BINARIES.values()] if not path.is_file()]
|
||||||
|
if missing:
|
||||||
|
raise SystemExit("missing sweep input/build: " + ", ".join(missing))
|
||||||
|
|
||||||
|
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
output_path = ROUND / "seed_hashes.csv"
|
||||||
|
fields = [
|
||||||
|
"seed", "recipe", "compiler", "workers", "tiles", "lod_min", "lod_max",
|
||||||
|
"min_x", "min_y", "min_z", "max_x", "max_y", "max_z",
|
||||||
|
"density_hash", "mesh_hash", "payload_hash", "topology_hash",
|
||||||
|
"whole_view_ready_s", "wall_s", "peak_rss_kib", "exit_code", "status",
|
||||||
|
]
|
||||||
|
started = time.monotonic()
|
||||||
|
total = len(seeds) * len(CAMERAS) * len(BINARIES) * 2
|
||||||
|
print(f"Sweep: {len(seeds)} seeds × 2 recipes × 2 compilers × W1/W12 = {total} runs; budget={budget_seconds}s", flush=True)
|
||||||
|
|
||||||
|
with output_path.open("w", newline="") as csv_file:
|
||||||
|
writer = csv.DictWriter(csv_file, fieldnames=fields)
|
||||||
|
writer.writeheader()
|
||||||
|
for seed in seeds:
|
||||||
|
for recipe, camera in CAMERAS.items():
|
||||||
|
for compiler, binary in BINARIES.items():
|
||||||
|
for workers in (1, 12):
|
||||||
|
remaining = budget_seconds - (time.monotonic() - started)
|
||||||
|
if remaining <= 0:
|
||||||
|
print("Sweep exceeded its 30 minute budget; stopping.", file=sys.stderr, flush=True)
|
||||||
|
return 124
|
||||||
|
stem = f"linux2-seed-{seed}-{recipe}-{compiler}-w{workers}"
|
||||||
|
log_path = LOG_DIR / f"{stem}.log"
|
||||||
|
args = [
|
||||||
|
str(binary), str(DATA), f"--seed={seed}", f"--recipe={recipe}",
|
||||||
|
"--render-distance-chunks=0", f"--workers={workers}",
|
||||||
|
"--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline",
|
||||||
|
"--stream-hash", "--force-generate", "--clip-radius=1",
|
||||||
|
"--max-clip-level=0", f"--camera={camera}", "--far-horizon-lod8-step=0",
|
||||||
|
]
|
||||||
|
command = [
|
||||||
|
"taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--",
|
||||||
|
"python3", str(MEASURE), *args,
|
||||||
|
]
|
||||||
|
with log_path.open("w") as log_file:
|
||||||
|
log_file.write("[SweepCommand] " + " ".join(command) + "\n")
|
||||||
|
log_file.flush()
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
command, cwd=ROOT, stdout=log_file, stderr=subprocess.STDOUT,
|
||||||
|
timeout=min(900, max(1, remaining)), check=False,
|
||||||
|
)
|
||||||
|
exit_code = result.returncode
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
exit_code = 124
|
||||||
|
log_file.write("\n[SweepTimeout] run reached its allotted limit\n")
|
||||||
|
|
||||||
|
output = log_path.read_text(errors="replace")
|
||||||
|
volume = VOLUME_RE.search(output)
|
||||||
|
hashes = HASH_RE.search(output)
|
||||||
|
ready = READY_RE.search(output)
|
||||||
|
resources = RESOURCE_RE.search(output)
|
||||||
|
passed = exit_code == 0 and volume and hashes and ready and resources
|
||||||
|
row = {
|
||||||
|
"seed": seed, "recipe": recipe, "compiler": compiler, "workers": workers,
|
||||||
|
"tiles": "", "lod_min": "", "lod_max": "",
|
||||||
|
"min_x": "", "min_y": "", "min_z": "", "max_x": "", "max_y": "", "max_z": "",
|
||||||
|
"density_hash": "", "mesh_hash": "", "payload_hash": "", "topology_hash": "",
|
||||||
|
"whole_view_ready_s": "", "wall_s": "", "peak_rss_kib": "",
|
||||||
|
"exit_code": exit_code, "status": "PASS" if passed else "FAIL",
|
||||||
|
}
|
||||||
|
if passed:
|
||||||
|
row.update({
|
||||||
|
"tiles": hashes.group(1),
|
||||||
|
"lod_min": volume.group(2), "lod_max": volume.group(3),
|
||||||
|
"min_x": volume.group(4), "min_y": volume.group(5), "min_z": volume.group(6),
|
||||||
|
"max_x": volume.group(7), "max_y": volume.group(8), "max_z": volume.group(9),
|
||||||
|
"density_hash": "0x" + hashes.group(2), "mesh_hash": "0x" + hashes.group(3),
|
||||||
|
"payload_hash": "0x" + hashes.group(4), "topology_hash": "0x" + hashes.group(5),
|
||||||
|
"whole_view_ready_s": ready.group(1), "wall_s": resources.group(2),
|
||||||
|
"peak_rss_kib": resources.group(3),
|
||||||
|
})
|
||||||
|
writer.writerow(row)
|
||||||
|
csv_file.flush()
|
||||||
|
completed = sum(1 for _ in output_path.open()) - 1
|
||||||
|
elapsed = time.monotonic() - started
|
||||||
|
print(f"[{completed}/{total}] seed={seed} recipe={recipe} compiler={compiler} W{workers} "
|
||||||
|
f"tiles={row['tiles']} wall={row['wall_s']}s status={row['status']} "
|
||||||
|
f"elapsed={elapsed:.1f}s", flush=True)
|
||||||
|
if not passed:
|
||||||
|
print(f"Run failed; details: {log_path}", file=sys.stderr, flush=True)
|
||||||
|
return exit_code or 1
|
||||||
|
|
||||||
|
rows = list(csv.DictReader(output_path.open(newline="")))
|
||||||
|
keys = ("density_hash", "mesh_hash", "payload_hash", "topology_hash")
|
||||||
|
checks = []
|
||||||
|
for seed in seeds:
|
||||||
|
for recipe in CAMERAS:
|
||||||
|
for workers in (1, 12):
|
||||||
|
pair = [r for r in rows if int(r["seed"]) == seed and r["recipe"] == recipe
|
||||||
|
and int(r["workers"]) == workers]
|
||||||
|
equal = len(pair) == 2 and all(pair[0][key] == pair[1][key] for key in keys)
|
||||||
|
checks.append((seed, recipe, workers, equal))
|
||||||
|
worker_checks = []
|
||||||
|
for seed in seeds:
|
||||||
|
for recipe in CAMERAS:
|
||||||
|
for compiler in BINARIES:
|
||||||
|
pair = [r for r in rows if int(r["seed"]) == seed and r["recipe"] == recipe
|
||||||
|
and r["compiler"] == compiler]
|
||||||
|
equal = len(pair) == 2 and all(pair[0][key] == pair[1][key] for key in keys)
|
||||||
|
worker_checks.append((seed, recipe, compiler, equal))
|
||||||
|
summary_path = ROUND / "seed_sweep_summary.txt"
|
||||||
|
mismatch_count = sum(not equal for _, _, _, equal in checks)
|
||||||
|
worker_mismatch_count = sum(not equal for _, _, _, equal in worker_checks)
|
||||||
|
summary_path.write_text(
|
||||||
|
f"runs={len(rows)} seeds={len(seeds)} recipes={len(CAMERAS)} compilers={len(BINARIES)} "
|
||||||
|
f"workers=1,12 cross_compiler_comparisons={len(checks)} cross_compiler_mismatches={mismatch_count} "
|
||||||
|
f"cross_worker_comparisons={len(worker_checks)} cross_worker_mismatches={worker_mismatch_count} "
|
||||||
|
f"elapsed_s={time.monotonic()-started:.3f}\n"
|
||||||
|
)
|
||||||
|
print(summary_path.read_text(), end="", flush=True)
|
||||||
|
return 0 if mismatch_count == 0 and worker_mismatch_count == 0 else 3
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$Root = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..\..'))
|
||||||
|
$Viewer = Join-Path $Root 'Standalone\bin\VoxelForgeCoreStandalone.exe'
|
||||||
|
$Data = Join-Path $Root 'Standalone\data\owner_world.json'
|
||||||
|
$SeedFile = Join-Path $PSScriptRoot 'seeds.txt'
|
||||||
|
$LogDir = Join-Path $Root 'Saved\Linux'
|
||||||
|
[IO.Directory]::CreateDirectory($LogDir) | Out-Null
|
||||||
|
|
||||||
|
$Recipes = @(
|
||||||
|
@{ Name = 'surface-world'; Camera = '0,-35,-487.94,0,-22' },
|
||||||
|
@{ Name = 'floating-islands'; Camera = '0,0,-32,0,-22' }
|
||||||
|
)
|
||||||
|
$Seeds = @(Get-Content -LiteralPath $SeedFile | ForEach-Object { [int]$_.Trim() })
|
||||||
|
if ($Seeds.Count -ne 48) { throw "Expected 48 seeds in $SeedFile" }
|
||||||
|
if (-not (Test-Path -LiteralPath $Viewer -PathType Leaf)) { throw "Viewer not found: $Viewer" }
|
||||||
|
|
||||||
|
foreach ($Recipe in $Recipes) {
|
||||||
|
foreach ($Seed in $Seeds) {
|
||||||
|
foreach ($Workers in @(1, 12)) {
|
||||||
|
$Arguments = @(
|
||||||
|
$Data,
|
||||||
|
"--seed=$Seed",
|
||||||
|
"--recipe=$($Recipe.Name)",
|
||||||
|
'--render-distance-chunks=0',
|
||||||
|
"--workers=$Workers",
|
||||||
|
'--world-assembler-prototype',
|
||||||
|
'--stream-benchmark',
|
||||||
|
'--stream-pipeline',
|
||||||
|
'--stream-hash',
|
||||||
|
'--force-generate',
|
||||||
|
'--clip-radius=1',
|
||||||
|
'--max-clip-level=0',
|
||||||
|
"--camera=$($Recipe.Camera)",
|
||||||
|
'--far-horizon-lod8-step=0',
|
||||||
|
'--process-affinity=4095',
|
||||||
|
'--process-priority=Normal',
|
||||||
|
'--frame-limit=60'
|
||||||
|
)
|
||||||
|
$Stem = "windows2-seed-$Seed-$($Recipe.Name)-w$Workers"
|
||||||
|
$Log = Join-Path $LogDir "$Stem.log"
|
||||||
|
Write-Host "& `"$Viewer`" $($Arguments -join ' ')"
|
||||||
|
& $Viewer @Arguments *> $Log
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw "Viewer failed ($LASTEXITCODE); see $Log" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,385 @@
|
|||||||
|
seed,recipe,compiler,workers,tiles,lod_min,lod_max,min_x,min_y,min_z,max_x,max_y,max_z,density_hash,mesh_hash,payload_hash,topology_hash,whole_view_ready_s,wall_s,peak_rss_kib,exit_code,status
|
||||||
|
-1990830953,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.124,0.139871,82432,0,PASS
|
||||||
|
-1990830953,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.447,0.472868,277576,0,PASS
|
||||||
|
-1990830953,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.104,0.120573,83292,0,PASS
|
||||||
|
-1990830953,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.418,0.444282,277964,0,PASS
|
||||||
|
-1990830953,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xbd4dd4a500b8d62e,0xe1d28012b857510b,0x3ecc1269ee435844,0x10c100e1503e62f6,0.913,0.929393,83896,0,PASS
|
||||||
|
-1990830953,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xbd4dd4a500b8d62e,0xe1d28012b857510b,0x3ecc1269ee435844,0x10c100e1503e62f6,0.611,0.639175,286112,0,PASS
|
||||||
|
-1990830953,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xbd4dd4a500b8d62e,0xe1d28012b857510b,0x3ecc1269ee435844,0x10c100e1503e62f6,1.007,1.024022,84836,0,PASS
|
||||||
|
-1990830953,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xbd4dd4a500b8d62e,0xe1d28012b857510b,0x3ecc1269ee435844,0x10c100e1503e62f6,0.604,0.631134,287396,0,PASS
|
||||||
|
-1900684165,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.122,0.138823,87580,0,PASS
|
||||||
|
-1900684165,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.443,0.470531,282936,0,PASS
|
||||||
|
-1900684165,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.115,0.131311,88568,0,PASS
|
||||||
|
-1900684165,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.430,0.455647,283260,0,PASS
|
||||||
|
-1900684165,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x6579d1933b1981fa,0xfd19fc2d3a0c84b3,0xb8c9aa5ec03bea15,0x854620bb0b15a2da,1.468,1.485107,88252,0,PASS
|
||||||
|
-1900684165,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x6579d1933b1981fa,0xfd19fc2d3a0c84b3,0xb8c9aa5ec03bea15,0x854620bb0b15a2da,0.724,0.749926,291776,0,PASS
|
||||||
|
-1900684165,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x6579d1933b1981fa,0xfd19fc2d3a0c84b3,0xb8c9aa5ec03bea15,0x854620bb0b15a2da,1.654,1.671498,88740,0,PASS
|
||||||
|
-1900684165,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x6579d1933b1981fa,0xfd19fc2d3a0c84b3,0xb8c9aa5ec03bea15,0x854620bb0b15a2da,0.722,0.748795,292444,0,PASS
|
||||||
|
-1766412538,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.123,0.139772,82472,0,PASS
|
||||||
|
-1766412538,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.421,0.446302,277376,0,PASS
|
||||||
|
-1766412538,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.118,0.135907,82932,0,PASS
|
||||||
|
-1766412538,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.413,0.439059,278060,0,PASS
|
||||||
|
-1766412538,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x2a92f5e32e60e02f,0x8f64e72825b53b77,0xc8ef053d65d9a8f2,0xf908b7c927a221be,1.182,1.198659,83916,0,PASS
|
||||||
|
-1766412538,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x2a92f5e32e60e02f,0x8f64e72825b53b77,0xc8ef053d65d9a8f2,0xf908b7c927a221be,0.635,0.661517,288544,0,PASS
|
||||||
|
-1766412538,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x2a92f5e32e60e02f,0x8f64e72825b53b77,0xc8ef053d65d9a8f2,0xf908b7c927a221be,1.217,1.234070,84676,0,PASS
|
||||||
|
-1766412538,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x2a92f5e32e60e02f,0x8f64e72825b53b77,0xc8ef053d65d9a8f2,0xf908b7c927a221be,0.641,0.668605,289160,0,PASS
|
||||||
|
-1721984596,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.120,0.135727,82528,0,PASS
|
||||||
|
-1721984596,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.412,0.437074,277672,0,PASS
|
||||||
|
-1721984596,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.111,0.126643,83176,0,PASS
|
||||||
|
-1721984596,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.419,0.443825,278120,0,PASS
|
||||||
|
-1721984596,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x232835b6d49194bf,0x1caaf34cc5d6cd64,0x03053c530184f232,0xb660395e0dc7fd90,1.217,1.234173,84404,0,PASS
|
||||||
|
-1721984596,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x232835b6d49194bf,0x1caaf34cc5d6cd64,0x03053c530184f232,0xb660395e0dc7fd90,0.637,0.663034,287872,0,PASS
|
||||||
|
-1721984596,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x232835b6d49194bf,0x1caaf34cc5d6cd64,0x03053c530184f232,0xb660395e0dc7fd90,1.317,1.333028,84808,0,PASS
|
||||||
|
-1721984596,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x232835b6d49194bf,0x1caaf34cc5d6cd64,0x03053c530184f232,0xb660395e0dc7fd90,0.655,0.681308,287700,0,PASS
|
||||||
|
-1239598758,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x0bf609e90c8c98cd,0x73cd83a10b4aada9,0x4eba3fd151b267a4,0x559a118b768faf58,0.298,0.314757,83276,0,PASS
|
||||||
|
-1239598758,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x0bf609e90c8c98cd,0x73cd83a10b4aada9,0x4eba3fd151b267a4,0x559a118b768faf58,0.445,0.471042,288560,0,PASS
|
||||||
|
-1239598758,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x0bf609e90c8c98cd,0x73cd83a10b4aada9,0x4eba3fd151b267a4,0x559a118b768faf58,0.285,0.301659,84036,0,PASS
|
||||||
|
-1239598758,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x0bf609e90c8c98cd,0x73cd83a10b4aada9,0x4eba3fd151b267a4,0x559a118b768faf58,0.443,0.468361,288380,0,PASS
|
||||||
|
-1239598758,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x13ec8dd8009a6ca3,0xa834791c4bf4a3a6,0xf75429e19a3d3f57,0xec51f6ca14f0103f,1.387,1.403191,84688,0,PASS
|
||||||
|
-1239598758,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x13ec8dd8009a6ca3,0xa834791c4bf4a3a6,0xf75429e19a3d3f57,0xec51f6ca14f0103f,0.673,0.699757,289244,0,PASS
|
||||||
|
-1239598758,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x13ec8dd8009a6ca3,0xa834791c4bf4a3a6,0xf75429e19a3d3f57,0xec51f6ca14f0103f,1.443,1.458164,85260,0,PASS
|
||||||
|
-1239598758,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x13ec8dd8009a6ca3,0xa834791c4bf4a3a6,0xf75429e19a3d3f57,0xec51f6ca14f0103f,0.687,0.712986,289888,0,PASS
|
||||||
|
-1085993262,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x58d4e8746928d967,0x40dd37203989d7ba,0x912a7f27bda7e867,0x3aaea1143bebf060,0.146,0.161610,83596,0,PASS
|
||||||
|
-1085993262,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x58d4e8746928d967,0x40dd37203989d7ba,0x912a7f27bda7e867,0x3aaea1143bebf060,0.434,0.459626,280092,0,PASS
|
||||||
|
-1085993262,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x58d4e8746928d967,0x40dd37203989d7ba,0x912a7f27bda7e867,0x3aaea1143bebf060,0.137,0.155311,84108,0,PASS
|
||||||
|
-1085993262,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x58d4e8746928d967,0x40dd37203989d7ba,0x912a7f27bda7e867,0x3aaea1143bebf060,0.429,0.457999,280480,0,PASS
|
||||||
|
-1085993262,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x2f2773f2a0da46ab,0x3bc615085f3da506,0xf696b9a9fcf6e3e6,0x7726f0e025442908,1.270,1.286525,86016,0,PASS
|
||||||
|
-1085993262,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x2f2773f2a0da46ab,0x3bc615085f3da506,0xf696b9a9fcf6e3e6,0x7726f0e025442908,0.627,0.653909,289560,0,PASS
|
||||||
|
-1085993262,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x2f2773f2a0da46ab,0x3bc615085f3da506,0xf696b9a9fcf6e3e6,0x7726f0e025442908,1.410,1.427078,86780,0,PASS
|
||||||
|
-1085993262,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x2f2773f2a0da46ab,0x3bc615085f3da506,0xf696b9a9fcf6e3e6,0x7726f0e025442908,0.648,0.673667,290288,0,PASS
|
||||||
|
-1033703345,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x5e33a829837b74bd,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.153,0.171501,82920,0,PASS
|
||||||
|
-1033703345,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x5e33a829837b74bd,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.433,0.459168,278696,0,PASS
|
||||||
|
-1033703345,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x5e33a829837b74bd,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.146,0.161211,83612,0,PASS
|
||||||
|
-1033703345,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x5e33a829837b74bd,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.436,0.462555,279276,0,PASS
|
||||||
|
-1033703345,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x65b606ed9df8b9dd,0x874360dc2d5480ad,0xe1a7c4c63c916b8a,0xf8bfac0093f57137,2.179,2.196290,84960,0,PASS
|
||||||
|
-1033703345,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x65b606ed9df8b9dd,0x874360dc2d5480ad,0xe1a7c4c63c916b8a,0xf8bfac0093f57137,0.837,0.862488,286132,0,PASS
|
||||||
|
-1033703345,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x65b606ed9df8b9dd,0x874360dc2d5480ad,0xe1a7c4c63c916b8a,0xf8bfac0093f57137,2.229,2.245540,85384,0,PASS
|
||||||
|
-1033703345,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x65b606ed9df8b9dd,0x874360dc2d5480ad,0xe1a7c4c63c916b8a,0xf8bfac0093f57137,0.854,0.878634,286968,0,PASS
|
||||||
|
-854671705,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.168,0.184503,81968,0,PASS
|
||||||
|
-854671705,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.458,0.482105,276888,0,PASS
|
||||||
|
-854671705,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.156,0.172642,82296,0,PASS
|
||||||
|
-854671705,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.440,0.463845,277156,0,PASS
|
||||||
|
-854671705,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xb324a85fd9f31fa1,0x92f35776d53f0bbe,0x5b4e0dc015e5a4b1,0x3dcce3ff950e5940,1.997,2.014139,83980,0,PASS
|
||||||
|
-854671705,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xb324a85fd9f31fa1,0x92f35776d53f0bbe,0x5b4e0dc015e5a4b1,0x3dcce3ff950e5940,0.777,0.803614,286988,0,PASS
|
||||||
|
-854671705,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xb324a85fd9f31fa1,0x92f35776d53f0bbe,0x5b4e0dc015e5a4b1,0x3dcce3ff950e5940,1.975,1.991424,84460,0,PASS
|
||||||
|
-854671705,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xb324a85fd9f31fa1,0x92f35776d53f0bbe,0x5b4e0dc015e5a4b1,0x3dcce3ff950e5940,0.827,0.853700,287876,0,PASS
|
||||||
|
-713963806,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.116,0.133079,83972,0,PASS
|
||||||
|
-713963806,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.403,0.432000,278940,0,PASS
|
||||||
|
-713963806,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.103,0.119423,84248,0,PASS
|
||||||
|
-713963806,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.395,0.419569,279096,0,PASS
|
||||||
|
-713963806,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x38a60c8389c671eb,0xcbca321fa24f4d74,0x6aa8ea9d8c735dbb,0x8b9d8e479ea5329e,1.614,1.634105,84584,0,PASS
|
||||||
|
-713963806,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x38a60c8389c671eb,0xcbca321fa24f4d74,0x6aa8ea9d8c735dbb,0x8b9d8e479ea5329e,0.696,0.722153,287504,0,PASS
|
||||||
|
-713963806,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x38a60c8389c671eb,0xcbca321fa24f4d74,0x6aa8ea9d8c735dbb,0x8b9d8e479ea5329e,1.642,1.658169,84804,0,PASS
|
||||||
|
-713963806,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x38a60c8389c671eb,0xcbca321fa24f4d74,0x6aa8ea9d8c735dbb,0x8b9d8e479ea5329e,0.702,0.728362,287544,0,PASS
|
||||||
|
-621039221,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.108,0.123847,84240,0,PASS
|
||||||
|
-621039221,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.404,0.429052,279360,0,PASS
|
||||||
|
-621039221,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.097,0.114239,84872,0,PASS
|
||||||
|
-621039221,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.418,0.445942,279796,0,PASS
|
||||||
|
-621039221,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xa70bd050fb2e002e,0x93c9bfa37a0cd298,0x5fd74cd54a52292b,0x194b571023058cf7,1.740,1.756998,85916,0,PASS
|
||||||
|
-621039221,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xa70bd050fb2e002e,0x93c9bfa37a0cd298,0x5fd74cd54a52292b,0x194b571023058cf7,0.736,0.762822,290788,0,PASS
|
||||||
|
-621039221,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xa70bd050fb2e002e,0x93c9bfa37a0cd298,0x5fd74cd54a52292b,0x194b571023058cf7,1.779,1.795250,86420,0,PASS
|
||||||
|
-621039221,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xa70bd050fb2e002e,0x93c9bfa37a0cd298,0x5fd74cd54a52292b,0x194b571023058cf7,0.767,0.793669,291496,0,PASS
|
||||||
|
-474448608,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.112,0.126682,82408,0,PASS
|
||||||
|
-474448608,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.420,0.445710,277208,0,PASS
|
||||||
|
-474448608,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.114,0.131780,83016,0,PASS
|
||||||
|
-474448608,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.408,0.434334,277788,0,PASS
|
||||||
|
-474448608,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x80da251d7da20717,0x54a773cac2ae0da4,0xb42e970d98e5e448,0x08d56fddf5a487d6,1.639,1.655937,85268,0,PASS
|
||||||
|
-474448608,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x80da251d7da20717,0x54a773cac2ae0da4,0xb42e970d98e5e448,0x08d56fddf5a487d6,0.748,0.775722,289208,0,PASS
|
||||||
|
-474448608,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x80da251d7da20717,0x54a773cac2ae0da4,0xb42e970d98e5e448,0x08d56fddf5a487d6,1.756,1.771783,86096,0,PASS
|
||||||
|
-474448608,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x80da251d7da20717,0x54a773cac2ae0da4,0xb42e970d98e5e448,0x08d56fddf5a487d6,0.758,0.784193,289568,0,PASS
|
||||||
|
-432690581,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x1e3b98fa361c46b9,0x510dd77a7ca94d0e,0x4e6917a7b06f3f41,0x09791c912e85d14a,0.249,0.264467,83624,0,PASS
|
||||||
|
-432690581,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x1e3b98fa361c46b9,0x510dd77a7ca94d0e,0x4e6917a7b06f3f41,0x09791c912e85d14a,0.457,0.482472,286124,0,PASS
|
||||||
|
-432690581,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x1e3b98fa361c46b9,0x510dd77a7ca94d0e,0x4e6917a7b06f3f41,0x09791c912e85d14a,0.251,0.267531,83844,0,PASS
|
||||||
|
-432690581,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x1e3b98fa361c46b9,0x510dd77a7ca94d0e,0x4e6917a7b06f3f41,0x09791c912e85d14a,0.456,0.481234,286612,0,PASS
|
||||||
|
-432690581,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x85185a56cb2ff97a,0x656076e11a4da13b,0x708d7e58be02ab16,0xfa20cfd819664d48,1.465,1.481966,84272,0,PASS
|
||||||
|
-432690581,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x85185a56cb2ff97a,0x656076e11a4da13b,0x708d7e58be02ab16,0xfa20cfd819664d48,0.651,0.678094,286596,0,PASS
|
||||||
|
-432690581,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x85185a56cb2ff97a,0x656076e11a4da13b,0x708d7e58be02ab16,0xfa20cfd819664d48,1.518,1.534396,84508,0,PASS
|
||||||
|
-432690581,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x85185a56cb2ff97a,0x656076e11a4da13b,0x708d7e58be02ab16,0xfa20cfd819664d48,0.675,0.700961,287236,0,PASS
|
||||||
|
-380556572,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.122,0.138061,83744,0,PASS
|
||||||
|
-380556572,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.419,0.443950,278968,0,PASS
|
||||||
|
-380556572,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.119,0.136000,84296,0,PASS
|
||||||
|
-380556572,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.409,0.435025,279452,0,PASS
|
||||||
|
-380556572,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x18cb13a590f41d1f,0xdb9b7450859f053a,0x5dc9ac331ba35450,0x8cda9fbcede81e46,0.903,0.918921,85380,0,PASS
|
||||||
|
-380556572,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x18cb13a590f41d1f,0xdb9b7450859f053a,0x5dc9ac331ba35450,0x8cda9fbcede81e46,0.587,0.614393,289360,0,PASS
|
||||||
|
-380556572,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x18cb13a590f41d1f,0xdb9b7450859f053a,0x5dc9ac331ba35450,0x8cda9fbcede81e46,0.983,0.998686,85572,0,PASS
|
||||||
|
-380556572,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x18cb13a590f41d1f,0xdb9b7450859f053a,0x5dc9ac331ba35450,0x8cda9fbcede81e46,0.567,0.592607,290168,0,PASS
|
||||||
|
-238925630,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.106,0.121729,82080,0,PASS
|
||||||
|
-238925630,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.426,0.453650,277360,0,PASS
|
||||||
|
-238925630,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.106,0.120742,82848,0,PASS
|
||||||
|
-238925630,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.391,0.417157,277784,0,PASS
|
||||||
|
-238925630,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x3b99d22e2baa2ad7,0xf8a56dd82f8dbe0f,0x91fbb129908c4373,0x0d0d12d4bc8eca05,2.159,2.174883,84956,0,PASS
|
||||||
|
-238925630,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x3b99d22e2baa2ad7,0xf8a56dd82f8dbe0f,0x91fbb129908c4373,0x0d0d12d4bc8eca05,0.798,0.823378,286820,0,PASS
|
||||||
|
-238925630,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x3b99d22e2baa2ad7,0xf8a56dd82f8dbe0f,0x91fbb129908c4373,0x0d0d12d4bc8eca05,2.135,2.151003,86032,0,PASS
|
||||||
|
-238925630,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x3b99d22e2baa2ad7,0xf8a56dd82f8dbe0f,0x91fbb129908c4373,0x0d0d12d4bc8eca05,0.848,0.872951,287200,0,PASS
|
||||||
|
-216679974,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.113,0.128975,84840,0,PASS
|
||||||
|
-216679974,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.424,0.448196,279868,0,PASS
|
||||||
|
-216679974,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.110,0.125699,85388,0,PASS
|
||||||
|
-216679974,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.419,0.443897,280212,0,PASS
|
||||||
|
-216679974,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x329264ded82099ac,0x4fe355cb337a1fd9,0x0f1cf173f8b6da09,0x29c9025339a1891c,1.154,1.170155,87404,0,PASS
|
||||||
|
-216679974,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x329264ded82099ac,0x4fe355cb337a1fd9,0x0f1cf173f8b6da09,0x29c9025339a1891c,0.599,0.627832,291380,0,PASS
|
||||||
|
-216679974,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x329264ded82099ac,0x4fe355cb337a1fd9,0x0f1cf173f8b6da09,0x29c9025339a1891c,1.244,1.260024,88080,0,PASS
|
||||||
|
-216679974,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x329264ded82099ac,0x4fe355cb337a1fd9,0x0f1cf173f8b6da09,0x29c9025339a1891c,0.652,0.682174,292220,0,PASS
|
||||||
|
-133096164,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.120,0.137668,83564,0,PASS
|
||||||
|
-133096164,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.416,0.440317,278792,0,PASS
|
||||||
|
-133096164,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.112,0.129823,84168,0,PASS
|
||||||
|
-133096164,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.407,0.430509,278888,0,PASS
|
||||||
|
-133096164,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xd365848036423e24,0x8357d602689e662a,0x71d6cc040cfb374d,0xe50280db1b51428d,0.922,0.937785,84360,0,PASS
|
||||||
|
-133096164,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xd365848036423e24,0x8357d602689e662a,0x71d6cc040cfb374d,0xe50280db1b51428d,0.589,0.618394,288344,0,PASS
|
||||||
|
-133096164,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xd365848036423e24,0x8357d602689e662a,0x71d6cc040cfb374d,0xe50280db1b51428d,1.012,1.027635,84716,0,PASS
|
||||||
|
-133096164,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xd365848036423e24,0x8357d602689e662a,0x71d6cc040cfb374d,0xe50280db1b51428d,0.635,0.660045,288680,0,PASS
|
||||||
|
-112366806,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x117219c29ee67785,0x997b517646187e1a,0x85cb430517cbbf42,0x685ea038d9f06065,0.243,0.260958,84464,0,PASS
|
||||||
|
-112366806,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x117219c29ee67785,0x997b517646187e1a,0x85cb430517cbbf42,0x685ea038d9f06065,0.493,0.519148,283500,0,PASS
|
||||||
|
-112366806,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x117219c29ee67785,0x997b517646187e1a,0x85cb430517cbbf42,0x685ea038d9f06065,0.227,0.243726,84772,0,PASS
|
||||||
|
-112366806,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x117219c29ee67785,0x997b517646187e1a,0x85cb430517cbbf42,0x685ea038d9f06065,0.465,0.489473,284084,0,PASS
|
||||||
|
-112366806,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x9014ca6f9bc869cb,0x8b4f78faf1311e89,0x9556cf42e66d3d0a,0x74d6915603c033ad,1.309,1.326524,85228,0,PASS
|
||||||
|
-112366806,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x9014ca6f9bc869cb,0x8b4f78faf1311e89,0x9556cf42e66d3d0a,0x74d6915603c033ad,0.701,0.726986,287836,0,PASS
|
||||||
|
-112366806,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x9014ca6f9bc869cb,0x8b4f78faf1311e89,0x9556cf42e66d3d0a,0x74d6915603c033ad,1.395,1.411147,85016,0,PASS
|
||||||
|
-112366806,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x9014ca6f9bc869cb,0x8b4f78faf1311e89,0x9556cf42e66d3d0a,0x74d6915603c033ad,0.739,0.765027,288736,0,PASS
|
||||||
|
0,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.119,0.135072,84800,0,PASS
|
||||||
|
0,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.426,0.451782,279552,0,PASS
|
||||||
|
0,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.113,0.128723,84848,0,PASS
|
||||||
|
0,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.420,0.445716,280480,0,PASS
|
||||||
|
0,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xea74d3354b5ce671,0x476d49ae2a4ba2a6,0x16078fcd36b68ff0,0xcfb6c412b7118172,1.559,1.574177,85036,0,PASS
|
||||||
|
0,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xea74d3354b5ce671,0x476d49ae2a4ba2a6,0x16078fcd36b68ff0,0xcfb6c412b7118172,0.717,0.744287,287992,0,PASS
|
||||||
|
0,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xea74d3354b5ce671,0x476d49ae2a4ba2a6,0x16078fcd36b68ff0,0xcfb6c412b7118172,1.736,1.751668,85428,0,PASS
|
||||||
|
0,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xea74d3354b5ce671,0x476d49ae2a4ba2a6,0x16078fcd36b68ff0,0xcfb6c412b7118172,0.739,0.765220,288024,0,PASS
|
||||||
|
5808593,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.138,0.152855,82892,0,PASS
|
||||||
|
5808593,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.442,0.467475,277756,0,PASS
|
||||||
|
5808593,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.135,0.152123,83220,0,PASS
|
||||||
|
5808593,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.455,0.480133,278336,0,PASS
|
||||||
|
5808593,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xebd71c4fe9dd2dc6,0x9ffa12a70e6f7875,0x1a4ca0cc9847ee58,0xf19d80d6dd09e180,1.035,1.051725,84148,0,PASS
|
||||||
|
5808593,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xebd71c4fe9dd2dc6,0x9ffa12a70e6f7875,0x1a4ca0cc9847ee58,0xf19d80d6dd09e180,0.590,0.616756,287312,0,PASS
|
||||||
|
5808593,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xebd71c4fe9dd2dc6,0x9ffa12a70e6f7875,0x1a4ca0cc9847ee58,0xf19d80d6dd09e180,1.066,1.081777,85048,0,PASS
|
||||||
|
5808593,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xebd71c4fe9dd2dc6,0x9ffa12a70e6f7875,0x1a4ca0cc9847ee58,0xf19d80d6dd09e180,0.607,0.633661,287888,0,PASS
|
||||||
|
28573228,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.114,0.129946,83304,0,PASS
|
||||||
|
28573228,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.413,0.438628,278012,0,PASS
|
||||||
|
28573228,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.106,0.121266,83976,0,PASS
|
||||||
|
28573228,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.405,0.430367,278532,0,PASS
|
||||||
|
28573228,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x8bc79bd6b4d338f9,0xac4276d07d65ceb0,0x357351bb0d2f1cb8,0x900a254512dfc430,1.328,1.344479,84096,0,PASS
|
||||||
|
28573228,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x8bc79bd6b4d338f9,0xac4276d07d65ceb0,0x357351bb0d2f1cb8,0x900a254512dfc430,0.657,0.682189,287896,0,PASS
|
||||||
|
28573228,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x8bc79bd6b4d338f9,0xac4276d07d65ceb0,0x357351bb0d2f1cb8,0x900a254512dfc430,1.475,1.493744,84604,0,PASS
|
||||||
|
28573228,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x8bc79bd6b4d338f9,0xac4276d07d65ceb0,0x357351bb0d2f1cb8,0x900a254512dfc430,0.688,0.715502,288240,0,PASS
|
||||||
|
70955227,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.122,0.139162,83836,0,PASS
|
||||||
|
70955227,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.419,0.446187,279048,0,PASS
|
||||||
|
70955227,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.118,0.133338,84804,0,PASS
|
||||||
|
70955227,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.405,0.428654,279540,0,PASS
|
||||||
|
70955227,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xdaf7faa124800a90,0x0e2038b6f58233ec,0x9df861ebdd4ad5a0,0x50b94b2a529261d7,1.560,1.576865,86016,0,PASS
|
||||||
|
70955227,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xdaf7faa124800a90,0x0e2038b6f58233ec,0x9df861ebdd4ad5a0,0x50b94b2a529261d7,0.849,0.882918,288164,0,PASS
|
||||||
|
70955227,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xdaf7faa124800a90,0x0e2038b6f58233ec,0x9df861ebdd4ad5a0,0x50b94b2a529261d7,1.635,1.651152,86548,0,PASS
|
||||||
|
70955227,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xdaf7faa124800a90,0x0e2038b6f58233ec,0x9df861ebdd4ad5a0,0x50b94b2a529261d7,0.767,0.793113,288924,0,PASS
|
||||||
|
75274690,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.112,0.129015,83520,0,PASS
|
||||||
|
75274690,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.405,0.432266,278808,0,PASS
|
||||||
|
75274690,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.107,0.122969,84248,0,PASS
|
||||||
|
75274690,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.400,0.425046,279232,0,PASS
|
||||||
|
75274690,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xdf250106794ae38c,0x76706ba6a26f55ce,0x533b1070a58f2158,0x4f2ac497b8e00d2c,1.140,1.158530,86028,0,PASS
|
||||||
|
75274690,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xdf250106794ae38c,0x76706ba6a26f55ce,0x533b1070a58f2158,0x4f2ac497b8e00d2c,0.635,0.661364,290020,0,PASS
|
||||||
|
75274690,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xdf250106794ae38c,0x76706ba6a26f55ce,0x533b1070a58f2158,0x4f2ac497b8e00d2c,1.237,1.253451,86900,0,PASS
|
||||||
|
75274690,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xdf250106794ae38c,0x76706ba6a26f55ce,0x533b1070a58f2158,0x4f2ac497b8e00d2c,0.629,0.657284,290424,0,PASS
|
||||||
|
81375760,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x55d1e034d67632f5,0xf493f363535135e7,0xf1081c7533a6b533,0x24c1ef771b2e29df,0.302,0.321425,84348,0,PASS
|
||||||
|
81375760,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x55d1e034d67632f5,0xf493f363535135e7,0xf1081c7533a6b533,0x24c1ef771b2e29df,0.473,0.498702,288596,0,PASS
|
||||||
|
81375760,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x55d1e034d67632f5,0xf493f363535135e7,0xf1081c7533a6b533,0x24c1ef771b2e29df,0.284,0.300131,84776,0,PASS
|
||||||
|
81375760,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x55d1e034d67632f5,0xf493f363535135e7,0xf1081c7533a6b533,0x24c1ef771b2e29df,0.465,0.493912,289032,0,PASS
|
||||||
|
81375760,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x5e5bc1daf1855a5d,0x6d9a375c60771dd6,0x0e23381363a677c9,0xcd4cbbab580c6da6,1.644,1.660225,85756,0,PASS
|
||||||
|
81375760,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x5e5bc1daf1855a5d,0x6d9a375c60771dd6,0x0e23381363a677c9,0xcd4cbbab580c6da6,0.738,0.765107,289596,0,PASS
|
||||||
|
81375760,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x5e5bc1daf1855a5d,0x6d9a375c60771dd6,0x0e23381363a677c9,0xcd4cbbab580c6da6,1.724,1.741866,86704,0,PASS
|
||||||
|
81375760,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x5e5bc1daf1855a5d,0x6d9a375c60771dd6,0x0e23381363a677c9,0xcd4cbbab580c6da6,0.751,0.778126,289620,0,PASS
|
||||||
|
146979566,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x28dc20a8ab6fb2d0,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.146,0.162199,83420,0,PASS
|
||||||
|
146979566,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x28dc20a8ab6fb2d0,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.407,0.434165,281384,0,PASS
|
||||||
|
146979566,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x28dc20a8ab6fb2d0,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.154,0.171817,84220,0,PASS
|
||||||
|
146979566,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x28dc20a8ab6fb2d0,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.404,0.429003,282144,0,PASS
|
||||||
|
146979566,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xac33a725e13e3886,0x86611ee4c12947c9,0x2991daf2b7f1f2e4,0x91e98f0e880b1f3d,1.638,1.654237,86300,0,PASS
|
||||||
|
146979566,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xac33a725e13e3886,0x86611ee4c12947c9,0x2991daf2b7f1f2e4,0x91e98f0e880b1f3d,0.698,0.725703,289448,0,PASS
|
||||||
|
146979566,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xac33a725e13e3886,0x86611ee4c12947c9,0x2991daf2b7f1f2e4,0x91e98f0e880b1f3d,1.845,1.861845,86680,0,PASS
|
||||||
|
146979566,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xac33a725e13e3886,0x86611ee4c12947c9,0x2991daf2b7f1f2e4,0x91e98f0e880b1f3d,0.759,0.786078,290128,0,PASS
|
||||||
|
244951180,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x1cc26cbbf38ba8e9,0xeaace7e8b8443be0,0x61a9b62f2967c453,0xd0358bf6bbc94bb9,0.195,0.213011,86480,0,PASS
|
||||||
|
244951180,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x1cc26cbbf38ba8e9,0xeaace7e8b8443be0,0x61a9b62f2967c453,0xd0358bf6bbc94bb9,0.452,0.479860,284556,0,PASS
|
||||||
|
244951180,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x1cc26cbbf38ba8e9,0xeaace7e8b8443be0,0x61a9b62f2967c453,0xd0358bf6bbc94bb9,0.181,0.197358,87220,0,PASS
|
||||||
|
244951180,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x1cc26cbbf38ba8e9,0xeaace7e8b8443be0,0x61a9b62f2967c453,0xd0358bf6bbc94bb9,0.434,0.459596,284852,0,PASS
|
||||||
|
244951180,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x8bd265dfa2c428c4,0x47904e96f2a9213c,0xa9683a3e3251c768,0x585c686bcfe6be65,1.121,1.137204,86652,0,PASS
|
||||||
|
244951180,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x8bd265dfa2c428c4,0x47904e96f2a9213c,0xa9683a3e3251c768,0x585c686bcfe6be65,0.603,0.628602,289720,0,PASS
|
||||||
|
244951180,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x8bd265dfa2c428c4,0x47904e96f2a9213c,0xa9683a3e3251c768,0x585c686bcfe6be65,1.192,1.207485,87296,0,PASS
|
||||||
|
244951180,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x8bd265dfa2c428c4,0x47904e96f2a9213c,0xa9683a3e3251c768,0x585c686bcfe6be65,0.638,0.665330,290548,0,PASS
|
||||||
|
245433414,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.112,0.131222,82516,0,PASS
|
||||||
|
245433414,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.408,0.432991,277848,0,PASS
|
||||||
|
245433414,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.100,0.115984,83136,0,PASS
|
||||||
|
245433414,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.419,0.444156,277616,0,PASS
|
||||||
|
245433414,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x8740ccf600a029e2,0x04589dea4d5c0710,0x15ebf34a211b4233,0x1249a8b782a9ff85,1.203,1.220959,86352,0,PASS
|
||||||
|
245433414,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x8740ccf600a029e2,0x04589dea4d5c0710,0x15ebf34a211b4233,0x1249a8b782a9ff85,0.630,0.655544,290084,0,PASS
|
||||||
|
245433414,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x8740ccf600a029e2,0x04589dea4d5c0710,0x15ebf34a211b4233,0x1249a8b782a9ff85,1.279,1.296620,86904,0,PASS
|
||||||
|
245433414,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x8740ccf600a029e2,0x04589dea4d5c0710,0x15ebf34a211b4233,0x1249a8b782a9ff85,0.664,0.692096,290640,0,PASS
|
||||||
|
277442974,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.190,0.206505,84588,0,PASS
|
||||||
|
277442974,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.498,0.524538,279420,0,PASS
|
||||||
|
277442974,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.188,0.203434,85052,0,PASS
|
||||||
|
277442974,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.493,0.518404,279564,0,PASS
|
||||||
|
277442974,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x175a35be1d6f3efe,0xec304bc7b17ae96e,0x3559b943893fa981,0x491b549b23966102,1.322,1.338231,87924,0,PASS
|
||||||
|
277442974,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x175a35be1d6f3efe,0xec304bc7b17ae96e,0x3559b943893fa981,0x491b549b23966102,0.676,0.700980,292844,0,PASS
|
||||||
|
277442974,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x175a35be1d6f3efe,0xec304bc7b17ae96e,0x3559b943893fa981,0x491b549b23966102,1.366,1.382495,88588,0,PASS
|
||||||
|
277442974,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x175a35be1d6f3efe,0xec304bc7b17ae96e,0x3559b943893fa981,0x491b549b23966102,0.701,0.727447,293072,0,PASS
|
||||||
|
297746112,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xca1d94b876e4eeab,0xa25988b781b26dd4,0x054762688f50e323,0x71019e04b6b0de40,0.245,0.260033,85384,0,PASS
|
||||||
|
297746112,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xca1d94b876e4eeab,0xa25988b781b26dd4,0x054762688f50e323,0x71019e04b6b0de40,0.465,0.490415,288008,0,PASS
|
||||||
|
297746112,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xca1d94b876e4eeab,0xa25988b781b26dd4,0x054762688f50e323,0x71019e04b6b0de40,0.243,0.258435,86024,0,PASS
|
||||||
|
297746112,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xca1d94b876e4eeab,0xa25988b781b26dd4,0x054762688f50e323,0x71019e04b6b0de40,0.471,0.498359,288480,0,PASS
|
||||||
|
297746112,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x87cc040ef39b9130,0x0a2ea7d615d2f513,0x22cdcf9ca191de12,0xe2f6e225caca52f0,1.652,1.667443,86192,0,PASS
|
||||||
|
297746112,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x87cc040ef39b9130,0x0a2ea7d615d2f513,0x22cdcf9ca191de12,0xe2f6e225caca52f0,0.747,0.773312,289872,0,PASS
|
||||||
|
297746112,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x87cc040ef39b9130,0x0a2ea7d615d2f513,0x22cdcf9ca191de12,0xe2f6e225caca52f0,1.731,1.748813,86708,0,PASS
|
||||||
|
297746112,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x87cc040ef39b9130,0x0a2ea7d615d2f513,0x22cdcf9ca191de12,0xe2f6e225caca52f0,0.764,0.789221,290484,0,PASS
|
||||||
|
336768467,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.114,0.128946,82460,0,PASS
|
||||||
|
336768467,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.419,0.445300,277468,0,PASS
|
||||||
|
336768467,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.110,0.125258,83208,0,PASS
|
||||||
|
336768467,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.397,0.423317,278004,0,PASS
|
||||||
|
336768467,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x51c11d2bb0b34ea1,0x7b5968648098e169,0x6671281233fba737,0xf6d98fa4825abf1c,1.629,1.646272,85052,0,PASS
|
||||||
|
336768467,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x51c11d2bb0b34ea1,0x7b5968648098e169,0x6671281233fba737,0xf6d98fa4825abf1c,0.728,0.754451,288124,0,PASS
|
||||||
|
336768467,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x51c11d2bb0b34ea1,0x7b5968648098e169,0x6671281233fba737,0xf6d98fa4825abf1c,1.705,1.720538,85388,0,PASS
|
||||||
|
336768467,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x51c11d2bb0b34ea1,0x7b5968648098e169,0x6671281233fba737,0xf6d98fa4825abf1c,0.738,0.766954,288356,0,PASS
|
||||||
|
512532080,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.153,0.168716,82560,0,PASS
|
||||||
|
512532080,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.440,0.467645,277488,0,PASS
|
||||||
|
512532080,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.143,0.159069,82904,0,PASS
|
||||||
|
512532080,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.445,0.469304,277704,0,PASS
|
||||||
|
512532080,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x072b184717239693,0x9fac948bbd70a853,0xc00c647e52d9427e,0x4cc2ff6aed2ad23d,1.226,1.242263,84388,0,PASS
|
||||||
|
512532080,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x072b184717239693,0x9fac948bbd70a853,0xc00c647e52d9427e,0x4cc2ff6aed2ad23d,0.629,0.654951,288556,0,PASS
|
||||||
|
512532080,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x072b184717239693,0x9fac948bbd70a853,0xc00c647e52d9427e,0x4cc2ff6aed2ad23d,1.360,1.375755,85232,0,PASS
|
||||||
|
512532080,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x072b184717239693,0x9fac948bbd70a853,0xc00c647e52d9427e,0x4cc2ff6aed2ad23d,0.672,0.697654,289308,0,PASS
|
||||||
|
821120640,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.153,0.168054,82828,0,PASS
|
||||||
|
821120640,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.462,0.487309,277536,0,PASS
|
||||||
|
821120640,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.149,0.163984,82908,0,PASS
|
||||||
|
821120640,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.445,0.471081,277668,0,PASS
|
||||||
|
821120640,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x799f3dddb77b2373,0x2ff216b7c9c0a0f7,0xbd06c753c834d621,0xe6452e48c09c779c,1.491,1.507224,85000,0,PASS
|
||||||
|
821120640,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x799f3dddb77b2373,0x2ff216b7c9c0a0f7,0xbd06c753c834d621,0xe6452e48c09c779c,0.700,0.726549,289052,0,PASS
|
||||||
|
821120640,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x799f3dddb77b2373,0x2ff216b7c9c0a0f7,0xbd06c753c834d621,0xe6452e48c09c779c,1.661,1.677544,85416,0,PASS
|
||||||
|
821120640,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x799f3dddb77b2373,0x2ff216b7c9c0a0f7,0xbd06c753c834d621,0xe6452e48c09c779c,0.775,0.801706,289404,0,PASS
|
||||||
|
853538490,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe9c955bb88ef453e,0xf6ff06a22d87a886,0x8affd2ace9c02ca9,0xa87ab0dfc3a7abaf,0.351,0.367197,83708,0,PASS
|
||||||
|
853538490,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe9c955bb88ef453e,0xf6ff06a22d87a886,0x8affd2ace9c02ca9,0xa87ab0dfc3a7abaf,0.498,0.524390,287376,0,PASS
|
||||||
|
853538490,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe9c955bb88ef453e,0xf6ff06a22d87a886,0x8affd2ace9c02ca9,0xa87ab0dfc3a7abaf,0.309,0.325235,84408,0,PASS
|
||||||
|
853538490,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe9c955bb88ef453e,0xf6ff06a22d87a886,0x8affd2ace9c02ca9,0xa87ab0dfc3a7abaf,0.503,0.529485,287824,0,PASS
|
||||||
|
853538490,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xf325b1581a7f5166,0x375b7d2ab1227a19,0xa5b6bfe633662d7e,0xaceab7327811c4f7,1.594,1.609537,84548,0,PASS
|
||||||
|
853538490,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xf325b1581a7f5166,0x375b7d2ab1227a19,0xa5b6bfe633662d7e,0xaceab7327811c4f7,0.744,0.770634,287636,0,PASS
|
||||||
|
853538490,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xf325b1581a7f5166,0x375b7d2ab1227a19,0xa5b6bfe633662d7e,0xaceab7327811c4f7,1.565,1.581727,85352,0,PASS
|
||||||
|
853538490,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xf325b1581a7f5166,0x375b7d2ab1227a19,0xa5b6bfe633662d7e,0xaceab7327811c4f7,0.783,0.809731,287652,0,PASS
|
||||||
|
861026696,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.120,0.140722,84164,0,PASS
|
||||||
|
861026696,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.424,0.450365,279168,0,PASS
|
||||||
|
861026696,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.112,0.128137,84788,0,PASS
|
||||||
|
861026696,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.404,0.429204,279848,0,PASS
|
||||||
|
861026696,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xca1edaff577a4e1c,0xd032eac020ae2194,0x573cba10f70617e8,0xa8ef305116ad999c,1.511,1.528290,85840,0,PASS
|
||||||
|
861026696,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xca1edaff577a4e1c,0xd032eac020ae2194,0x573cba10f70617e8,0xa8ef305116ad999c,0.690,0.716270,288668,0,PASS
|
||||||
|
861026696,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xca1edaff577a4e1c,0xd032eac020ae2194,0x573cba10f70617e8,0xa8ef305116ad999c,1.581,1.598332,86244,0,PASS
|
||||||
|
861026696,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xca1edaff577a4e1c,0xd032eac020ae2194,0x573cba10f70617e8,0xa8ef305116ad999c,0.737,0.763910,288720,0,PASS
|
||||||
|
1026251636,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.125,0.140307,87376,0,PASS
|
||||||
|
1026251636,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.431,0.456676,282440,0,PASS
|
||||||
|
1026251636,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.120,0.136933,87768,0,PASS
|
||||||
|
1026251636,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.410,0.435138,282592,0,PASS
|
||||||
|
1026251636,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x389074d90273f26e,0xa38bcee9be5ec7eb,0x640d982fa1ac7f9c,0xe03c1c060ff49cca,2.194,2.209401,90204,0,PASS
|
||||||
|
1026251636,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x389074d90273f26e,0xa38bcee9be5ec7eb,0x640d982fa1ac7f9c,0xe03c1c060ff49cca,0.851,0.878001,292176,0,PASS
|
||||||
|
1026251636,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x389074d90273f26e,0xa38bcee9be5ec7eb,0x640d982fa1ac7f9c,0xe03c1c060ff49cca,2.274,2.290952,90476,0,PASS
|
||||||
|
1026251636,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x389074d90273f26e,0xa38bcee9be5ec7eb,0x640d982fa1ac7f9c,0xe03c1c060ff49cca,0.835,0.863009,292140,0,PASS
|
||||||
|
1077415394,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x87ee69cb17aba224,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.146,0.163297,86188,0,PASS
|
||||||
|
1077415394,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x87ee69cb17aba224,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.414,0.439121,283756,0,PASS
|
||||||
|
1077415394,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x87ee69cb17aba224,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.148,0.168584,86796,0,PASS
|
||||||
|
1077415394,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x87ee69cb17aba224,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.426,0.450855,284368,0,PASS
|
||||||
|
1077415394,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x9584311b92b45072,0xee776f01c536080b,0x6648ac4dfaf4abfd,0x18119783a47a0df1,1.601,1.617268,87912,0,PASS
|
||||||
|
1077415394,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x9584311b92b45072,0xee776f01c536080b,0x6648ac4dfaf4abfd,0x18119783a47a0df1,0.699,0.725603,292220,0,PASS
|
||||||
|
1077415394,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x9584311b92b45072,0xee776f01c536080b,0x6648ac4dfaf4abfd,0x18119783a47a0df1,1.727,1.745677,88476,0,PASS
|
||||||
|
1077415394,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x9584311b92b45072,0xee776f01c536080b,0x6648ac4dfaf4abfd,0x18119783a47a0df1,0.833,0.867727,292828,0,PASS
|
||||||
|
1130999017,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x38c8b5c86fc861ed,0x0871f41c7adbcbec,0x983b9c5b7bfc9c68,0x920b30bf2774555b,0.291,0.307690,85160,0,PASS
|
||||||
|
1130999017,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x38c8b5c86fc861ed,0x0871f41c7adbcbec,0x983b9c5b7bfc9c68,0x920b30bf2774555b,0.452,0.481022,289968,0,PASS
|
||||||
|
1130999017,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x38c8b5c86fc861ed,0x0871f41c7adbcbec,0x983b9c5b7bfc9c68,0x920b30bf2774555b,0.266,0.282332,85784,0,PASS
|
||||||
|
1130999017,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x38c8b5c86fc861ed,0x0871f41c7adbcbec,0x983b9c5b7bfc9c68,0x920b30bf2774555b,0.444,0.470657,290324,0,PASS
|
||||||
|
1130999017,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x519dd11ec1b6fd25,0x03655ab9c5d71117,0xbd12d3dae54569a6,0x80d8d87e27a7de44,1.472,1.489302,84108,0,PASS
|
||||||
|
1130999017,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x519dd11ec1b6fd25,0x03655ab9c5d71117,0xbd12d3dae54569a6,0x80d8d87e27a7de44,0.713,0.738699,287528,0,PASS
|
||||||
|
1130999017,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x519dd11ec1b6fd25,0x03655ab9c5d71117,0xbd12d3dae54569a6,0x80d8d87e27a7de44,1.530,1.545977,84776,0,PASS
|
||||||
|
1130999017,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x519dd11ec1b6fd25,0x03655ab9c5d71117,0xbd12d3dae54569a6,0x80d8d87e27a7de44,0.685,0.710911,288188,0,PASS
|
||||||
|
1156488597,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.121,0.139125,83040,0,PASS
|
||||||
|
1156488597,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.403,0.428569,278288,0,PASS
|
||||||
|
1156488597,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.109,0.125855,83948,0,PASS
|
||||||
|
1156488597,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.425,0.450644,278660,0,PASS
|
||||||
|
1156488597,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x640a6e138f3d100a,0x89a1c96de1216f8a,0xabb2594c0f2aa5e1,0xbdaec02426d2a060,1.216,1.232170,85424,0,PASS
|
||||||
|
1156488597,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x640a6e138f3d100a,0x89a1c96de1216f8a,0xabb2594c0f2aa5e1,0xbdaec02426d2a060,0.645,0.670839,287908,0,PASS
|
||||||
|
1156488597,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x640a6e138f3d100a,0x89a1c96de1216f8a,0xabb2594c0f2aa5e1,0xbdaec02426d2a060,1.312,1.328475,86080,0,PASS
|
||||||
|
1156488597,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x640a6e138f3d100a,0x89a1c96de1216f8a,0xabb2594c0f2aa5e1,0xbdaec02426d2a060,0.704,0.729815,288444,0,PASS
|
||||||
|
1172304228,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.109,0.123809,82616,0,PASS
|
||||||
|
1172304228,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.407,0.431733,277580,0,PASS
|
||||||
|
1172304228,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.101,0.115688,82980,0,PASS
|
||||||
|
1172304228,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.407,0.432724,277708,0,PASS
|
||||||
|
1172304228,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xfb46579ab737c12d,0x0a000a703c549cc1,0xfea6b41d2c3dda0e,0x9640bd6047c9a630,0.869,0.885113,85556,0,PASS
|
||||||
|
1172304228,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xfb46579ab737c12d,0x0a000a703c549cc1,0xfea6b41d2c3dda0e,0x9640bd6047c9a630,0.584,0.611186,288244,0,PASS
|
||||||
|
1172304228,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xfb46579ab737c12d,0x0a000a703c549cc1,0xfea6b41d2c3dda0e,0x9640bd6047c9a630,0.964,0.980259,85884,0,PASS
|
||||||
|
1172304228,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xfb46579ab737c12d,0x0a000a703c549cc1,0xfea6b41d2c3dda0e,0x9640bd6047c9a630,0.611,0.636011,289012,0,PASS
|
||||||
|
1370340570,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.106,0.121360,82860,0,PASS
|
||||||
|
1370340570,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.413,0.439779,277640,0,PASS
|
||||||
|
1370340570,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.105,0.120822,83596,0,PASS
|
||||||
|
1370340570,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.406,0.430247,278132,0,PASS
|
||||||
|
1370340570,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x34624cba09f42b66,0xd81a376b1e97ec8b,0xf965f89b36b5d843,0xf6abf6a7f4a15687,1.678,1.694262,85176,0,PASS
|
||||||
|
1370340570,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x34624cba09f42b66,0xd81a376b1e97ec8b,0xf965f89b36b5d843,0xf6abf6a7f4a15687,0.691,0.717560,287996,0,PASS
|
||||||
|
1370340570,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x34624cba09f42b66,0xd81a376b1e97ec8b,0xf965f89b36b5d843,0xf6abf6a7f4a15687,1.820,1.836129,85504,0,PASS
|
||||||
|
1370340570,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x34624cba09f42b66,0xd81a376b1e97ec8b,0xf965f89b36b5d843,0xf6abf6a7f4a15687,0.768,0.793448,288372,0,PASS
|
||||||
|
1383925073,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.112,0.129033,81792,0,PASS
|
||||||
|
1383925073,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.401,0.427476,277224,0,PASS
|
||||||
|
1383925073,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.105,0.120673,82892,0,PASS
|
||||||
|
1383925073,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.402,0.425822,277488,0,PASS
|
||||||
|
1383925073,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x32c8a3f9cd2d249e,0xe504e184d0529243,0x58408898b37b6d53,0x3154f68bf8585d9e,1.772,1.788831,84816,0,PASS
|
||||||
|
1383925073,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x32c8a3f9cd2d249e,0xe504e184d0529243,0x58408898b37b6d53,0x3154f68bf8585d9e,0.882,0.907588,287224,0,PASS
|
||||||
|
1383925073,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x32c8a3f9cd2d249e,0xe504e184d0529243,0x58408898b37b6d53,0x3154f68bf8585d9e,1.870,1.886415,84956,0,PASS
|
||||||
|
1383925073,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x32c8a3f9cd2d249e,0xe504e184d0529243,0x58408898b37b6d53,0x3154f68bf8585d9e,0.907,0.933394,287936,0,PASS
|
||||||
|
1401164998,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x539b7c44ed2d40c4,0x2daa8cf5e08fb16e,0xd87700809feafff4,0xc2e832153a03b5d7,0.287,0.303400,84652,0,PASS
|
||||||
|
1401164998,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x539b7c44ed2d40c4,0x2daa8cf5e08fb16e,0xd87700809feafff4,0xc2e832153a03b5d7,0.478,0.503793,287484,0,PASS
|
||||||
|
1401164998,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x539b7c44ed2d40c4,0x2daa8cf5e08fb16e,0xd87700809feafff4,0xc2e832153a03b5d7,0.275,0.290885,85324,0,PASS
|
||||||
|
1401164998,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x539b7c44ed2d40c4,0x2daa8cf5e08fb16e,0xd87700809feafff4,0xc2e832153a03b5d7,0.467,0.494139,288496,0,PASS
|
||||||
|
1401164998,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xec2a42ee2976845f,0xa295763ea8d9e67f,0xe9c0bff6914243ba,0x62b04de967523696,1.963,1.979104,84732,0,PASS
|
||||||
|
1401164998,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xec2a42ee2976845f,0xa295763ea8d9e67f,0xe9c0bff6914243ba,0x62b04de967523696,0.747,0.775087,287448,0,PASS
|
||||||
|
1401164998,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xec2a42ee2976845f,0xa295763ea8d9e67f,0xe9c0bff6914243ba,0x62b04de967523696,1.910,1.926095,85012,0,PASS
|
||||||
|
1401164998,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xec2a42ee2976845f,0xa295763ea8d9e67f,0xe9c0bff6914243ba,0x62b04de967523696,0.798,0.823400,288392,0,PASS
|
||||||
|
1558879574,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.115,0.132445,81992,0,PASS
|
||||||
|
1558879574,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.422,0.447714,276768,0,PASS
|
||||||
|
1558879574,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.103,0.119871,82376,0,PASS
|
||||||
|
1558879574,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.421,0.447570,277272,0,PASS
|
||||||
|
1558879574,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x6a6961f63402e799,0xcdeb03b89b00d39d,0x0b036e09b5273b49,0x971cac1901dff195,0.920,0.936756,83620,0,PASS
|
||||||
|
1558879574,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x6a6961f63402e799,0xcdeb03b89b00d39d,0x0b036e09b5273b49,0x971cac1901dff195,0.595,0.621724,287708,0,PASS
|
||||||
|
1558879574,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x6a6961f63402e799,0xcdeb03b89b00d39d,0x0b036e09b5273b49,0x971cac1901dff195,0.939,0.954884,84488,0,PASS
|
||||||
|
1558879574,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x6a6961f63402e799,0xcdeb03b89b00d39d,0x0b036e09b5273b49,0x971cac1901dff195,0.600,0.626689,288548,0,PASS
|
||||||
|
1753015542,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.106,0.121516,83192,0,PASS
|
||||||
|
1753015542,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.420,0.448397,278160,0,PASS
|
||||||
|
1753015542,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.110,0.129636,83988,0,PASS
|
||||||
|
1753015542,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.405,0.431222,278696,0,PASS
|
||||||
|
1753015542,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xb91a6e87bdb9610e,0xfdbb714aa24253d8,0xfea893be04158e3f,0x3365335c4b56e58c,1.661,1.678331,85292,0,PASS
|
||||||
|
1753015542,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xb91a6e87bdb9610e,0xfdbb714aa24253d8,0xfea893be04158e3f,0x3365335c4b56e58c,0.725,0.750781,288032,0,PASS
|
||||||
|
1753015542,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xb91a6e87bdb9610e,0xfdbb714aa24253d8,0xfea893be04158e3f,0x3365335c4b56e58c,1.786,1.802204,86188,0,PASS
|
||||||
|
1753015542,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xb91a6e87bdb9610e,0xfdbb714aa24253d8,0xfea893be04158e3f,0x3365335c4b56e58c,0.739,0.765903,288808,0,PASS
|
||||||
|
1827697875,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.106,0.122073,84540,0,PASS
|
||||||
|
1827697875,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.412,0.435966,279476,0,PASS
|
||||||
|
1827697875,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.105,0.121830,84676,0,PASS
|
||||||
|
1827697875,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.409,0.434709,279752,0,PASS
|
||||||
|
1827697875,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x699dd931ec3a2699,0x88331e1e5644593e,0xaa2288bc01794464,0xf92b0fbeb4ea279b,1.666,1.681850,89140,0,PASS
|
||||||
|
1827697875,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x699dd931ec3a2699,0x88331e1e5644593e,0xaa2288bc01794464,0xf92b0fbeb4ea279b,0.739,0.764550,292172,0,PASS
|
||||||
|
1827697875,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x699dd931ec3a2699,0x88331e1e5644593e,0xaa2288bc01794464,0xf92b0fbeb4ea279b,1.784,1.800585,89620,0,PASS
|
||||||
|
1827697875,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x699dd931ec3a2699,0x88331e1e5644593e,0xaa2288bc01794464,0xf92b0fbeb4ea279b,0.774,0.801097,293460,0,PASS
|
||||||
|
1909311298,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.126,0.140793,81792,0,PASS
|
||||||
|
1909311298,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.454,0.479793,277000,0,PASS
|
||||||
|
1909311298,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.119,0.138021,82780,0,PASS
|
||||||
|
1909311298,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.439,0.465770,277320,0,PASS
|
||||||
|
1909311298,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x15c0afb4c79cdd4e,0xc5f83ce7199a4708,0x1a923e880b787190,0xb9ca42e4a6e19d87,1.677,1.692282,84504,0,PASS
|
||||||
|
1909311298,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x15c0afb4c79cdd4e,0xc5f83ce7199a4708,0x1a923e880b787190,0xb9ca42e4a6e19d87,0.726,0.753056,287464,0,PASS
|
||||||
|
1909311298,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x15c0afb4c79cdd4e,0xc5f83ce7199a4708,0x1a923e880b787190,0xb9ca42e4a6e19d87,1.895,1.911071,84364,0,PASS
|
||||||
|
1909311298,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x15c0afb4c79cdd4e,0xc5f83ce7199a4708,0x1a923e880b787190,0xb9ca42e4a6e19d87,0.754,0.781499,287952,0,PASS
|
||||||
|
2011898099,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.113,0.129139,83892,0,PASS
|
||||||
|
2011898099,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.433,0.459151,278756,0,PASS
|
||||||
|
2011898099,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.103,0.117822,84760,0,PASS
|
||||||
|
2011898099,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.428,0.456161,279268,0,PASS
|
||||||
|
2011898099,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x4e5bc61fa6d60b4e,0x3c54a6c3cc817e24,0xa9a3c69c604071a5,0x53009044905f1269,1.148,1.163696,87080,0,PASS
|
||||||
|
2011898099,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x4e5bc61fa6d60b4e,0x3c54a6c3cc817e24,0xa9a3c69c604071a5,0x53009044905f1269,0.624,0.651689,289916,0,PASS
|
||||||
|
2011898099,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x4e5bc61fa6d60b4e,0x3c54a6c3cc817e24,0xa9a3c69c604071a5,0x53009044905f1269,1.234,1.252059,87640,0,PASS
|
||||||
|
2011898099,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x4e5bc61fa6d60b4e,0x3c54a6c3cc817e24,0xa9a3c69c604071a5,0x53009044905f1269,0.650,0.677250,290788,0,PASS
|
||||||
|
2015768509,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x5d69d4a0b6a3d1c3,0x300ab4e08dc23479,0xb1638622b8b616ad,0x082af297bc0e2595,0.319,0.335248,82712,0,PASS
|
||||||
|
2015768509,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x5d69d4a0b6a3d1c3,0x300ab4e08dc23479,0xb1638622b8b616ad,0x082af297bc0e2595,0.497,0.523192,286708,0,PASS
|
||||||
|
2015768509,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0x5d69d4a0b6a3d1c3,0x300ab4e08dc23479,0xb1638622b8b616ad,0x082af297bc0e2595,0.280,0.296244,83728,0,PASS
|
||||||
|
2015768509,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0x5d69d4a0b6a3d1c3,0x300ab4e08dc23479,0xb1638622b8b616ad,0x082af297bc0e2595,0.479,0.505113,287436,0,PASS
|
||||||
|
2015768509,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0xd9c1ee0b4c2e8ce8,0x7d2329c4b87bc6f1,0x8f9d279d8d590839,0x7ac25c667e165fa7,1.490,1.506239,84120,0,PASS
|
||||||
|
2015768509,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0xd9c1ee0b4c2e8ce8,0x7d2329c4b87bc6f1,0x8f9d279d8d590839,0x7ac25c667e165fa7,0.717,0.744393,288996,0,PASS
|
||||||
|
2015768509,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0xd9c1ee0b4c2e8ce8,0x7d2329c4b87bc6f1,0x8f9d279d8d590839,0x7ac25c667e165fa7,1.600,1.617351,84900,0,PASS
|
||||||
|
2015768509,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0xd9c1ee0b4c2e8ce8,0x7d2329c4b87bc6f1,0x8f9d279d8d590839,0x7ac25c667e165fa7,0.742,0.769135,289484,0,PASS
|
||||||
|
2070776516,surface-world,clang19,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.126,0.141678,81840,0,PASS
|
||||||
|
2070776516,surface-world,clang19,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.430,0.456364,276976,0,PASS
|
||||||
|
2070776516,surface-world,gcc14,1,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.114,0.131120,82540,0,PASS
|
||||||
|
2070776516,surface-world,gcc14,12,27,0,0,-32,-192,-1984,64,-96,-1888,0xe93491225d0202f9,0x6b2a630951428df2,0xfc2798d6a5478b25,0x0c08d7d980a84301,0.401,0.425293,277436,0,PASS
|
||||||
|
2070776516,floating-islands,clang19,1,27,0,0,-32,-32,-160,64,64,-64,0x2cc0f6dce797b31f,0x8760f9677ab58f62,0x03d2511d3ea2f55b,0x2f55edd35d7b78ef,0.998,1.014096,84548,0,PASS
|
||||||
|
2070776516,floating-islands,clang19,12,27,0,0,-32,-32,-160,64,64,-64,0x2cc0f6dce797b31f,0x8760f9677ab58f62,0x03d2511d3ea2f55b,0x2f55edd35d7b78ef,0.575,0.600529,286932,0,PASS
|
||||||
|
2070776516,floating-islands,gcc14,1,27,0,0,-32,-32,-160,64,64,-64,0x2cc0f6dce797b31f,0x8760f9677ab58f62,0x03d2511d3ea2f55b,0x2f55edd35d7b78ef,1.054,1.070063,84768,0,PASS
|
||||||
|
2070776516,floating-islands,gcc14,12,27,0,0,-32,-32,-160,64,64,-64,0x2cc0f6dce797b31f,0x8760f9677ab58f62,0x03d2511d3ea2f55b,0x2f55edd35d7b78ef,0.597,0.622079,287140,0,PASS
|
||||||
|
@@ -0,0 +1 @@
|
|||||||
|
runs=384 seeds=48 recipes=2 compilers=2 workers=1,12 cross_compiler_comparisons=192 cross_compiler_mismatches=0 cross_worker_comparisons=192 cross_worker_mismatches=0 elapsed_s=290.100
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
-1990830953
|
||||||
|
-1900684165
|
||||||
|
-1766412538
|
||||||
|
-1721984596
|
||||||
|
-1239598758
|
||||||
|
-1085993262
|
||||||
|
-1033703345
|
||||||
|
-854671705
|
||||||
|
-713963806
|
||||||
|
-621039221
|
||||||
|
-474448608
|
||||||
|
-432690581
|
||||||
|
-380556572
|
||||||
|
-238925630
|
||||||
|
-216679974
|
||||||
|
-133096164
|
||||||
|
-112366806
|
||||||
|
0
|
||||||
|
5808593
|
||||||
|
28573228
|
||||||
|
70955227
|
||||||
|
75274690
|
||||||
|
81375760
|
||||||
|
146979566
|
||||||
|
244951180
|
||||||
|
245433414
|
||||||
|
277442974
|
||||||
|
297746112
|
||||||
|
336768467
|
||||||
|
512532080
|
||||||
|
821120640
|
||||||
|
853538490
|
||||||
|
861026696
|
||||||
|
1026251636
|
||||||
|
1077415394
|
||||||
|
1130999017
|
||||||
|
1156488597
|
||||||
|
1172304228
|
||||||
|
1370340570
|
||||||
|
1383925073
|
||||||
|
1401164998
|
||||||
|
1558879574
|
||||||
|
1753015542
|
||||||
|
1827697875
|
||||||
|
1909311298
|
||||||
|
2011898099
|
||||||
|
2015768509
|
||||||
|
2070776516
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1990830953 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1990830953 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1900684165 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1900684165 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1766412538 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1766412538 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1721984596 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1721984596 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1239598758 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1239598758 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1085993262 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1085993262 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1033703345 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1033703345 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-854671705 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-854671705 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-713963806 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-713963806 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-621039221 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-621039221 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-474448608 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-474448608 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-432690581 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-432690581 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-380556572 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-380556572 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-238925630 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-238925630 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-216679974 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-216679974 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-133096164 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-133096164 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-112366806 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-112366806 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=0 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=0 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=5808593 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=5808593 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=28573228 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=28573228 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=70955227 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=70955227 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=75274690 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=75274690 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=81375760 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=81375760 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=146979566 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=146979566 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=244951180 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=244951180 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=245433414 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=245433414 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=277442974 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=277442974 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=297746112 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=297746112 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=336768467 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=336768467 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=512532080 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=512532080 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=821120640 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=821120640 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=853538490 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=853538490 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=861026696 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=861026696 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1026251636 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1026251636 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1077415394 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1077415394 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1130999017 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1130999017 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1156488597 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1156488597 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1172304228 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1172304228 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1370340570 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1370340570 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1383925073 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1383925073 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1401164998 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1401164998 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1558879574 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1558879574 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1753015542 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1753015542 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1827697875 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1827697875 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1909311298 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1909311298 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2011898099 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2011898099 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2015768509 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2015768509 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2070776516 --recipe=surface-world --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2070776516 --recipe=surface-world --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1990830953 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1990830953 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1900684165 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1900684165 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1766412538 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1766412538 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1721984596 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1721984596 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1239598758 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1239598758 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1085993262 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1085993262 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1033703345 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-1033703345 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-854671705 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-854671705 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-713963806 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-713963806 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-621039221 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-621039221 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-474448608 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-474448608 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-432690581 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-432690581 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-380556572 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-380556572 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-238925630 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-238925630 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-216679974 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-216679974 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-133096164 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-133096164 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-112366806 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=-112366806 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=0 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=0 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=5808593 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=5808593 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=28573228 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=28573228 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=70955227 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=70955227 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=75274690 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=75274690 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=81375760 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=81375760 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=146979566 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=146979566 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=244951180 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=244951180 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=245433414 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=245433414 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=277442974 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=277442974 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=297746112 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=297746112 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=336768467 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=336768467 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=512532080 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=512532080 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=821120640 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=821120640 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=853538490 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=853538490 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=861026696 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=861026696 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1026251636 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1026251636 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1077415394 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1077415394 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1130999017 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1130999017 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1156488597 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1156488597 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1172304228 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1172304228 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1370340570 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1370340570 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1383925073 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1383925073 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1401164998 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1401164998 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1558879574 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1558879574 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1753015542 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1753015542 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1827697875 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1827697875 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1909311298 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=1909311298 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2011898099 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2011898099 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2015768509 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2015768509 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2070776516 --recipe=floating-islands --render-distance-chunks=0 --workers=1 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
|
& ".\Standalone\bin\VoxelForgeCoreStandalone.exe" ".\Standalone\data\owner_world.json" --seed=2070776516 --recipe=floating-islands --render-distance-chunks=0 --workers=12 --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate --clip-radius=1 --max-clip-level=0 --camera=0,0,-32,0,-22 --far-horizon-lod8-step=0 --process-affinity=4095 --process-priority=Normal --frame-limit=60
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "VoxelForgeCore/VoxelForgeCore.h"
|
#include "VoxelForgeCore/VoxelForgeCore.h"
|
||||||
|
#include "StandaloneWorkerThread.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@@ -23,7 +24,7 @@ public:
|
|||||||
const std::size_t grain=std::max<std::size_t>(1,batchSize);
|
const std::size_t grain=std::max<std::size_t>(1,batchSize);
|
||||||
std::atomic<std::size_t> next{0};
|
std::atomic<std::size_t> next{0};
|
||||||
std::vector<double> active(workers,0.0);
|
std::vector<double> active(workers,0.0);
|
||||||
std::vector<std::thread> threads;
|
std::vector<FStandaloneWorkerThread> threads;
|
||||||
threads.reserve(workers);
|
threads.reserve(workers);
|
||||||
for(std::size_t worker=0;worker<workers;++worker)
|
for(std::size_t worker=0;worker<workers;++worker)
|
||||||
threads.emplace_back([&,worker]
|
threads.emplace_back([&,worker]
|
||||||
@@ -39,7 +40,7 @@ public:
|
|||||||
active[worker]=std::chrono::duration<double>(
|
active[worker]=std::chrono::duration<double>(
|
||||||
std::chrono::steady_clock::now()-started).count();
|
std::chrono::steady_clock::now()-started).count();
|
||||||
});
|
});
|
||||||
for(std::thread& thread:threads)thread.join();
|
for(FStandaloneWorkerThread& thread:threads)thread.join();
|
||||||
double total=0.0;
|
double total=0.0;
|
||||||
for(std::size_t worker=0;worker<workers;++worker)
|
for(std::size_t worker=0;worker<workers;++worker)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "StandaloneWorkerThread.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <fstream>
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace StandaloneTlsProbe
|
||||||
|
{
|
||||||
|
#if defined(__linux__)
|
||||||
|
struct FMemorySample
|
||||||
|
{
|
||||||
|
std::uint64_t virtualKiB=0;
|
||||||
|
std::uint64_t residentKiB=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline FMemorySample ReadMemory()
|
||||||
|
{
|
||||||
|
std::ifstream statm("/proc/self/statm");
|
||||||
|
std::uint64_t virtualPages=0,residentPages=0;
|
||||||
|
statm>>virtualPages>>residentPages;
|
||||||
|
const long pageSize=sysconf(_SC_PAGESIZE);
|
||||||
|
if(!statm||pageSize<=0)return {};
|
||||||
|
return {virtualPages*static_cast<std::uint64_t>(pageSize)/1024,
|
||||||
|
residentPages*static_cast<std::uint64_t>(pageSize)/1024};
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int Run(int workerCount)
|
||||||
|
{
|
||||||
|
workerCount=std::clamp(workerCount,0,12);
|
||||||
|
std::mutex mutex;
|
||||||
|
std::condition_variable changed;
|
||||||
|
bool release=false;
|
||||||
|
std::atomic<int> ready{0};
|
||||||
|
std::vector<FStandaloneWorkerThread> workers;
|
||||||
|
workers.reserve(static_cast<std::size_t>(workerCount));
|
||||||
|
FMemorySample previous=ReadMemory();
|
||||||
|
std::printf("[TlsProbe] workers=0 create_ms=0.000 rss_kib=%llu rss_delta_kib=0 vms_kib=%llu stack_bytes=%zu\n",
|
||||||
|
static_cast<unsigned long long>(previous.residentKiB),
|
||||||
|
static_cast<unsigned long long>(previous.virtualKiB),
|
||||||
|
FStandaloneWorkerThread::StackSizeBytes);
|
||||||
|
for(int index=1;index<=workerCount;++index)
|
||||||
|
{
|
||||||
|
const auto start=std::chrono::steady_clock::now();
|
||||||
|
workers.emplace_back([&]
|
||||||
|
{
|
||||||
|
ready.fetch_add(1,std::memory_order_release);
|
||||||
|
changed.notify_all();
|
||||||
|
std::unique_lock lock(mutex);
|
||||||
|
changed.wait(lock,[&]{return release;});
|
||||||
|
});
|
||||||
|
{
|
||||||
|
std::unique_lock lock(mutex);
|
||||||
|
changed.wait(lock,[&]{return ready.load(std::memory_order_acquire)>=index;});
|
||||||
|
}
|
||||||
|
const double createMs=std::chrono::duration<double,std::milli>(
|
||||||
|
std::chrono::steady_clock::now()-start).count();
|
||||||
|
const FMemorySample current=ReadMemory();
|
||||||
|
const std::int64_t rssDelta=static_cast<std::int64_t>(current.residentKiB)
|
||||||
|
-static_cast<std::int64_t>(previous.residentKiB);
|
||||||
|
std::printf("[TlsProbe] workers=%d create_ms=%.3f rss_kib=%llu rss_delta_kib=%lld vms_kib=%llu\n",
|
||||||
|
index,createMs,static_cast<unsigned long long>(current.residentKiB),
|
||||||
|
static_cast<long long>(rssDelta),static_cast<unsigned long long>(current.virtualKiB));
|
||||||
|
previous=current;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
|
release=true;
|
||||||
|
}
|
||||||
|
changed.notify_all();
|
||||||
|
for(FStandaloneWorkerThread& worker:workers)worker.join();
|
||||||
|
std::printf("[TlsProbe] status=PASS threads_joined=%d\n",workerCount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
inline int Run(int)
|
||||||
|
{
|
||||||
|
std::fprintf(stderr,"TLS probe is Linux-only.\n");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "OwnerWorldLoader.h"
|
#include "OwnerWorldLoader.h"
|
||||||
#include "StreamingWorld.h"
|
#include "StreamingWorld.h"
|
||||||
|
#include "StreamBenchmarkPipeline.h"
|
||||||
|
#include "WorldAssemblyPrototype.h"
|
||||||
#include "StandaloneCoreScheduler.h"
|
#include "StandaloneCoreScheduler.h"
|
||||||
#include "../Core/src/StandaloneSnapshotAdapter.h"
|
#include "../Core/src/StandaloneSnapshotAdapter.h"
|
||||||
#include "../Research/OwnerShapeWorld/gpu_field_port/GpuFarViewer.h"
|
#include "../Research/OwnerShapeWorld/gpu_field_port/GpuFarViewer.h"
|
||||||
@@ -52,6 +54,9 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
using StandaloneStreamBenchmark::FHashedTile;
|
||||||
|
using StandaloneStreamBenchmark::HashTileRows;
|
||||||
|
|
||||||
struct V3 { float X=0.0f,Y=0.0f,Z=0.0f; };
|
struct V3 { float X=0.0f,Y=0.0f,Z=0.0f; };
|
||||||
V3 Add(V3 A,V3 B){return {A.X+B.X,A.Y+B.Y,A.Z+B.Z};}
|
V3 Add(V3 A,V3 B){return {A.X+B.X,A.Y+B.Y,A.Z+B.Z};}
|
||||||
V3 Sub(V3 A,V3 B){return {A.X-B.X,A.Y-B.Y,A.Z-B.Z};}
|
V3 Sub(V3 A,V3 B){return {A.X-B.X,A.Y-B.Y,A.Z-B.Z};}
|
||||||
@@ -6932,354 +6937,6 @@ float3 Lit=Rock*(Ambient+0.88*Diffuse)+float3(0.50,0.69,0.82)*Head*0.75;
|
|||||||
return TotalSamples>0&&LegacyToDetailed.Unmatched+DetailedToLegacy.Unmatched==0?0:10;
|
return TotalSamples>0&&LegacyToDetailed.Unmatched+DetailedToLegacy.Unmatched==0?0:10;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HashWord(uint64& Hash,uint64 Word,int32 Bytes=8)
|
|
||||||
{
|
|
||||||
for(int32 I=0;I<Bytes;++I)
|
|
||||||
{
|
|
||||||
Hash^=static_cast<uint8>(Word>>(I*8));
|
|
||||||
Hash*=1099511628211ull;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FHashedTile
|
|
||||||
{
|
|
||||||
FVoxelTileKey Key;
|
|
||||||
uint64 Hash=14695981039346656037ull;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool TileKeyLessForHash(const FVoxelTileKey& A,const FVoxelTileKey& B)
|
|
||||||
{
|
|
||||||
if(A.Level!=B.Level)return A.Level<B.Level;
|
|
||||||
if(A.Coord.Z!=B.Coord.Z)return A.Coord.Z<B.Coord.Z;
|
|
||||||
if(A.Coord.Y!=B.Coord.Y)return A.Coord.Y<B.Coord.Y;
|
|
||||||
return A.Coord.X<B.Coord.X;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 HashTileRows(std::vector<FHashedTile>& Rows)
|
|
||||||
{
|
|
||||||
std::sort(Rows.begin(),Rows.end(),[](const FHashedTile& A,const FHashedTile& B)
|
|
||||||
{return TileKeyLessForHash(A.Key,B.Key);});
|
|
||||||
uint64 Hash=14695981039346656037ull;
|
|
||||||
for(const FHashedTile& Row:Rows)
|
|
||||||
{
|
|
||||||
HashWord(Hash,static_cast<uint32>(Row.Key.Level),4);
|
|
||||||
HashWord(Hash,static_cast<uint32>(Row.Key.Coord.X),4);
|
|
||||||
HashWord(Hash,static_cast<uint32>(Row.Key.Coord.Y),4);
|
|
||||||
HashWord(Hash,static_cast<uint32>(Row.Key.Coord.Z),4);
|
|
||||||
HashWord(Hash,Row.Hash);
|
|
||||||
}
|
|
||||||
return Hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
int RunPipelinedStreamingBenchmark(std::shared_ptr<FStandaloneOwnerWorld> OwnerWorld,
|
|
||||||
const VoxelForgeCore::ResolvedWorldSnapshot& CoreSnapshot,
|
|
||||||
const FVector& CameraPositionVoxels,int32 WorkerCount,int32 MaxLevel,
|
|
||||||
VoxelForgeCore::DetailVariant DetailVariant,const VoxelForgeCore::JobScheduler& Scheduler,
|
|
||||||
bool bHashDensity,bool bSkipUvAndColors,bool bSkipMaterialGroups,bool bSkipUV,bool bSkipColors,
|
|
||||||
std::chrono::steady_clock::time_point ColdStart,bool bProfileColumnOverlap,
|
|
||||||
int32 FarHorizonLOD8InteriorStepVoxels)
|
|
||||||
{
|
|
||||||
using Clock=std::chrono::steady_clock;
|
|
||||||
FStandaloneOwnerWorld& World=*OwnerWorld;
|
|
||||||
const bool bRoundTunnels=World.Generator->bStandaloneResearchRoundTunnels;
|
|
||||||
const bool bEnhancedTunnelWalls=World.Generator->bStandaloneResearchEnhancedWalls;
|
|
||||||
VoxelForgeCore::World Shape(CoreSnapshot);
|
|
||||||
FStandaloneDesiredTileSet Desired=StandaloneWorldMesher::BuildDesiredSet(World,CameraPositionVoxels);
|
|
||||||
const auto CoreTiles=Shape.desiredTiles(
|
|
||||||
{CameraPositionVoxels.X,CameraPositionVoxels.Y,CameraPositionVoxels.Z});
|
|
||||||
Desired.Tiles.clear();Desired.Tiles.reserve(CoreTiles.size());
|
|
||||||
for(const auto& Key:CoreTiles)
|
|
||||||
Desired.Tiles.emplace_back(FIntVector(Key.coordinate.x,Key.coordinate.y,Key.coordinate.z),Key.lod);
|
|
||||||
if(MaxLevel>=0)
|
|
||||||
Desired.Tiles.erase(std::remove_if(Desired.Tiles.begin(),Desired.Tiles.end(),
|
|
||||||
[&](const FVoxelTileKey& Tile){return Tile.Level>MaxLevel;}),Desired.Tiles.end());
|
|
||||||
FIntVector FineMin(INT32_MAX,INT32_MAX,INT32_MAX),FineMax(INT32_MIN,INT32_MIN,INT32_MIN);
|
|
||||||
FIntVector ClipMin(INT32_MAX,INT32_MAX,INT32_MAX),ClipMax(INT32_MIN,INT32_MIN,INT32_MIN);
|
|
||||||
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
|
||||||
{
|
|
||||||
const FIntVector Origin=Tile.OriginVoxels();const int32 Extent=Tile.ExtentVoxels();
|
|
||||||
ClipMin.X=std::min(ClipMin.X,Origin.X);ClipMin.Y=std::min(ClipMin.Y,Origin.Y);ClipMin.Z=std::min(ClipMin.Z,Origin.Z);
|
|
||||||
ClipMax.X=std::max(ClipMax.X,Origin.X+Extent);ClipMax.Y=std::max(ClipMax.Y,Origin.Y+Extent);ClipMax.Z=std::max(ClipMax.Z,Origin.Z+Extent);
|
|
||||||
if(Tile.Level<World.FullResClipLevels)
|
|
||||||
{
|
|
||||||
FineMin.X=std::min(FineMin.X,Origin.X);FineMin.Y=std::min(FineMin.Y,Origin.Y);FineMin.Z=std::min(FineMin.Z,Origin.Z);
|
|
||||||
FineMax.X=std::max(FineMax.X,Origin.X+Extent);FineMax.Y=std::max(FineMax.Y,Origin.Y+Extent);FineMax.Z=std::max(FineMax.Z,Origin.Z+Extent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(FineMin.X==INT32_MAX||ClipMin.X==INT32_MAX)
|
|
||||||
{std::fprintf(stderr,"[StreamPipeline] no desired detail or clipmap tiles.\n");return 7;}
|
|
||||||
|
|
||||||
const FIntVector CenterChunk=Desired.CenterChunk;
|
|
||||||
std::unordered_set<FVoxelTileKey,FStandaloneTileKeyHash> Neighborhood;
|
|
||||||
Neighborhood.reserve(32);
|
|
||||||
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
|
||||||
if(Tile.Level==0&&std::abs(Tile.Coord.X-CenterChunk.X)<=1
|
|
||||||
&&std::abs(Tile.Coord.Y-CenterChunk.Y)<=1&&std::abs(Tile.Coord.Z-CenterChunk.Z)<=1)
|
|
||||||
Neighborhood.insert(Tile);
|
|
||||||
if(Neighborhood.size()!=27)
|
|
||||||
{std::fprintf(stderr,"[StreamPipeline] expected 27 player-neighborhood tiles, found %zu.\n",Neighborhood.size());return 7;}
|
|
||||||
|
|
||||||
// The initial desired set now owns all clipmap metadata needed by this Core-only run.
|
|
||||||
// Release the separate compatibility-world generation graph before compiling Core.
|
|
||||||
World.Generator.reset();
|
|
||||||
World.Manager.reset();
|
|
||||||
World.DefinitionStorage.clear();
|
|
||||||
World.BiomeStorage.clear();
|
|
||||||
World.OperationStorage.clear();
|
|
||||||
World.DensitySamples.clear();
|
|
||||||
|
|
||||||
std::string BuildError;
|
|
||||||
const bool bIncludeFarWorld=MaxLevel<0||MaxLevel>=World.FullResClipLevels;
|
|
||||||
const auto ShapeBuildStart=Clock::now();
|
|
||||||
VoxelForgeCore::ShapeBuildRequest ShapeRequest;
|
|
||||||
ShapeRequest.minVoxel={FineMin.X,FineMin.Y,FineMin.Z};
|
|
||||||
ShapeRequest.maxVoxel={FineMax.X,FineMax.Y,FineMax.Z};
|
|
||||||
ShapeRequest.clipMinVoxel={ClipMin.X,ClipMin.Y,ClipMin.Z};
|
|
||||||
ShapeRequest.clipMaxVoxel={ClipMax.X,ClipMax.Y,ClipMax.Z};
|
|
||||||
ShapeRequest.workerLimit=static_cast<uint32>(std::clamp(WorkerCount,1,16));
|
|
||||||
ShapeRequest.detail=DetailVariant;ShapeRequest.includeFarWorld=bIncludeFarWorld;
|
|
||||||
ShapeRequest.roundTunnels=bRoundTunnels;
|
|
||||||
ShapeRequest.enhancedTunnelWalls=bEnhancedTunnelWalls;
|
|
||||||
if(!Shape.compile(ShapeRequest,Scheduler,BuildError))
|
|
||||||
{std::fprintf(stderr,"[StreamPipeline] full shape build failed: %s\n",BuildError.c_str());return 2;}
|
|
||||||
const auto ShapeReady=Clock::now();
|
|
||||||
const double ShapeSeconds=std::chrono::duration<double>(ShapeReady-ShapeBuildStart).count();
|
|
||||||
FStandaloneStreamingGenerator Streamer(World,WorkerCount,bHashDensity,nullptr,MaxLevel,
|
|
||||||
bSkipUvAndColors,bSkipMaterialGroups,bSkipUV,bSkipColors,&Shape,bProfileColumnOverlap,
|
|
||||||
FarHorizonLOD8InteriorStepVoxels);
|
|
||||||
const auto StreamStart=Clock::now();
|
|
||||||
const FStandaloneStreamingUpdate Update=Streamer.StartWithDesired(Desired);
|
|
||||||
if(Update.DesiredTiles!=static_cast<int32>(Desired.Tiles.size()))
|
|
||||||
{
|
|
||||||
Streamer.Stop();
|
|
||||||
std::fprintf(stderr,"[StreamPipeline] expected %zu tiles but queued %d.\n",
|
|
||||||
Desired.Tiles.size(),Update.DesiredTiles);return 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<FHashedTile> DensityRows,MeshRows,PayloadRows,TopologyRows;
|
|
||||||
int32 Finished=0,NeighborhoodFinished=0,FullDetailFinished=0;
|
|
||||||
int32 FullDetailExpected=0;
|
|
||||||
struct FColumnXY
|
|
||||||
{
|
|
||||||
std::int64_t X=0,Y=0;
|
|
||||||
bool operator==(const FColumnXY&)const=default;
|
|
||||||
};
|
|
||||||
struct FColumnXYHash
|
|
||||||
{
|
|
||||||
std::size_t operator()(const FColumnXY& Value)const noexcept
|
|
||||||
{
|
|
||||||
const std::size_t X=std::hash<std::int64_t>{}(Value.X);
|
|
||||||
const std::size_t Y=std::hash<std::int64_t>{}(Value.Y);
|
|
||||||
return X^(Y+static_cast<std::size_t>(0x9E3779B9u)+(X<<6)+(X>>2));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
struct FFirstColumnUse
|
|
||||||
{
|
|
||||||
FVoxelTileKey Tile;
|
|
||||||
std::uint64_t WorkerHash=0;
|
|
||||||
};
|
|
||||||
std::array<std::unordered_map<FColumnXY,std::vector<FFirstColumnUse>,FColumnXYHash>,9> ColumnUsesByLOD;
|
|
||||||
std::array<std::uint64_t,9> ColumnDuplicateEventsByLOD{},NeighbourDuplicateEventsByLOD{};
|
|
||||||
std::array<std::uint64_t,9> CrossWorkerNeighbourDuplicateEventsByLOD{};
|
|
||||||
std::array<std::uint64_t,9> ColumnCaptureTilesByLOD{},ExpectedTilesByLOD{};
|
|
||||||
std::array<bool,9> ColumnCaptureCompleteByLOD{};
|
|
||||||
ColumnCaptureCompleteByLOD.fill(true);
|
|
||||||
std::array<double,9> WorkerSecondsByLOD{};
|
|
||||||
std::array<double,9> ColumnEvalMsByLOD{},MarchingExclusiveMsByLOD{};
|
|
||||||
std::array<double,9> GroundRefineExclusiveMsByLOD{},CapRefineExclusiveMsByLOD{};
|
|
||||||
std::array<double,9> MeshAssemblyMsByLOD{};
|
|
||||||
std::array<std::uint64_t,9> TileCountByLOD{};
|
|
||||||
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
|
||||||
if(Tile.Level>=0&&Tile.Level<static_cast<int32>(ExpectedTilesByLOD.size()))
|
|
||||||
++ExpectedTilesByLOD[static_cast<std::size_t>(Tile.Level)];
|
|
||||||
const auto AreSameLODNeighbours=[](const FVoxelTileKey& A,const FVoxelTileKey& B)
|
|
||||||
{
|
|
||||||
if(A.Level!=B.Level)return false;
|
|
||||||
const std::int64_t DX=std::abs(static_cast<std::int64_t>(A.Coord.X)-B.Coord.X);
|
|
||||||
const std::int64_t DY=std::abs(static_cast<std::int64_t>(A.Coord.Y)-B.Coord.Y);
|
|
||||||
const std::int64_t DZ=std::abs(static_cast<std::int64_t>(A.Coord.Z)-B.Coord.Z);
|
|
||||||
return std::max({DX,DY,DZ})<=1&&(DX+DY+DZ)>0;
|
|
||||||
};
|
|
||||||
uint64 NativeSolidBoxes=0,NativeAirBoxes=0,NativeMixedBoxes=0,NativeUnknownBoxes=0;
|
|
||||||
uint64 NativeFieldCalls=0,NativeColumnHits=0,NativeColumnMisses=0,NativeMeshingSkips=0;
|
|
||||||
double NativeClassificationMilliseconds=0.0,NativeColumnComputeMilliseconds=0.0;
|
|
||||||
double NativeMeshingMilliseconds=0.0;
|
|
||||||
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
|
||||||
if(Tile.Level<World.FullResClipLevels)++FullDetailExpected;
|
|
||||||
Clock::time_point NeighborhoodReady{},FullDetailReady{},WholeViewReady{};
|
|
||||||
bool bNeighborhoodReported=false,bFullDetailReported=false;
|
|
||||||
while(Finished<Update.DesiredTiles)
|
|
||||||
{
|
|
||||||
std::vector<FStandaloneCpuTile> Ready=Streamer.TakeReady();
|
|
||||||
if(Ready.empty()){std::this_thread::sleep_for(std::chrono::milliseconds(1));continue;}
|
|
||||||
for(const FStandaloneCpuTile& Tile:Ready)
|
|
||||||
{
|
|
||||||
++Finished;
|
|
||||||
if(Tile.Key.Level>=0&&Tile.Key.Level<static_cast<int32>(TileCountByLOD.size()))
|
|
||||||
{
|
|
||||||
const std::size_t LOD=static_cast<std::size_t>(Tile.Key.Level);
|
|
||||||
++TileCountByLOD[LOD];
|
|
||||||
WorkerSecondsByLOD[LOD]+=Tile.WorkerSeconds;
|
|
||||||
ColumnEvalMsByLOD[LOD]+=Tile.CoreDiagnostics.columnEvaluationExclusiveMilliseconds;
|
|
||||||
MarchingExclusiveMsByLOD[LOD]+=Tile.CoreDiagnostics.marchingCubesExclusiveMilliseconds;
|
|
||||||
GroundRefineExclusiveMsByLOD[LOD]+=Tile.CoreDiagnostics.groundRefinementExclusiveMilliseconds;
|
|
||||||
CapRefineExclusiveMsByLOD[LOD]+=Tile.CoreDiagnostics.capRefinementExclusiveMilliseconds;
|
|
||||||
MeshAssemblyMsByLOD[LOD]+=Tile.CoreDiagnostics.meshAssemblyMilliseconds;
|
|
||||||
}
|
|
||||||
if(bProfileColumnOverlap&&Tile.Key.Level>=0
|
|
||||||
&&Tile.Key.Level<static_cast<int32>(ColumnCaptureTilesByLOD.size()))
|
|
||||||
{
|
|
||||||
const std::size_t LOD=static_cast<std::size_t>(Tile.Key.Level);
|
|
||||||
++ColumnCaptureTilesByLOD[LOD];
|
|
||||||
ColumnCaptureCompleteByLOD[LOD]=ColumnCaptureCompleteByLOD[LOD]
|
|
||||||
&&Tile.CoreDiagnostics.columnCoordinateCaptureComplete;
|
|
||||||
std::vector<std::array<std::int64_t,2>> Coordinates=
|
|
||||||
Tile.CoreDiagnostics.evaluatedColumnCoordinates;
|
|
||||||
std::sort(Coordinates.begin(),Coordinates.end());
|
|
||||||
Coordinates.erase(std::unique(Coordinates.begin(),Coordinates.end()),Coordinates.end());
|
|
||||||
for(const auto& Coordinate:Coordinates)
|
|
||||||
{
|
|
||||||
const FColumnXY XY{Coordinate[0],Coordinate[1]};
|
|
||||||
auto [Uses,Inserted]=ColumnUsesByLOD[LOD].try_emplace(XY);
|
|
||||||
std::vector<FFirstColumnUse>& PriorUses=Uses->second;
|
|
||||||
if(Inserted)
|
|
||||||
{
|
|
||||||
PriorUses.push_back({Tile.Key,Tile.CoreDiagnostics.columnEvaluationWorkerHash});
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
++ColumnDuplicateEventsByLOD[LOD];
|
|
||||||
bool bHasNeighbourDuplicate=false,bHasCrossWorkerNeighbourDuplicate=false;
|
|
||||||
for(const FFirstColumnUse& Prior:PriorUses)
|
|
||||||
{
|
|
||||||
if(!AreSameLODNeighbours(Prior.Tile,Tile.Key))continue;
|
|
||||||
bHasNeighbourDuplicate=true;
|
|
||||||
bHasCrossWorkerNeighbourDuplicate=bHasCrossWorkerNeighbourDuplicate
|
|
||||||
||Prior.WorkerHash!=Tile.CoreDiagnostics.columnEvaluationWorkerHash;
|
|
||||||
}
|
|
||||||
if(bHasNeighbourDuplicate)++NeighbourDuplicateEventsByLOD[LOD];
|
|
||||||
if(bHasCrossWorkerNeighbourDuplicate)
|
|
||||||
++CrossWorkerNeighbourDuplicateEventsByLOD[LOD];
|
|
||||||
PriorUses.push_back({Tile.Key,Tile.CoreDiagnostics.columnEvaluationWorkerHash});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WholeViewReady=std::max(WholeViewReady,Tile.CompletedAt);
|
|
||||||
if(Neighborhood.contains(Tile.Key))
|
|
||||||
{
|
|
||||||
++NeighborhoodFinished;
|
|
||||||
NeighborhoodReady=std::max(NeighborhoodReady,Tile.CompletedAt);
|
|
||||||
}
|
|
||||||
if(Tile.Key.Level<World.FullResClipLevels)
|
|
||||||
{
|
|
||||||
++FullDetailFinished;
|
|
||||||
FullDetailReady=std::max(FullDetailReady,Tile.CompletedAt);
|
|
||||||
NativeSolidBoxes+=Tile.CoreDiagnostics.solidBoxes;
|
|
||||||
NativeAirBoxes+=Tile.CoreDiagnostics.airBoxes;
|
|
||||||
NativeMixedBoxes+=Tile.CoreDiagnostics.mixedBoxes;
|
|
||||||
NativeUnknownBoxes+=Tile.CoreDiagnostics.unknownBoxes;
|
|
||||||
NativeFieldCalls+=Tile.CoreDiagnostics.fieldCalls;
|
|
||||||
NativeColumnHits+=Tile.CoreDiagnostics.columnCacheHits;
|
|
||||||
NativeColumnMisses+=Tile.CoreDiagnostics.columnCacheMisses;
|
|
||||||
NativeMeshingSkips+=Tile.CoreDiagnostics.meshingSkipped?1u:0u;
|
|
||||||
NativeClassificationMilliseconds+=Tile.CoreDiagnostics.classificationMilliseconds;
|
|
||||||
NativeColumnComputeMilliseconds+=Tile.CoreDiagnostics.columnComputeMilliseconds;
|
|
||||||
NativeMeshingMilliseconds+=Tile.CoreDiagnostics.meshingMilliseconds;
|
|
||||||
}
|
|
||||||
if(bHashDensity)
|
|
||||||
{
|
|
||||||
if(Tile.bHasDensityHash)DensityRows.push_back({Tile.Key,Tile.DensityHash});
|
|
||||||
if(Tile.bHasMeshHash)MeshRows.push_back({Tile.Key,Tile.MeshHash});
|
|
||||||
if(Tile.bHasPayloadHash)PayloadRows.push_back({Tile.Key,Tile.PayloadHash});
|
|
||||||
if(Tile.bHasTopologyHash)TopologyRows.push_back({Tile.Key,Tile.TopologyHash});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!bNeighborhoodReported&&NeighborhoodFinished==static_cast<int32>(Neighborhood.size()))
|
|
||||||
{
|
|
||||||
std::printf("[PipelineMilestone] neighborhood_ready=%.3fs generated=%d/27\n",
|
|
||||||
std::chrono::duration<double>(NeighborhoodReady-ColdStart).count(),NeighborhoodFinished);
|
|
||||||
bNeighborhoodReported=true;
|
|
||||||
}
|
|
||||||
if(!bFullDetailReported&&FullDetailFinished==FullDetailExpected)
|
|
||||||
{
|
|
||||||
std::printf("[PipelineMilestone] full_detail_ready=%.3fs generated=%d/%d\n",
|
|
||||||
std::chrono::duration<double>(FullDetailReady-ColdStart).count(),
|
|
||||||
FullDetailFinished,FullDetailExpected);
|
|
||||||
bFullDetailReported=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Streamer.Stop();
|
|
||||||
bool bColumnOverlapCapturePassing=true;
|
|
||||||
if(bProfileColumnOverlap)
|
|
||||||
{
|
|
||||||
for(std::size_t LOD=0;LOD<ColumnCaptureTilesByLOD.size();++LOD)
|
|
||||||
{
|
|
||||||
const bool bLODComplete=ColumnCaptureCompleteByLOD[LOD]
|
|
||||||
&&ColumnCaptureTilesByLOD[LOD]==ExpectedTilesByLOD[LOD];
|
|
||||||
bColumnOverlapCapturePassing=bColumnOverlapCapturePassing&&bLODComplete;
|
|
||||||
std::printf("[WorldAssemblerLODColumnOverlap] lod=%zu tiles=%llu expected_tiles=%llu unique_xy_columns=%zu repeated_tile_evaluations=%llu neighbouring_duplicate_evaluations=%llu cross_worker_neighbouring_duplicates=%llu capture_complete=%d\n",
|
|
||||||
LOD,static_cast<unsigned long long>(ColumnCaptureTilesByLOD[LOD]),
|
|
||||||
static_cast<unsigned long long>(ExpectedTilesByLOD[LOD]),
|
|
||||||
ColumnUsesByLOD[LOD].size(),
|
|
||||||
static_cast<unsigned long long>(ColumnDuplicateEventsByLOD[LOD]),
|
|
||||||
static_cast<unsigned long long>(NeighbourDuplicateEventsByLOD[LOD]),
|
|
||||||
static_cast<unsigned long long>(CrossWorkerNeighbourDuplicateEventsByLOD[LOD]),
|
|
||||||
bLODComplete?1:0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(std::size_t LOD=0;LOD<TileCountByLOD.size();++LOD)
|
|
||||||
{
|
|
||||||
std::printf("[WorldAssemblerLODWorker] lod=%zu tiles=%llu worker_sum_s=%.6f column_eval_exclusive_ms=%.3f mc_exclusive_ms=%.3f ground_refine_exclusive_ms=%.3f cap_refine_exclusive_ms=%.3f mesh_assembly_ms=%.3f\n",
|
|
||||||
LOD,static_cast<unsigned long long>(TileCountByLOD[LOD]),WorkerSecondsByLOD[LOD],
|
|
||||||
ColumnEvalMsByLOD[LOD],MarchingExclusiveMsByLOD[LOD],
|
|
||||||
GroundRefineExclusiveMsByLOD[LOD],CapRefineExclusiveMsByLOD[LOD],MeshAssemblyMsByLOD[LOD]);
|
|
||||||
}
|
|
||||||
const double NeighborhoodSeconds=std::chrono::duration<double>(NeighborhoodReady-ColdStart).count();
|
|
||||||
const double NeighborhoodMeshSeconds=std::chrono::duration<double>(NeighborhoodReady-ShapeReady).count();
|
|
||||||
const double FullDetailSeconds=std::chrono::duration<double>(FullDetailReady-ColdStart).count();
|
|
||||||
const double WholeViewSeconds=std::chrono::duration<double>(WholeViewReady-ColdStart).count();
|
|
||||||
const double StreamSeconds=std::chrono::duration<double>(WholeViewReady-StreamStart).count();
|
|
||||||
std::printf("[StreamPipeline] workers=%d shape=%.3fs neighborhood_mesh=%.3fs neighborhood_ready=%.3fs full_detail_ready=%.3fs whole_view_ready=%.3fs neighborhood_tiles=%d/27 full_detail_tiles=%d/%d whole_tiles=%d/%zu stream_wall=%.3fs cache_hits=0 full_payload=1\n",
|
|
||||||
WorkerCount,ShapeSeconds,NeighborhoodMeshSeconds,NeighborhoodSeconds,
|
|
||||||
FullDetailSeconds,WholeViewSeconds,NeighborhoodFinished,
|
|
||||||
FullDetailFinished,FullDetailExpected,Finished,Desired.Tiles.size(),StreamSeconds);
|
|
||||||
std::printf("[WorldAssemblerTilePipeline] full_detail_tiles=%d solid_boxes=%llu air_boxes=%llu mixed_boxes=%llu unknown_boxes=%llu whole_tile_skips=%llu field_calls=%llu column_cache_hits=%llu column_cache_misses=%llu column_compute_worker_ms=%.3f classification_worker_ms=%.3f meshing_worker_ms=%.3f\n",
|
|
||||||
FullDetailExpected,static_cast<unsigned long long>(NativeSolidBoxes),
|
|
||||||
static_cast<unsigned long long>(NativeAirBoxes),
|
|
||||||
static_cast<unsigned long long>(NativeMixedBoxes),
|
|
||||||
static_cast<unsigned long long>(NativeUnknownBoxes),
|
|
||||||
static_cast<unsigned long long>(NativeMeshingSkips),
|
|
||||||
static_cast<unsigned long long>(NativeFieldCalls),
|
|
||||||
static_cast<unsigned long long>(NativeColumnHits),
|
|
||||||
static_cast<unsigned long long>(NativeColumnMisses),
|
|
||||||
NativeColumnComputeMilliseconds,NativeClassificationMilliseconds,
|
|
||||||
NativeMeshingMilliseconds);
|
|
||||||
|
|
||||||
bool bHashesPassing=true;
|
|
||||||
if(bHashDensity)
|
|
||||||
{
|
|
||||||
bHashesPassing=DensityRows.size()==Desired.Tiles.size()
|
|
||||||
&&MeshRows.size()==Desired.Tiles.size()
|
|
||||||
&&PayloadRows.size()==Desired.Tiles.size()
|
|
||||||
&&TopologyRows.size()==Desired.Tiles.size();
|
|
||||||
std::vector<FHashedTile> FullDensity,FullMesh,FullPayload,FullTopology;
|
|
||||||
for(const FHashedTile& Row:DensityRows)if(Row.Key.Level<World.FullResClipLevels)FullDensity.push_back(Row);
|
|
||||||
for(const FHashedTile& Row:MeshRows)if(Row.Key.Level<World.FullResClipLevels)FullMesh.push_back(Row);
|
|
||||||
for(const FHashedTile& Row:PayloadRows)if(Row.Key.Level<World.FullResClipLevels)FullPayload.push_back(Row);
|
|
||||||
for(const FHashedTile& Row:TopologyRows)if(Row.Key.Level<World.FullResClipLevels)FullTopology.push_back(Row);
|
|
||||||
std::printf("[PipelineFullDetailHash] tiles=%d density=0x%016llx mesh=0x%016llx payload=0x%016llx topology=0x%016llx\n",
|
|
||||||
FullDetailExpected,static_cast<unsigned long long>(HashTileRows(FullDensity)),
|
|
||||||
static_cast<unsigned long long>(HashTileRows(FullMesh)),
|
|
||||||
static_cast<unsigned long long>(HashTileRows(FullPayload)),
|
|
||||||
static_cast<unsigned long long>(HashTileRows(FullTopology)));
|
|
||||||
std::printf("[PipelineWholeViewHash] tiles=%zu density=0x%016llx mesh=0x%016llx payload=0x%016llx topology=0x%016llx\n",
|
|
||||||
Desired.Tiles.size(),static_cast<unsigned long long>(HashTileRows(DensityRows)),
|
|
||||||
static_cast<unsigned long long>(HashTileRows(MeshRows)),
|
|
||||||
static_cast<unsigned long long>(HashTileRows(PayloadRows)),
|
|
||||||
static_cast<unsigned long long>(HashTileRows(TopologyRows)));
|
|
||||||
}
|
|
||||||
return NeighborhoodFinished==static_cast<int32>(Neighborhood.size())
|
|
||||||
&&FullDetailFinished==FullDetailExpected&&Finished==Update.DesiredTiles&&bHashesPassing
|
|
||||||
&&(!bProfileColumnOverlap||bColumnOverlapCapturePassing)?0:6;
|
|
||||||
}
|
|
||||||
int RunStreamingBenchmark(FStandaloneOwnerWorld& World,VoxelForgeCore::World* CoreWorld,
|
int RunStreamingBenchmark(FStandaloneOwnerWorld& World,VoxelForgeCore::World* CoreWorld,
|
||||||
const FVector& CameraPositionVoxels,
|
const FVector& CameraPositionVoxels,
|
||||||
int32 WorkerCount,int32 MaxLevel,bool bRoundTunnels,
|
int32 WorkerCount,int32 MaxLevel,bool bRoundTunnels,
|
||||||
@@ -8132,414 +7789,6 @@ float3 Lit=Rock*(Ambient+0.88*Diffuse)+float3(0.50,0.69,0.82)*Head*0.75;
|
|||||||
&&analyticReverseCovered==1&&packedAnalyticRenderSame?0:12;
|
&&analyticReverseCovered==1&&packedAnalyticRenderSame?0:12;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::int64_t WorldAssemblyFixed(double voxels)
|
|
||||||
{return static_cast<std::int64_t>(std::llround(voxels*VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel));}
|
|
||||||
|
|
||||||
std::int64_t WorldAssemblyQ16(double value)
|
|
||||||
{return static_cast<std::int64_t>(std::llround(value*65536.0));}
|
|
||||||
|
|
||||||
std::int64_t WorldAssemblyWavelength(double frequency,double fallbackVoxels)
|
|
||||||
{
|
|
||||||
const double wavelength=std::isfinite(frequency)&&frequency>0.0?1.0/frequency:fallbackVoxels;
|
|
||||||
return std::max<std::int64_t>(1,WorldAssemblyFixed(wavelength));
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 WorldAssemblyFeatureId(uint32 seed,int64 x,int64 y,uint32 kind)
|
|
||||||
{
|
|
||||||
uint64 hash=14695981039346656037ull;
|
|
||||||
const auto add=[&](uint64 value,int bytes)
|
|
||||||
{
|
|
||||||
for(int i=0;i<bytes;++i){hash^=static_cast<uint8>(value>>(8*i));hash*=1099511628211ull;}
|
|
||||||
};
|
|
||||||
add(seed,4);add(static_cast<uint64>(x),8);add(static_cast<uint64>(y),8);add(kind,4);
|
|
||||||
return hash?hash:1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BuildFiniteStrateRoute(VoxelForgeCore::WorldAssemblyRecipeV1& recipe,
|
|
||||||
VoxelForgeCore::WorldAssemblyStratumPlanV1& stratum,std::uint64_t& tested,
|
|
||||||
std::uint64_t& gradeRejected,std::uint64_t& sweepRejected,std::string& error)
|
|
||||||
{
|
|
||||||
using namespace VoxelForgeCore;
|
|
||||||
constexpr std::int64_t PlayerRadiusQ=348; // 0.34 m in Core's 0.25 m voxel scale.
|
|
||||||
constexpr std::int64_t PlayerHeightQ=1802; // 1.76 m in Core's 0.25 m voxel scale.
|
|
||||||
constexpr std::int64_t HalfHeightQ=PlayerHeightQ/2;
|
|
||||||
constexpr std::int64_t StepQ=128; // 0.5 Core voxel, finer than the density lattice.
|
|
||||||
constexpr std::int64_t ProbeRadiusQ=174;
|
|
||||||
constexpr std::int64_t SupportDepthQ=256;
|
|
||||||
constexpr std::int64_t GradeQ16=17560; // tan(15 degrees), rounded upward.
|
|
||||||
constexpr std::int64_t RouteRadiusQ=4*WorldAssemblySubvoxelsPerVoxel;
|
|
||||||
struct Direction {std::int32_t x,y;};
|
|
||||||
constexpr std::array<Direction,8> directions{{
|
|
||||||
{65536,0},{46341,46341},{0,65536},{-46341,46341},
|
|
||||||
{-65536,0},{-46341,-46341},{0,-65536},{46341,-46341}}};
|
|
||||||
struct Candidate
|
|
||||||
{
|
|
||||||
std::int64_t score=0;
|
|
||||||
std::int32_t centerX=0,centerY=0,direction=0;
|
|
||||||
std::vector<WorldAssemblyRoutePointV1> points;
|
|
||||||
};
|
|
||||||
|
|
||||||
auto& constraints=stratum.routeConstraints;
|
|
||||||
constraints.version=1;
|
|
||||||
constraints.capsuleRadiusSubvoxels=PlayerRadiusQ;
|
|
||||||
constraints.capsuleHeightSubvoxels=PlayerHeightQ;
|
|
||||||
constraints.maximumGradeQ16=GradeQ16;
|
|
||||||
constraints.sweepSpacingSubvoxels=StepQ;
|
|
||||||
constraints.supportProbeRadiusSubvoxels=ProbeRadiusQ;
|
|
||||||
constraints.supportSearchDepthSubvoxels=SupportDepthQ;
|
|
||||||
constraints.minimumClearanceSubvoxels=8;
|
|
||||||
constraints.minimumSupportProbes=3;
|
|
||||||
|
|
||||||
const Heightfield2D finalField(recipe,stratum);
|
|
||||||
if(!finalField.isValid())
|
|
||||||
{error="route planner received an invalid final composed field";return false;}
|
|
||||||
std::vector<Candidate> candidates;
|
|
||||||
constexpr std::int32_t halfLength=128;
|
|
||||||
constexpr std::int32_t waypointSpacing=8;
|
|
||||||
for(std::int32_t centerY=-256;centerY<=256;centerY+=64)
|
|
||||||
for(std::int32_t centerX=-256;centerX<=256;centerX+=64)
|
|
||||||
for(std::int32_t directionIndex=0;directionIndex<static_cast<std::int32_t>(directions.size());++directionIndex)
|
|
||||||
{
|
|
||||||
Candidate candidate;
|
|
||||||
candidate.centerX=centerX;candidate.centerY=centerY;candidate.direction=directionIndex;
|
|
||||||
candidate.points.reserve(33);
|
|
||||||
std::int64_t previousGround=0,previousX=0,previousY=0;
|
|
||||||
bool gradePass=true;
|
|
||||||
for(std::int32_t index=0;index<=32;++index)
|
|
||||||
{
|
|
||||||
const std::int64_t along=(index-16)*waypointSpacing;
|
|
||||||
const std::int64_t x=centerX+std::llround(
|
|
||||||
static_cast<double>(along)*directions[directionIndex].x/65536.0);
|
|
||||||
const std::int64_t y=centerY+std::llround(
|
|
||||||
static_cast<double>(along)*directions[directionIndex].y/65536.0);
|
|
||||||
const auto column=finalField.point(WorldAssemblyFixed(static_cast<double>(x)),
|
|
||||||
WorldAssemblyFixed(static_cast<double>(y)),0);
|
|
||||||
const std::int64_t horizontalQ=static_cast<std::int64_t>(std::llround(
|
|
||||||
std::hypot(static_cast<double>(x-previousX),static_cast<double>(y-previousY))
|
|
||||||
*WorldAssemblySubvoxelsPerVoxel));
|
|
||||||
if(index>0)
|
|
||||||
{
|
|
||||||
const std::int64_t riseQ=std::abs(column.groundHeightSubvoxels-previousGround);
|
|
||||||
if(horizontalQ==0||riseQ*65536>horizontalQ*GradeQ16)
|
|
||||||
{gradePass=false;break;}
|
|
||||||
candidate.score+=riseQ*65536/std::max<std::int64_t>(1,horizontalQ);
|
|
||||||
}
|
|
||||||
WorldAssemblyRoutePointV1 point;
|
|
||||||
point.positionSubvoxels={WorldAssemblyFixed(static_cast<double>(x)),
|
|
||||||
WorldAssemblyFixed(static_cast<double>(y)),column.groundHeightSubvoxels+HalfHeightQ};
|
|
||||||
point.radiusSubvoxels=RouteRadiusQ;
|
|
||||||
point.stableFeatureId=WorldAssemblyFeatureId(recipe.seed,
|
|
||||||
static_cast<std::int64_t>(x),static_cast<std::int64_t>(y),
|
|
||||||
0x52540000u+static_cast<std::uint32_t>(index));
|
|
||||||
candidate.points.push_back(point);
|
|
||||||
previousGround=column.groundHeightSubvoxels;previousX=x;previousY=y;
|
|
||||||
}
|
|
||||||
++tested;
|
|
||||||
if(gradePass)candidates.push_back(std::move(candidate));
|
|
||||||
else ++gradeRejected;
|
|
||||||
}
|
|
||||||
std::stable_sort(candidates.begin(),candidates.end(),[](const Candidate& a,const Candidate& b)
|
|
||||||
{
|
|
||||||
if(a.score!=b.score)return a.score<b.score;
|
|
||||||
if(a.centerY!=b.centerY)return a.centerY<b.centerY;
|
|
||||||
if(a.centerX!=b.centerX)return a.centerX<b.centerX;
|
|
||||||
return a.direction<b.direction;
|
|
||||||
});
|
|
||||||
std::uint64_t sweepAttempt=0,repairAttempt=0;
|
|
||||||
VoxelForgeCore::WorldAssemblyRouteAuditResult lastAudit{};
|
|
||||||
for(auto& candidate:candidates)
|
|
||||||
{
|
|
||||||
stratum.route=candidate.points;
|
|
||||||
std::int64_t liftQ=0;
|
|
||||||
constexpr std::int64_t RepairStepQ=64;
|
|
||||||
constexpr std::int64_t MaximumRepairLiftQ=SupportDepthQ-RepairStepQ;
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if(liftQ>0)
|
|
||||||
for(std::size_t pointIndex=0;pointIndex<stratum.route.size();++pointIndex)
|
|
||||||
stratum.route[pointIndex].positionSubvoxels[2]
|
|
||||||
=candidate.points[pointIndex].positionSubvoxels[2]+liftQ;
|
|
||||||
const Heightfield2D candidateField(recipe,stratum);
|
|
||||||
const auto audit=AuditHeightfieldRoute(candidateField);
|
|
||||||
lastAudit=audit;
|
|
||||||
if(audit.passed)
|
|
||||||
{
|
|
||||||
if(liftQ>0)
|
|
||||||
std::printf("[WorldAssemblerRouteRepaired] uniform_lift_q=%lld support_limit_q=%lld\n",
|
|
||||||
static_cast<long long>(liftQ),static_cast<long long>(SupportDepthQ));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if(audit.blockedCapsuleSamples==0||liftQ>=MaximumRepairLiftQ)break;
|
|
||||||
const std::int64_t needed=std::max<std::int64_t>(1,
|
|
||||||
constraints.minimumClearanceSubvoxels-audit.minimumClearanceSubvoxels);
|
|
||||||
const std::int64_t steps=(needed+RepairStepQ-1)/RepairStepQ;
|
|
||||||
const std::int64_t nextLift=std::max(liftQ+RepairStepQ,liftQ+steps*RepairStepQ);
|
|
||||||
if(nextLift>MaximumRepairLiftQ)break;
|
|
||||||
liftQ=nextLift;
|
|
||||||
++repairAttempt;
|
|
||||||
}
|
|
||||||
if(sweepAttempt<3)
|
|
||||||
std::printf("[WorldAssemblerRouteCandidateRejected] ordinal=%llu blocked=%llu unsupported=%llu grade_failures=%llu minimum_clearance_q=%lld\n",
|
|
||||||
static_cast<unsigned long long>(sweepAttempt),
|
|
||||||
static_cast<unsigned long long>(lastAudit.blockedCapsuleSamples),
|
|
||||||
static_cast<unsigned long long>(lastAudit.unsupportedCenterSamples),
|
|
||||||
static_cast<unsigned long long>(lastAudit.gradeFailures),
|
|
||||||
static_cast<long long>(lastAudit.minimumClearanceSubvoxels));
|
|
||||||
++sweepAttempt;
|
|
||||||
++sweepRejected;
|
|
||||||
}
|
|
||||||
std::printf("[WorldAssemblerRouteSearchFailed] tested=%llu grade_rejected=%llu sweepable_candidates=%llu sweep_rejected=%llu last_blocked=%llu last_unsupported=%llu last_grade_failures=%llu\n",
|
|
||||||
static_cast<unsigned long long>(tested),static_cast<unsigned long long>(gradeRejected),
|
|
||||||
static_cast<unsigned long long>(candidates.size()),static_cast<unsigned long long>(sweepRejected),
|
|
||||||
static_cast<unsigned long long>(lastAudit.blockedCapsuleSamples),
|
|
||||||
static_cast<unsigned long long>(lastAudit.unsupportedCenterSamples),
|
|
||||||
static_cast<unsigned long long>(lastAudit.gradeFailures));
|
|
||||||
std::printf("[WorldAssemblerRouteRepairSummary] repair_attempts=%llu\n",
|
|
||||||
static_cast<unsigned long long>(repairAttempt));
|
|
||||||
stratum.route.clear();
|
|
||||||
error="finite-strate route candidates failed the composed-field capsule and support sweep";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AttachRound1WorldAssemblyPrototype(FStandaloneOwnerWorld& owner,VFJson::Value& root,
|
|
||||||
std::string& error,const std::string& manifestOutputPath)
|
|
||||||
{
|
|
||||||
if(!owner.Manager||!owner.Generator)
|
|
||||||
{error="world assembler prototype needs the resolved standalone owner world";return false;}
|
|
||||||
int32 surfaceChunkZ=0,topChunkZ=0,bottomChunkZ=0;
|
|
||||||
bool foundSurface=false;
|
|
||||||
for(int32 chunkZ=1024;chunkZ>=-4096;--chunkZ)
|
|
||||||
{
|
|
||||||
if(owner.Manager->GetGeneratorTypeForChunk(FIntVector(0,0,chunkZ))
|
|
||||||
!=ECaveGeneratorType::SurfaceWorld)continue;
|
|
||||||
surfaceChunkZ=chunkZ;
|
|
||||||
foundSurface=owner.Manager->GetStrateChunkZBounds(chunkZ,topChunkZ,bottomChunkZ);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!foundSurface)
|
|
||||||
{error="world assembler prototype could not find a finite SurfaceWorld strate";return false;}
|
|
||||||
const FIntVector chunk(0,0,surfaceChunkZ);
|
|
||||||
const FSurfaceGenerationParams surface=owner.Manager->GetSurfaceParamsForChunk(chunk);
|
|
||||||
const FBiomeContext biomeContext=owner.Manager->GetBiomeContextForChunk(chunk);
|
|
||||||
const std::int64_t bottomVoxel=static_cast<std::int64_t>(bottomChunkZ)*CHUNK_SIZE;
|
|
||||||
const std::int64_t heightVoxels=static_cast<std::int64_t>(topChunkZ-bottomChunkZ+1)*CHUNK_SIZE;
|
|
||||||
const FBiomeMapParams& map=biomeContext.Map;
|
|
||||||
const UVoxelStrateDefinition* definition=owner.Manager->GetStrateForChunk(chunk);
|
|
||||||
|
|
||||||
VoxelForgeCore::WorldAssemblyManifest manifest;
|
|
||||||
auto& recipe=manifest.recipe;
|
|
||||||
recipe.seed=static_cast<uint32>(owner.Seed);
|
|
||||||
recipe.biomeCellSizeSubvoxels=WorldAssemblyFixed(map.CellSize);
|
|
||||||
recipe.biomeWarpSubvoxels=WorldAssemblyFixed(map.WarpStrength);
|
|
||||||
recipe.biomeWarpWavelengthSubvoxels=WorldAssemblyWavelength(map.WarpFrequency,556.0);
|
|
||||||
recipe.biomeBorderBlendSubvoxels=WorldAssemblyFixed(map.BorderBlend);
|
|
||||||
recipe.biomeClimateReliefWavelengthSubvoxels=WorldAssemblyWavelength(map.ReliefFrequency,3333.0);
|
|
||||||
recipe.biomeClimateMoistureWavelengthSubvoxels=WorldAssemblyWavelength(map.MoistureFrequency,2500.0);
|
|
||||||
recipe.biomeClimateReliefContrastQ16=WorldAssemblyQ16(map.ReliefContrast);
|
|
||||||
const auto makeProfile=[&](uint32 stableId,const FSurfaceGenerationParams& params,
|
|
||||||
const FBiomeResolved* climate)
|
|
||||||
{
|
|
||||||
VoxelForgeCore::WorldAssemblyBiomeProfileV1 profile;
|
|
||||||
profile.stableId=stableId;
|
|
||||||
profile.baseHeightSubvoxels=WorldAssemblyFixed(static_cast<double>(bottomVoxel)
|
|
||||||
+static_cast<double>(heightVoxels)*params.BaseGroundRelative);
|
|
||||||
profile.continentAmplitudeSubvoxels=WorldAssemblyFixed(params.ElevationRange);
|
|
||||||
profile.continentWavelengthSubvoxels=WorldAssemblyWavelength(params.ContinentFrequency,1000.0);
|
|
||||||
profile.mountainAmplitudeSubvoxels=WorldAssemblyFixed(params.ElevationRange*params.MountainStrength);
|
|
||||||
profile.mountainWavelengthSubvoxels=WorldAssemblyWavelength(params.MountainFrequency,500.0);
|
|
||||||
profile.detailAmplitudeSubvoxels=WorldAssemblyFixed(params.SurfaceRoughness);
|
|
||||||
profile.detailWavelengthSubvoxels=WorldAssemblyWavelength(params.DetailFrequency,25.0);
|
|
||||||
profile.reliefMinimumQ16=climate?WorldAssemblyQ16(climate->ReliefMin):0;
|
|
||||||
profile.reliefMaximumQ16=climate?WorldAssemblyQ16(climate->ReliefMax):65536;
|
|
||||||
profile.moistureMinimumQ16=climate?WorldAssemblyQ16(climate->MoistureMin):0;
|
|
||||||
profile.moistureMaximumQ16=climate?WorldAssemblyQ16(climate->MoistureMax):65536;
|
|
||||||
profile.reliefStrengthQ16=WorldAssemblyQ16(params.ReliefStrength);
|
|
||||||
profile.reliefContrastQ16=WorldAssemblyQ16(params.ReliefContrast);
|
|
||||||
profile.reliefWavelengthSubvoxels=WorldAssemblyWavelength(params.ReliefFrequency,667.0);
|
|
||||||
profile.heightWarpStrengthSubvoxels=WorldAssemblyFixed(params.HeightWarpStrength);
|
|
||||||
profile.heightWarpWavelengthSubvoxels=WorldAssemblyWavelength(params.HeightWarpFrequency,125.0);
|
|
||||||
profile.beachWidthSubvoxels=WorldAssemblyFixed(params.BeachWidth);
|
|
||||||
profile.cliffStrengthQ16=WorldAssemblyQ16(params.CliffStrength);
|
|
||||||
profile.cliffSlopeThresholdQ16=std::max<std::int64_t>(1,WorldAssemblyQ16(params.CliffSlopeThreshold));
|
|
||||||
profile.cliffSharpnessQ16=WorldAssemblyQ16(params.CliffSharpness);
|
|
||||||
profile.cliffSampleDistanceSubvoxels=WorldAssemblyFixed(std::max(0.5f,params.CliffSampleDist));
|
|
||||||
const double structuralAbsBound=static_cast<double>(params.ElevationRange)
|
|
||||||
+static_cast<double>(params.ElevationRange)*params.MountainStrength
|
|
||||||
+2.0*params.SurfaceRoughness;
|
|
||||||
const double cliffAbsBound=2.0*structuralAbsBound*params.CliffStrength*params.CliffSharpness;
|
|
||||||
profile.cliffMaximumDisplacementSubvoxels=WorldAssemblyFixed(params.CliffStrength>0.0f
|
|
||||||
?std::max(1.0,cliffAbsBound):0.0);
|
|
||||||
profile.hasCapProfile=true;
|
|
||||||
profile.capHeightSubvoxels=WorldAssemblyFixed(static_cast<double>(bottomVoxel)
|
|
||||||
+static_cast<double>(heightVoxels)*params.CeilingRelative);
|
|
||||||
profile.capWarpStrengthSubvoxels=WorldAssemblyFixed(params.CeilingWarpStrength);
|
|
||||||
profile.capWarpWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingWarpFrequency,100.0);
|
|
||||||
profile.capUndulationSubvoxels=WorldAssemblyFixed(params.CeilingUndulation);
|
|
||||||
profile.capWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingUndulationFrequency,500.0);
|
|
||||||
profile.capDetailAmplitudeSubvoxels=WorldAssemblyFixed(params.CeilingRoughness);
|
|
||||||
profile.capDetailWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingRoughnessFrequency,25.0);
|
|
||||||
profile.capRidgeAmplitudeSubvoxels=WorldAssemblyFixed(params.CeilingRidgeStrength);
|
|
||||||
profile.capRidgeWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingRidgeFrequency,50.0);
|
|
||||||
return profile;
|
|
||||||
};
|
|
||||||
if(biomeContext.IsValid()&&definition)
|
|
||||||
{
|
|
||||||
for(const FBiomeResolved& resolved:biomeContext.Biomes)
|
|
||||||
{
|
|
||||||
const UVoxelBiomeDefinition* biome=definition->Biomes.IsValidIndex(resolved.Index)
|
|
||||||
?definition->Biomes[resolved.Index]:nullptr;
|
|
||||||
FSurfaceGenerationParams params=surface;
|
|
||||||
if(biome&&biome->bOverrideTerrain&&biome->GeneratorType==ECaveGeneratorType::SurfaceWorld)
|
|
||||||
{
|
|
||||||
params=biome->SurfaceParams;
|
|
||||||
params.StrateTopWorldZ=surface.StrateTopWorldZ;
|
|
||||||
params.StrateBottomWorldZ=surface.StrateBottomWorldZ;
|
|
||||||
params.BoundarySealThickness=surface.BoundarySealThickness;
|
|
||||||
params.BaseDensity=surface.BaseDensity;
|
|
||||||
params.WaterLevelRelative=surface.WaterLevelRelative;
|
|
||||||
}
|
|
||||||
recipe.biomes.push_back(makeProfile(0x1001u+static_cast<uint32>(resolved.Index),params,&resolved));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(recipe.biomes.empty())recipe.biomes.push_back(makeProfile(0x1001u,surface,nullptr));
|
|
||||||
|
|
||||||
VoxelForgeCore::WorldAssemblyStratumPlanV1 stratum;
|
|
||||||
stratum.strateIndex=owner.Manager->GetStrateIndex(
|
|
||||||
static_cast<float>((static_cast<double>(surfaceChunkZ*CHUNK_SIZE+CHUNK_SIZE/2))*VOXEL_SIZE));
|
|
||||||
stratum.topChunkZ=topChunkZ;
|
|
||||||
stratum.bottomChunkZ=bottomChunkZ;
|
|
||||||
const double strateBottom=static_cast<double>(bottomVoxel);
|
|
||||||
const double strateHeight=static_cast<double>(heightVoxels);
|
|
||||||
stratum.capHeightSubvoxels=WorldAssemblyFixed(strateBottom+strateHeight*surface.CeilingRelative);
|
|
||||||
stratum.capUndulationSubvoxels=WorldAssemblyFixed(surface.CeilingUndulation);
|
|
||||||
stratum.capWavelengthSubvoxels=WorldAssemblyWavelength(surface.CeilingUndulationFrequency,250.0);
|
|
||||||
stratum.capDetailAmplitudeSubvoxels=WorldAssemblyFixed(surface.CeilingRoughness);
|
|
||||||
stratum.capDetailWavelengthSubvoxels=WorldAssemblyWavelength(surface.CeilingRoughnessFrequency,25.0);
|
|
||||||
stratum.capRidgeAmplitudeSubvoxels=WorldAssemblyFixed(surface.CeilingRidgeStrength);
|
|
||||||
stratum.capRidgeWavelengthSubvoxels=WorldAssemblyWavelength(surface.CeilingRidgeFrequency,50.0);
|
|
||||||
stratum.waterSurfaceSubvoxels=WorldAssemblyFixed(strateBottom+strateHeight*surface.WaterLevelRelative);
|
|
||||||
stratum.waterEnabled=definition&&definition->bHasWater&&surface.WaterLevelRelative>0.0f;
|
|
||||||
|
|
||||||
// Select a deterministic steep edge in the resolved owner field for a bounded shelf.
|
|
||||||
// Selection d'une pente deterministe dans le champ resolu pour une saillie bornee.
|
|
||||||
constexpr int probeSide=49,probeStep=32;
|
|
||||||
std::array<float,probeSide*probeSide> heights{};
|
|
||||||
std::array<uint8,probeSide*probeSide> valid{};
|
|
||||||
for(int y=0;y<probeSide;++y)
|
|
||||||
for(int x=0;x<probeSide;++x)
|
|
||||||
{
|
|
||||||
const float px=static_cast<float>((x-probeSide/2)*probeStep);
|
|
||||||
const float py=static_cast<float>((y-probeSide/2)*probeStep);
|
|
||||||
float ceiling=0.0f;
|
|
||||||
const std::size_t index=static_cast<std::size_t>(y)*probeSide+x;
|
|
||||||
valid[index]=owner.Generator->GetSurfaceHeightAt(px,py,topChunkZ,heights[index],ceiling)?1u:0u;
|
|
||||||
}
|
|
||||||
double steepest=0.0;int cliffX=0,cliffY=0;bool xAxis=true;int downhill=1;
|
|
||||||
for(int y=1;y<probeSide-1;++y)
|
|
||||||
for(int x=1;x<probeSide-1;++x)
|
|
||||||
{
|
|
||||||
const std::size_t center=static_cast<std::size_t>(y)*probeSide+x;
|
|
||||||
if(!valid[center]||!valid[center-1]||!valid[center+1]||!valid[center-probeSide]||!valid[center+probeSide])continue;
|
|
||||||
const double dx=static_cast<double>(heights[center+1]-heights[center-1]);
|
|
||||||
const double dy=static_cast<double>(heights[center+probeSide]-heights[center-probeSide]);
|
|
||||||
const double slope=(std::abs(dx)+std::abs(dy))/(4.0*probeStep);
|
|
||||||
if(slope>steepest){steepest=slope;cliffX=(x-probeSide/2)*probeStep;cliffY=(y-probeSide/2)*probeStep;
|
|
||||||
xAxis=std::abs(dx)>=std::abs(dy);downhill=(xAxis?dx:dy)>=0.0?-1:1;}
|
|
||||||
}
|
|
||||||
if(steepest>0.05)
|
|
||||||
{
|
|
||||||
float ground=0.0f,ceiling=0.0f;
|
|
||||||
if(owner.Generator->GetSurfaceHeightAt(static_cast<float>(cliffX),static_cast<float>(cliffY),
|
|
||||||
topChunkZ,ground,ceiling))
|
|
||||||
{
|
|
||||||
VoxelForgeCore::WorldAssemblyFeatureV1 shelf;
|
|
||||||
shelf.stableId=WorldAssemblyFeatureId(recipe.seed,cliffX,cliffY,0x4f564552u);
|
|
||||||
shelf.type=4;
|
|
||||||
constexpr int reach=72,width=36,height=64,feather=8;
|
|
||||||
const int dirX=xAxis?downhill:0,dirY=xAxis?0:downhill;
|
|
||||||
const int minX=xAxis?(dirX>0?cliffX-feather:cliffX-reach-feather)
|
|
||||||
:cliffX-width-feather;
|
|
||||||
const int maxX=xAxis?(dirX>0?cliffX+reach+feather:cliffX+feather)
|
|
||||||
:cliffX+width+feather;
|
|
||||||
const int minY=xAxis?cliffY-width-feather
|
|
||||||
:(dirY>0?cliffY-feather:cliffY-reach-feather);
|
|
||||||
const int maxY=xAxis?cliffY+width+feather
|
|
||||||
:(dirY>0?cliffY+reach+feather:cliffY+feather);
|
|
||||||
VoxelForgeCore::Heightfield2D baseField(recipe,stratum);
|
|
||||||
double lowestGround=std::numeric_limits<double>::infinity();
|
|
||||||
double highestGround=-std::numeric_limits<double>::infinity();
|
|
||||||
for(int sampleY=minY;sampleY<=maxY;sampleY+=4)
|
|
||||||
for(int sampleX=minX;sampleX<=maxX;sampleX+=4)
|
|
||||||
{
|
|
||||||
const auto sample=baseField.point(WorldAssemblyFixed(sampleX),
|
|
||||||
WorldAssemblyFixed(sampleY),0);
|
|
||||||
const double heightQ=static_cast<double>(sample.groundHeightSubvoxels)
|
|
||||||
/VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel;
|
|
||||||
lowestGround=std::min(lowestGround,heightQ);
|
|
||||||
highestGround=std::max(highestGround,heightQ);
|
|
||||||
}
|
|
||||||
if(!std::isfinite(lowestGround)||!std::isfinite(highestGround))
|
|
||||||
{error="world assembler cliff shelf could not bound its terrain columns";return false;}
|
|
||||||
shelf.minimumSubvoxels={WorldAssemblyFixed(minX),WorldAssemblyFixed(minY),
|
|
||||||
WorldAssemblyFixed(std::max<double>(bottomVoxel,lowestGround-4.0))};
|
|
||||||
shelf.maximumSubvoxels={WorldAssemblyFixed(maxX),WorldAssemblyFixed(maxY),
|
|
||||||
WorldAssemblyFixed(std::min<double>((topChunkZ+1)*CHUNK_SIZE,
|
|
||||||
highestGround+height+4.0))};
|
|
||||||
shelf.parametersSubvoxels={WorldAssemblyFixed(dirX),WorldAssemblyFixed(dirY),
|
|
||||||
WorldAssemblyFixed(height),WorldAssemblyFixed(reach)};
|
|
||||||
stratum.features.push_back(shelf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::uint64_t routeCandidates=0,routeGradeRejected=0,routeSweepRejected=0;
|
|
||||||
if(!BuildFiniteStrateRoute(recipe,stratum,routeCandidates,routeGradeRejected,
|
|
||||||
routeSweepRejected,error))return false;
|
|
||||||
std::printf("[WorldAssemblerRoutePlan] candidates=%llu grade_rejected=%llu sweep_rejected=%llu accepted_points=%zu capsule_m=0.34x1.76 corridor_radius_vox=4 support_probe_points=5 minimum_support_probes=%u status=PASS\n",
|
|
||||||
static_cast<unsigned long long>(routeCandidates),
|
|
||||||
static_cast<unsigned long long>(routeGradeRejected),
|
|
||||||
static_cast<unsigned long long>(routeSweepRejected),stratum.route.size(),
|
|
||||||
stratum.routeConstraints.minimumSupportProbes);
|
|
||||||
manifest.plan.strates.push_back(std::move(stratum));
|
|
||||||
if(!manifest.finalize(error))return false;
|
|
||||||
const std::string manifestText=manifest.ToJson();
|
|
||||||
const auto roundTrip=VoxelForgeCore::WorldAssemblyManifest::FromJson(manifestText,error);
|
|
||||||
if(!roundTrip||!roundTrip->validate(error)||roundTrip->ToJson()!=manifestText
|
|
||||||
||roundTrip->contentHash!=manifest.contentHash)
|
|
||||||
{if(error.empty())error="world assembly canonical plan serialization did not round-trip";return false;}
|
|
||||||
std::printf("[WorldAssemblerPlanSerialization] bytes=%zu canonical_round_trip=true route_points=%zu plan_hash=%016llx manifest_hash=%016llx status=PASS\n",
|
|
||||||
manifestText.size(),manifest.plan.strates.front().route.size(),
|
|
||||||
static_cast<unsigned long long>(manifest.plan.contentHash),
|
|
||||||
static_cast<unsigned long long>(manifest.contentHash));
|
|
||||||
if(!manifestOutputPath.empty())
|
|
||||||
{
|
|
||||||
const std::filesystem::path outputPath(manifestOutputPath);
|
|
||||||
std::error_code directoryError;
|
|
||||||
if(!outputPath.parent_path().empty())
|
|
||||||
std::filesystem::create_directories(outputPath.parent_path(),directoryError);
|
|
||||||
if(directoryError)
|
|
||||||
{error="could not create the world assembly manifest output directory";return false;}
|
|
||||||
std::ofstream output(outputPath,std::ios::binary);
|
|
||||||
if(!output)
|
|
||||||
{error="could not open the world assembly manifest output path";return false;}
|
|
||||||
output.write(manifestText.data(),static_cast<std::streamsize>(manifestText.size()));
|
|
||||||
if(!output)
|
|
||||||
{error="could not write the world assembly manifest payload";return false;}
|
|
||||||
}
|
|
||||||
VFJson::Value manifestJson;
|
|
||||||
if(!VFJson::Parser(manifestText).Parse(manifestJson,error))return false;
|
|
||||||
auto* rootObject=std::get_if<VFJson::Value::Object>(&root.Data);
|
|
||||||
if(!rootObject)
|
|
||||||
{error="owner snapshot root is not a JSON object";return false;}
|
|
||||||
(*rootObject)["world_assembly"]=std::move(manifestJson);
|
|
||||||
std::printf("[WorldAssemblerPrototype] recipe_version=%u evaluator_version=%u strata=%zu biomes=%zu strate_index=%d chunk_z=%d..%d serialized_bytes=%zu recipe_hash=%016llx plan_hash=%016llx manifest_hash=%016llx source=owner_surface_params_and_biome_map route_points=%zu features=%zu\n",
|
|
||||||
manifest.recipe.schemaVersion,manifest.recipe.evaluatorVersion,manifest.plan.strates.size(),
|
|
||||||
manifest.recipe.biomes.size(),manifest.plan.strates.front().strateIndex,topChunkZ,bottomChunkZ,
|
|
||||||
manifestText.size(),static_cast<unsigned long long>(manifest.recipe.contentHash),
|
|
||||||
static_cast<unsigned long long>(manifest.plan.contentHash),
|
|
||||||
static_cast<unsigned long long>(manifest.contentHash),manifest.plan.strates.front().route.size(),
|
|
||||||
manifest.plan.strates.front().features.size());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RunWorldAssemblerCapAudit(FStandaloneOwnerWorld& owner,
|
bool RunWorldAssemblerCapAudit(FStandaloneOwnerWorld& owner,
|
||||||
const VoxelForgeCore::ResolvedWorldSnapshot& snapshot,VoxelForgeCore::World& world,
|
const VoxelForgeCore::ResolvedWorldSnapshot& snapshot,VoxelForgeCore::World& world,
|
||||||
VoxelForgeCore::Vec3d walkCameraVoxels)
|
VoxelForgeCore::Vec3d walkCameraVoxels)
|
||||||
@@ -9628,6 +8877,11 @@ int main(int Argc,char** Argv)
|
|||||||
bool bStreamPipeline=false;
|
bool bStreamPipeline=false;
|
||||||
bool bProfileColumnOverlap=false;
|
bool bProfileColumnOverlap=false;
|
||||||
bool bCoarseFirstStreamOrder=false;
|
bool bCoarseFirstStreamOrder=false;
|
||||||
|
bool bHasSeedOverride=false;
|
||||||
|
int32 SeedOverride=0;
|
||||||
|
bool bHasRenderDistanceOverride=false;
|
||||||
|
int32 RenderDistanceOverride=0;
|
||||||
|
bool bFloatingIslandsRecipe=false;
|
||||||
bool bProfileDetailBand=false;
|
bool bProfileDetailBand=false;
|
||||||
bool bPassageDetailAuditOnly=false;
|
bool bPassageDetailAuditOnly=false;
|
||||||
bool bGridStairAudit=false;
|
bool bGridStairAudit=false;
|
||||||
@@ -9649,6 +8903,33 @@ int main(int Argc,char** Argv)
|
|||||||
{
|
{
|
||||||
const std::string_view Arg=Argv[I];
|
const std::string_view Arg=Argv[I];
|
||||||
if(Arg.starts_with("--capture="))App.CapturePath=std::string(Arg.substr(10));
|
if(Arg.starts_with("--capture="))App.CapturePath=std::string(Arg.substr(10));
|
||||||
|
else if(Arg.starts_with("--seed="))
|
||||||
|
{
|
||||||
|
const std::string Value(Arg.substr(std::string_view("--seed=").size()));
|
||||||
|
char* End=nullptr;
|
||||||
|
const long long Parsed=std::strtoll(Value.c_str(),&End,10);
|
||||||
|
if(End==Value.c_str()||*End!='\0'||Parsed<INT32_MIN||Parsed>INT32_MAX)
|
||||||
|
{std::fprintf(stderr,"Invalid --seed value: %s\n",Value.c_str());return 2;}
|
||||||
|
SeedOverride=static_cast<int32>(Parsed);bHasSeedOverride=true;
|
||||||
|
}
|
||||||
|
else if(Arg.starts_with("--render-distance-chunks="))
|
||||||
|
{
|
||||||
|
const std::string Value(Arg.substr(std::string_view("--render-distance-chunks=").size()));
|
||||||
|
char* End=nullptr;
|
||||||
|
const long long Parsed=std::strtoll(Value.c_str(),&End,10);
|
||||||
|
if(End==Value.c_str()||*End!='\0'||Parsed<0||Parsed>INT32_MAX)
|
||||||
|
{std::fprintf(stderr,"Invalid --render-distance-chunks value: %s\n",Value.c_str());return 2;}
|
||||||
|
RenderDistanceOverride=static_cast<int32>(Parsed);bHasRenderDistanceOverride=true;
|
||||||
|
}
|
||||||
|
else if(Arg.starts_with("--recipe="))
|
||||||
|
{
|
||||||
|
const std::string_view Recipe=Arg.substr(std::string_view("--recipe=").size());
|
||||||
|
if(Recipe=="surface-world")bFloatingIslandsRecipe=false;
|
||||||
|
else if(Recipe=="floating-islands")
|
||||||
|
{bFloatingIslandsRecipe=true;App.bWorldAssemblerPrototype=true;App.bShapeWorld=true;}
|
||||||
|
else
|
||||||
|
{std::fprintf(stderr,"Invalid --recipe value: %.*s\n",static_cast<int>(Recipe.size()),Recipe.data());return 2;}
|
||||||
|
}
|
||||||
else if(Arg.starts_with("--far-horizon-lod8-step="))
|
else if(Arg.starts_with("--far-horizon-lod8-step="))
|
||||||
App.FarHorizonLOD8InteriorStepVoxels=std::max(0,std::atoi(
|
App.FarHorizonLOD8InteriorStepVoxels=std::max(0,std::atoi(
|
||||||
std::string(Arg.substr(std::string_view("--far-horizon-lod8-step=").size())).c_str()));
|
std::string(Arg.substr(std::string_view("--far-horizon-lod8-step=").size())).c_str()));
|
||||||
@@ -9885,6 +9166,16 @@ int main(int Argc,char** Argv)
|
|||||||
if(!VFJson::Parser(std::move(OwnerJsonText)).Parse(App.OwnerJsonRoot,Error))
|
if(!VFJson::Parser(std::move(OwnerJsonText)).Parse(App.OwnerJsonRoot,Error))
|
||||||
{std::fprintf(stderr,"Owner data load failed: %s\n",Error.c_str());return 2;}
|
{std::fprintf(stderr,"Owner data load failed: %s\n",Error.c_str());return 2;}
|
||||||
}
|
}
|
||||||
|
if(bHasSeedOverride
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::OverrideStandaloneSeed(App.OwnerJsonRoot,SeedOverride,Error))
|
||||||
|
{std::fprintf(stderr,"Seed override failed: %s\n",Error.c_str());return 2;}
|
||||||
|
if(bHasRenderDistanceOverride
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::OverrideStandaloneRenderDistance(
|
||||||
|
App.OwnerJsonRoot,RenderDistanceOverride,Error))
|
||||||
|
{std::fprintf(stderr,"Render-distance override failed: %s\n",Error.c_str());return 2;}
|
||||||
|
if(bFloatingIslandsRecipe
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::SelectTopStrateAsFloatingIslands(App.OwnerJsonRoot,Error))
|
||||||
|
{std::fprintf(stderr,"Floating-island recipe selection failed: %s\n",Error.c_str());return 2;}
|
||||||
if(!StandaloneOwnerLoader::Resolve(App.OwnerJsonRoot,*App.World,Error))
|
if(!StandaloneOwnerLoader::Resolve(App.OwnerJsonRoot,*App.World,Error))
|
||||||
{std::fprintf(stderr,"Owner data load failed: %s\n",Error.c_str());return 2;}
|
{std::fprintf(stderr,"Owner data load failed: %s\n",Error.c_str());return 2;}
|
||||||
std::printf("[ColdTimeline] stage=owner_data_load end_ms=%.3f\n",
|
std::printf("[ColdTimeline] stage=owner_data_load end_ms=%.3f\n",
|
||||||
@@ -9916,8 +9207,12 @@ int main(int Argc,char** Argv)
|
|||||||
if(App.bWorldAssemblerPrototype)
|
if(App.bWorldAssemblerPrototype)
|
||||||
{
|
{
|
||||||
const auto PlanStart=std::chrono::steady_clock::now();
|
const auto PlanStart=std::chrono::steady_clock::now();
|
||||||
const bool bPlanReady=AttachRound1WorldAssemblyPrototype(*App.World,App.OwnerJsonRoot,
|
VoxelForgeCore::WorldAssemblyManifest WorldAssembly;
|
||||||
Error,WorldAssemblyManifestOutputPath);
|
const bool bPlanReady=StandaloneWorldAssemblyPrototype::AttachRound1WorldAssemblyPrototype(*App.World,App.OwnerJsonRoot,
|
||||||
|
Error,WorldAssemblyManifestOutputPath,&WorldAssembly)
|
||||||
|
&&(!bFloatingIslandsRecipe
|
||||||
|
||StandaloneWorldAssemblyPrototype::AttachFloatingIslandWorldAssembly(
|
||||||
|
*App.World,App.OwnerJsonRoot,WorldAssembly,Error));
|
||||||
const double PlanMilliseconds=std::chrono::duration<double,std::milli>(
|
const double PlanMilliseconds=std::chrono::duration<double,std::milli>(
|
||||||
std::chrono::steady_clock::now()-PlanStart).count();
|
std::chrono::steady_clock::now()-PlanStart).count();
|
||||||
std::printf("[WorldAssemblerPlanTiming] total_ms=%.3f status=%s\n",
|
std::printf("[WorldAssemblerPlanTiming] total_ms=%.3f status=%s\n",
|
||||||
@@ -9978,7 +9273,7 @@ int main(int Argc,char** Argv)
|
|||||||
if(bStreamBenchmark)
|
if(bStreamBenchmark)
|
||||||
{
|
{
|
||||||
if(bStreamPipeline)
|
if(bStreamPipeline)
|
||||||
return RunPipelinedStreamingBenchmark(App.World,App.Snapshot,
|
return StandaloneStreamBenchmark::RunPipelinedStreamingBenchmark(App.World,App.Snapshot,
|
||||||
FVector(App.Position.X*4.0,App.Position.Y*4.0,App.Position.Z*4.0),
|
FVector(App.Position.X*4.0,App.Position.Y*4.0,App.Position.Z*4.0),
|
||||||
App.WorkerCount,StreamBenchmarkMaxLevel,App.ShapeDetailVariant,App.CoreScheduler,
|
App.WorkerCount,StreamBenchmarkMaxLevel,App.ShapeDetailVariant,App.CoreScheduler,
|
||||||
bStreamHash||!BakeMeshCachePath.empty(),bSkipUvAndColors,bSkipMaterialGroups,
|
bStreamHash||!BakeMeshCachePath.empty(),bSkipUvAndColors,bSkipMaterialGroups,
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <memory>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <system_error>
|
||||||
|
#include <thread>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Linux's static TLS image is larger than the default pthread stack in this standalone build.
|
||||||
|
// Give only host-owned generation workers enough stack for that TLS plus normal call frames.
|
||||||
|
#if defined(__linux__)
|
||||||
|
class FStandaloneWorkerThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static constexpr std::size_t StackSizeBytes=32u*1024u*1024u;
|
||||||
|
|
||||||
|
FStandaloneWorkerThread()=default;
|
||||||
|
|
||||||
|
template<class F>
|
||||||
|
explicit FStandaloneWorkerThread(F&& function)
|
||||||
|
{
|
||||||
|
using FTask=std::decay_t<F>;
|
||||||
|
auto task=std::make_unique<FTask>(std::forward<F>(function));
|
||||||
|
pthread_attr_t attributes;
|
||||||
|
int result=pthread_attr_init(&attributes);
|
||||||
|
if(result!=0)throw std::system_error(result,std::generic_category(),"pthread_attr_init");
|
||||||
|
result=pthread_attr_setstacksize(&attributes,StackSizeBytes);
|
||||||
|
if(result==0)
|
||||||
|
{
|
||||||
|
result=pthread_create(&thread_,&attributes,&RunTask<FTask>,task.get());
|
||||||
|
if(result==0)task.release();
|
||||||
|
}
|
||||||
|
const int destroyResult=pthread_attr_destroy(&attributes);
|
||||||
|
if(result!=0)throw std::system_error(result,std::generic_category(),"pthread_create");
|
||||||
|
if(destroyResult!=0)
|
||||||
|
{
|
||||||
|
(void)pthread_join(thread_,nullptr);
|
||||||
|
throw std::system_error(destroyResult,std::generic_category(),"pthread_attr_destroy");
|
||||||
|
}
|
||||||
|
joinable_=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FStandaloneWorkerThread(const FStandaloneWorkerThread&)=delete;
|
||||||
|
FStandaloneWorkerThread& operator=(const FStandaloneWorkerThread&)=delete;
|
||||||
|
|
||||||
|
FStandaloneWorkerThread(FStandaloneWorkerThread&& other) noexcept
|
||||||
|
:thread_(other.thread_),joinable_(std::exchange(other.joinable_,false))
|
||||||
|
{}
|
||||||
|
|
||||||
|
FStandaloneWorkerThread& operator=(FStandaloneWorkerThread&& other) noexcept
|
||||||
|
{
|
||||||
|
if(this!=&other)
|
||||||
|
{
|
||||||
|
if(joinable_)(void)pthread_join(thread_,nullptr);
|
||||||
|
thread_=other.thread_;
|
||||||
|
joinable_=std::exchange(other.joinable_,false);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
~FStandaloneWorkerThread()
|
||||||
|
{
|
||||||
|
if(joinable_)(void)pthread_join(thread_,nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool joinable()const noexcept{return joinable_;}
|
||||||
|
|
||||||
|
void join()
|
||||||
|
{
|
||||||
|
if(!joinable_)throw std::system_error(std::make_error_code(std::errc::invalid_argument));
|
||||||
|
const int result=pthread_join(thread_,nullptr);
|
||||||
|
if(result!=0)throw std::system_error(result,std::generic_category(),"pthread_join");
|
||||||
|
joinable_=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template<class F>
|
||||||
|
static void* RunTask(void* raw)
|
||||||
|
{
|
||||||
|
std::unique_ptr<F> task(static_cast<F*>(raw));
|
||||||
|
(*task)();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_t thread_{};
|
||||||
|
bool joinable_=false;
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
using FStandaloneWorkerThread=std::thread;
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
#include "OwnerWorldLoader.h"
|
||||||
|
#include "StandaloneCoreScheduler.h"
|
||||||
|
#include "StreamBenchmarkPipeline.h"
|
||||||
|
#include "WorldAssemblyPrototype.h"
|
||||||
|
#include "StandaloneTlsProbe.h"
|
||||||
|
#include "../Core/src/StandaloneSnapshotAdapter.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
struct FOptions
|
||||||
|
{
|
||||||
|
std::filesystem::path DataPath;
|
||||||
|
int WorkerCount=8;
|
||||||
|
int ClipRadius=3;
|
||||||
|
int MaxClipLevel=8;
|
||||||
|
int MaxLevel=-1;
|
||||||
|
int FarHorizonLOD8InteriorStepVoxels=0;
|
||||||
|
bool WorldAssemblerPrototype=false;
|
||||||
|
bool StreamBenchmark=false;
|
||||||
|
bool StreamPipeline=false;
|
||||||
|
bool StreamHash=false;
|
||||||
|
bool ProfileColumnOverlap=false;
|
||||||
|
bool ForceGenerate=false;
|
||||||
|
bool HasSeedOverride=false;
|
||||||
|
int SeedOverride=0;
|
||||||
|
bool HasRenderDistanceOverride=false;
|
||||||
|
int RenderDistanceOverride=0;
|
||||||
|
bool FloatingIslandsRecipe=false;
|
||||||
|
bool TlsProbeRequested=false;
|
||||||
|
int TlsProbeWorkers=0;
|
||||||
|
bool HasCamera=false;
|
||||||
|
FVector CameraMeters=FVector::ZeroVector;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool ParseInteger(std::string_view text,int& output)
|
||||||
|
{
|
||||||
|
if(text.empty())return false;
|
||||||
|
char* end=nullptr;
|
||||||
|
const std::string value(text);
|
||||||
|
const long parsed=std::strtol(value.c_str(),&end,10);
|
||||||
|
if(end==value.c_str()||*end!='\0'||parsed<INT32_MIN||parsed>INT32_MAX)return false;
|
||||||
|
output=static_cast<int>(parsed);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseCamera(std::string_view text,FVector& meters)
|
||||||
|
{
|
||||||
|
const std::string values(text);
|
||||||
|
float x=0.0f,y=0.0f,z=0.0f,yaw=0.0f,pitch=0.0f;
|
||||||
|
if(std::sscanf(values.c_str(),"%f,%f,%f,%f,%f",&x,&y,&z,&yaw,&pitch)!=5)
|
||||||
|
return false;
|
||||||
|
meters={x,y,z};
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseOptions(int argc,char** argv,FOptions& options)
|
||||||
|
{
|
||||||
|
const std::filesystem::path executable=std::filesystem::absolute(argv[0]);
|
||||||
|
options.DataPath=executable.parent_path().parent_path()/"data/owner_world.json";
|
||||||
|
for(int index=1;index<argc;++index)
|
||||||
|
{
|
||||||
|
const std::string_view arg(argv[index]);
|
||||||
|
const auto readInt=[&](std::string_view prefix,int& value)
|
||||||
|
{return arg.starts_with(prefix)&&ParseInteger(arg.substr(prefix.size()),value);};
|
||||||
|
if(arg=="--help"||arg=="-h")
|
||||||
|
{
|
||||||
|
std::printf("Usage: %s [owner_world.json] --world-assembler-prototype --stream-benchmark --stream-pipeline [options]\n"
|
||||||
|
" --workers=N --clip-radius=N --max-clip-level=N --max-level=N\n"
|
||||||
|
" --camera=X,Y,Z,YAW,PITCH (position in metres) --stream-hash\n"
|
||||||
|
" --profile-column-overlap --far-horizon-lod8-step=N --force-generate\n"
|
||||||
|
" --seed=N --recipe=surface-world|floating-islands\n"
|
||||||
|
" --render-distance-chunks=N (0 disables the extra far ring)\n"
|
||||||
|
" --tls-probe=N (Linux worker TLS/stack measurement; N=0..12)\n"
|
||||||
|
" --process-affinity=MASK --process-priority=Normal --frame-limit=FPS (viewer compatibility only)\n",
|
||||||
|
argv[0]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(arg=="--world-assembler-prototype")options.WorldAssemblerPrototype=true;
|
||||||
|
else if(arg=="--stream-benchmark")options.StreamBenchmark=true;
|
||||||
|
else if(arg=="--stream-pipeline")options.StreamPipeline=true;
|
||||||
|
else if(arg=="--stream-hash")options.StreamHash=true;
|
||||||
|
else if(arg=="--profile-column-overlap")options.ProfileColumnOverlap=true;
|
||||||
|
else if(arg=="--force-generate")options.ForceGenerate=true;
|
||||||
|
else if(arg.starts_with("--recipe="))
|
||||||
|
{
|
||||||
|
const std::string_view recipe=arg.substr(std::string_view("--recipe=").size());
|
||||||
|
if(recipe=="surface-world")options.FloatingIslandsRecipe=false;
|
||||||
|
else if(recipe=="floating-islands")options.FloatingIslandsRecipe=true;
|
||||||
|
else {std::fprintf(stderr,"Invalid --recipe value: %.*s\n",static_cast<int>(recipe.size()),recipe.data());return false;}
|
||||||
|
}
|
||||||
|
else if(arg.starts_with("--seed="))
|
||||||
|
{if(!readInt("--seed=",options.SeedOverride))return false;options.HasSeedOverride=true;}
|
||||||
|
else if(arg.starts_with("--render-distance-chunks="))
|
||||||
|
{
|
||||||
|
if(!readInt("--render-distance-chunks=",options.RenderDistanceOverride))return false;
|
||||||
|
options.RenderDistanceOverride=std::max(0,options.RenderDistanceOverride);
|
||||||
|
options.HasRenderDistanceOverride=true;
|
||||||
|
}
|
||||||
|
else if(arg.starts_with("--tls-probe="))
|
||||||
|
{
|
||||||
|
if(!readInt("--tls-probe=",options.TlsProbeWorkers))return false;
|
||||||
|
if(options.TlsProbeWorkers<0||options.TlsProbeWorkers>12)
|
||||||
|
{std::fprintf(stderr,"--tls-probe must be in 0..12\n");return false;}
|
||||||
|
options.TlsProbeRequested=true;
|
||||||
|
}
|
||||||
|
else if(arg.starts_with("--camera="))
|
||||||
|
{
|
||||||
|
if(!ParseCamera(arg.substr(9),options.CameraMeters))
|
||||||
|
{std::fprintf(stderr,"Invalid --camera value: %.*s\n",static_cast<int>(arg.size()),arg.data());return false;}
|
||||||
|
options.HasCamera=true;
|
||||||
|
}
|
||||||
|
else if(arg.starts_with("--workers="))
|
||||||
|
{if(!readInt("--workers=",options.WorkerCount))return false;}
|
||||||
|
else if(arg.starts_with("--clip-radius="))
|
||||||
|
{if(!readInt("--clip-radius=",options.ClipRadius))return false;}
|
||||||
|
else if(arg.starts_with("--max-clip-level="))
|
||||||
|
{if(!readInt("--max-clip-level=",options.MaxClipLevel))return false;}
|
||||||
|
else if(arg.starts_with("--max-level="))
|
||||||
|
{if(!readInt("--max-level=",options.MaxLevel))return false;}
|
||||||
|
else if(arg.starts_with("--far-horizon-lod8-step="))
|
||||||
|
{if(!readInt("--far-horizon-lod8-step=",options.FarHorizonLOD8InteriorStepVoxels))return false;}
|
||||||
|
else if(arg.starts_with("--process-affinity=")||arg.starts_with("--process-priority=")
|
||||||
|
||arg.starts_with("--frame-limit="))
|
||||||
|
{
|
||||||
|
// These viewer switches are accepted for command-line parity. The caller pins
|
||||||
|
// this headless process with taskset, and a headless run has no frame limiter.
|
||||||
|
}
|
||||||
|
else if(!arg.empty()&&arg.front()!='-')options.DataPath=std::filesystem::path(arg);
|
||||||
|
else
|
||||||
|
{std::fprintf(stderr,"Unknown option: %.*s\n",static_cast<int>(arg.size()),arg.data());return false;}
|
||||||
|
}
|
||||||
|
options.WorkerCount=std::clamp(options.WorkerCount,1,16);
|
||||||
|
options.ClipRadius=std::clamp(options.ClipRadius,1,64);
|
||||||
|
options.MaxClipLevel=std::clamp(options.MaxClipLevel,0,8);
|
||||||
|
options.FarHorizonLOD8InteriorStepVoxels=std::max(0,options.FarHorizonLOD8InteriorStepVoxels);
|
||||||
|
if(options.TlsProbeRequested)return true;
|
||||||
|
if(!options.WorldAssemblerPrototype||!options.StreamBenchmark||!options.StreamPipeline)
|
||||||
|
{
|
||||||
|
std::fprintf(stderr,"This headless target runs the world-assembler streaming pipeline; pass --world-assembler-prototype --stream-benchmark --stream-pipeline.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc,char** argv)
|
||||||
|
{
|
||||||
|
using Clock=std::chrono::steady_clock;
|
||||||
|
const auto coldStart=Clock::now();
|
||||||
|
FOptions options;
|
||||||
|
if(!ParseOptions(argc,argv,options))return 2;
|
||||||
|
if(options.TlsProbeRequested)return StandaloneTlsProbe::Run(options.TlsProbeWorkers);
|
||||||
|
std::printf("[HeadlessConfig] data=%s workers=%d clip_radius=%d max_clip_level=%d max_level=%d hash=%s column_overlap=%s force_generate=%s recipe=%s seed_override=%s render_distance_override=%s\n",
|
||||||
|
options.DataPath.string().c_str(),options.WorkerCount,options.ClipRadius,options.MaxClipLevel,
|
||||||
|
options.MaxLevel,options.StreamHash?"on":"off",options.ProfileColumnOverlap?"on":"off",
|
||||||
|
options.ForceGenerate?"on":"off",options.FloatingIslandsRecipe?"floating-islands":"surface-world",
|
||||||
|
options.HasSeedOverride?"yes":"no",options.HasRenderDistanceOverride?"yes":"no");
|
||||||
|
std::printf("[ColdTimeline] stage=owner_data_load begin_ms=%.3f\n",
|
||||||
|
std::chrono::duration<double,std::milli>(Clock::now()-coldStart).count());
|
||||||
|
|
||||||
|
std::string error;
|
||||||
|
auto ownerWorld=std::make_shared<FStandaloneOwnerWorld>();
|
||||||
|
VFJson::Value ownerJsonRoot;
|
||||||
|
{
|
||||||
|
std::ifstream jsonFile(options.DataPath,std::ios::binary);
|
||||||
|
if(!jsonFile)
|
||||||
|
{std::fprintf(stderr,"Owner data load failed: cannot open %s\n",options.DataPath.string().c_str());return 2;}
|
||||||
|
std::string ownerJsonText{std::istreambuf_iterator<char>(jsonFile),std::istreambuf_iterator<char>{}};
|
||||||
|
if(!jsonFile&&!jsonFile.eof())
|
||||||
|
{std::fprintf(stderr,"Owner data load failed: read error for %s\n",options.DataPath.string().c_str());return 2;}
|
||||||
|
if(!VFJson::Parser(std::move(ownerJsonText)).Parse(ownerJsonRoot,error))
|
||||||
|
{std::fprintf(stderr,"Owner data load failed: %s\n",error.c_str());return 2;}
|
||||||
|
}
|
||||||
|
if(options.HasSeedOverride
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::OverrideStandaloneSeed(ownerJsonRoot,options.SeedOverride,error))
|
||||||
|
{std::fprintf(stderr,"Seed override failed: %s\n",error.c_str());return 2;}
|
||||||
|
if(options.HasRenderDistanceOverride
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::OverrideStandaloneRenderDistance(
|
||||||
|
ownerJsonRoot,options.RenderDistanceOverride,error))
|
||||||
|
{std::fprintf(stderr,"Render-distance override failed: %s\n",error.c_str());return 2;}
|
||||||
|
if(options.FloatingIslandsRecipe
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::SelectTopStrateAsFloatingIslands(ownerJsonRoot,error))
|
||||||
|
{std::fprintf(stderr,"Floating-island recipe selection failed: %s\n",error.c_str());return 2;}
|
||||||
|
if(!StandaloneOwnerLoader::Resolve(ownerJsonRoot,*ownerWorld,error))
|
||||||
|
{std::fprintf(stderr,"Owner data load failed: %s\n",error.c_str());return 2;}
|
||||||
|
std::printf("[ColdTimeline] stage=owner_data_load end_ms=%.3f\n",
|
||||||
|
std::chrono::duration<double,std::milli>(Clock::now()-coldStart).count());
|
||||||
|
|
||||||
|
const int seed=ownerWorld->Seed;
|
||||||
|
const int exportedMaxClipLevel=ownerWorld->MaxClipLevel;
|
||||||
|
ownerWorld->ClipRadius=options.ClipRadius;
|
||||||
|
ownerWorld->Settings->ClipRadius=options.ClipRadius;
|
||||||
|
ownerWorld->MaxClipLevel=options.MaxClipLevel;
|
||||||
|
ownerWorld->Settings->MaxClipLevel=options.MaxClipLevel;
|
||||||
|
if(exportedMaxClipLevel!=options.MaxClipLevel)
|
||||||
|
std::printf("Standalone max clip level override: exported=%d -> max_level=%d.\n",
|
||||||
|
exportedMaxClipLevel,options.MaxClipLevel);
|
||||||
|
|
||||||
|
FVector cameraVoxels=ownerWorld->ViewerStartVoxels;
|
||||||
|
if(options.HasCamera)
|
||||||
|
cameraVoxels=FVector(options.CameraMeters.X*4.0f,options.CameraMeters.Y*4.0f,options.CameraMeters.Z*4.0f);
|
||||||
|
|
||||||
|
const auto planStart=Clock::now();
|
||||||
|
VoxelForgeCore::WorldAssemblyManifest worldAssembly;
|
||||||
|
if(!StandaloneWorldAssemblyPrototype::AttachRound1WorldAssemblyPrototype(
|
||||||
|
*ownerWorld,ownerJsonRoot,error,{},&worldAssembly))
|
||||||
|
{std::fprintf(stderr,"World assembler prototype setup failed: %s\n",error.c_str());return 2;}
|
||||||
|
if(options.FloatingIslandsRecipe
|
||||||
|
&&!StandaloneWorldAssemblyPrototype::AttachFloatingIslandWorldAssembly(
|
||||||
|
*ownerWorld,ownerJsonRoot,worldAssembly,error))
|
||||||
|
{std::fprintf(stderr,"Floating-island assembly setup failed: %s\n",error.c_str());return 2;}
|
||||||
|
std::printf("[WorldAssemblerPlanTiming] total_ms=%.3f status=PASS\n",
|
||||||
|
std::chrono::duration<double,std::milli>(Clock::now()-planStart).count());
|
||||||
|
|
||||||
|
auto snapshot=VoxelForgeCore::MakeStandaloneSnapshotFromParsedJson(ownerJsonRoot,seed,
|
||||||
|
options.ClipRadius,options.MaxClipLevel,false,false,error);
|
||||||
|
if(!snapshot)
|
||||||
|
{std::fprintf(stderr,"Shape interval build failed: %s\n",error.c_str());return 2;}
|
||||||
|
|
||||||
|
FStandaloneCoreScheduler scheduler;
|
||||||
|
return StandaloneStreamBenchmark::RunPipelinedStreamingBenchmark(ownerWorld,snapshot,
|
||||||
|
cameraVoxels,options.WorkerCount,options.MaxLevel,VoxelForgeCore::DetailVariant::coherent,
|
||||||
|
scheduler,options.StreamHash,false,false,false,false,coldStart,
|
||||||
|
options.ProfileColumnOverlap,options.FarHorizonLOD8InteriorStepVoxels);
|
||||||
|
}
|
||||||
@@ -0,0 +1,390 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "OwnerWorldLoader.h"
|
||||||
|
#include "StreamingWorld.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <limits>
|
||||||
|
#include <thread>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace StandaloneStreamBenchmark
|
||||||
|
{
|
||||||
|
inline void HashWord(uint64& Hash,uint64 Word,int32 Bytes=8)
|
||||||
|
{
|
||||||
|
for(int32 I=0;I<Bytes;++I)
|
||||||
|
{
|
||||||
|
Hash^=static_cast<uint8>(Word>>(I*8));
|
||||||
|
Hash*=1099511628211ull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FHashedTile
|
||||||
|
{
|
||||||
|
FVoxelTileKey Key;
|
||||||
|
uint64 Hash=14695981039346656037ull;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool TileKeyLessForHash(const FVoxelTileKey& A,const FVoxelTileKey& B)
|
||||||
|
{
|
||||||
|
if(A.Level!=B.Level)return A.Level<B.Level;
|
||||||
|
if(A.Coord.Z!=B.Coord.Z)return A.Coord.Z<B.Coord.Z;
|
||||||
|
if(A.Coord.Y!=B.Coord.Y)return A.Coord.Y<B.Coord.Y;
|
||||||
|
return A.Coord.X<B.Coord.X;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint64 HashTileRows(std::vector<FHashedTile>& Rows)
|
||||||
|
{
|
||||||
|
std::sort(Rows.begin(),Rows.end(),[](const FHashedTile& A,const FHashedTile& B)
|
||||||
|
{return TileKeyLessForHash(A.Key,B.Key);});
|
||||||
|
uint64 Hash=14695981039346656037ull;
|
||||||
|
for(const FHashedTile& Row:Rows)
|
||||||
|
{
|
||||||
|
HashWord(Hash,static_cast<uint32>(Row.Key.Level),4);
|
||||||
|
HashWord(Hash,static_cast<uint32>(Row.Key.Coord.X),4);
|
||||||
|
HashWord(Hash,static_cast<uint32>(Row.Key.Coord.Y),4);
|
||||||
|
HashWord(Hash,static_cast<uint32>(Row.Key.Coord.Z),4);
|
||||||
|
HashWord(Hash,Row.Hash);
|
||||||
|
}
|
||||||
|
return Hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int RunPipelinedStreamingBenchmark(std::shared_ptr<FStandaloneOwnerWorld> OwnerWorld,
|
||||||
|
const VoxelForgeCore::ResolvedWorldSnapshot& CoreSnapshot,
|
||||||
|
const FVector& CameraPositionVoxels,int32 WorkerCount,int32 MaxLevel,
|
||||||
|
VoxelForgeCore::DetailVariant DetailVariant,const VoxelForgeCore::JobScheduler& Scheduler,
|
||||||
|
bool bHashDensity,bool bSkipUvAndColors,bool bSkipMaterialGroups,bool bSkipUV,bool bSkipColors,
|
||||||
|
std::chrono::steady_clock::time_point ColdStart,bool bProfileColumnOverlap,
|
||||||
|
int32 FarHorizonLOD8InteriorStepVoxels)
|
||||||
|
{
|
||||||
|
using Clock=std::chrono::steady_clock;
|
||||||
|
FStandaloneOwnerWorld& World=*OwnerWorld;
|
||||||
|
const bool bRoundTunnels=World.Generator->bStandaloneResearchRoundTunnels;
|
||||||
|
const bool bEnhancedTunnelWalls=World.Generator->bStandaloneResearchEnhancedWalls;
|
||||||
|
VoxelForgeCore::World Shape(CoreSnapshot);
|
||||||
|
FStandaloneDesiredTileSet Desired=StandaloneWorldMesher::BuildDesiredSet(World,CameraPositionVoxels);
|
||||||
|
const auto CoreTiles=Shape.desiredTiles(
|
||||||
|
{CameraPositionVoxels.X,CameraPositionVoxels.Y,CameraPositionVoxels.Z});
|
||||||
|
Desired.Tiles.clear();Desired.Tiles.reserve(CoreTiles.size());
|
||||||
|
for(const auto& Key:CoreTiles)
|
||||||
|
Desired.Tiles.emplace_back(FIntVector(Key.coordinate.x,Key.coordinate.y,Key.coordinate.z),Key.lod);
|
||||||
|
if(MaxLevel>=0)
|
||||||
|
Desired.Tiles.erase(std::remove_if(Desired.Tiles.begin(),Desired.Tiles.end(),
|
||||||
|
[&](const FVoxelTileKey& Tile){return Tile.Level>MaxLevel;}),Desired.Tiles.end());
|
||||||
|
if(!Desired.Tiles.empty())
|
||||||
|
{
|
||||||
|
FIntVector volumeMin(INT32_MAX,INT32_MAX,INT32_MAX);
|
||||||
|
FIntVector volumeMax(INT32_MIN,INT32_MIN,INT32_MIN);
|
||||||
|
int32 minimumLod=INT32_MAX,maximumLod=INT32_MIN;
|
||||||
|
for(const FVoxelTileKey& tile:Desired.Tiles)
|
||||||
|
{
|
||||||
|
const FIntVector origin=tile.OriginVoxels();
|
||||||
|
const int32 extent=tile.ExtentVoxels();
|
||||||
|
volumeMin.X=std::min(volumeMin.X,origin.X);
|
||||||
|
volumeMin.Y=std::min(volumeMin.Y,origin.Y);
|
||||||
|
volumeMin.Z=std::min(volumeMin.Z,origin.Z);
|
||||||
|
volumeMax.X=std::max(volumeMax.X,origin.X+extent);
|
||||||
|
volumeMax.Y=std::max(volumeMax.Y,origin.Y+extent);
|
||||||
|
volumeMax.Z=std::max(volumeMax.Z,origin.Z+extent);
|
||||||
|
minimumLod=std::min(minimumLod,tile.Level);
|
||||||
|
maximumLod=std::max(maximumLod,tile.Level);
|
||||||
|
}
|
||||||
|
std::printf("[PipelineVolume] tiles=%zu lod=%d..%d min_voxel=(%d,%d,%d) max_voxel=(%d,%d,%d)\n",
|
||||||
|
Desired.Tiles.size(),minimumLod,maximumLod,volumeMin.X,volumeMin.Y,volumeMin.Z,
|
||||||
|
volumeMax.X,volumeMax.Y,volumeMax.Z);
|
||||||
|
}
|
||||||
|
FIntVector FineMin(INT32_MAX,INT32_MAX,INT32_MAX),FineMax(INT32_MIN,INT32_MIN,INT32_MIN);
|
||||||
|
FIntVector ClipMin(INT32_MAX,INT32_MAX,INT32_MAX),ClipMax(INT32_MIN,INT32_MIN,INT32_MIN);
|
||||||
|
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
||||||
|
{
|
||||||
|
const FIntVector Origin=Tile.OriginVoxels();const int32 Extent=Tile.ExtentVoxels();
|
||||||
|
ClipMin.X=std::min(ClipMin.X,Origin.X);ClipMin.Y=std::min(ClipMin.Y,Origin.Y);ClipMin.Z=std::min(ClipMin.Z,Origin.Z);
|
||||||
|
ClipMax.X=std::max(ClipMax.X,Origin.X+Extent);ClipMax.Y=std::max(ClipMax.Y,Origin.Y+Extent);ClipMax.Z=std::max(ClipMax.Z,Origin.Z+Extent);
|
||||||
|
if(Tile.Level<World.FullResClipLevels)
|
||||||
|
{
|
||||||
|
FineMin.X=std::min(FineMin.X,Origin.X);FineMin.Y=std::min(FineMin.Y,Origin.Y);FineMin.Z=std::min(FineMin.Z,Origin.Z);
|
||||||
|
FineMax.X=std::max(FineMax.X,Origin.X+Extent);FineMax.Y=std::max(FineMax.Y,Origin.Y+Extent);FineMax.Z=std::max(FineMax.Z,Origin.Z+Extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(FineMin.X==INT32_MAX||ClipMin.X==INT32_MAX)
|
||||||
|
{std::fprintf(stderr,"[StreamPipeline] no desired detail or clipmap tiles.\n");return 7;}
|
||||||
|
|
||||||
|
const FIntVector CenterChunk=Desired.CenterChunk;
|
||||||
|
std::unordered_set<FVoxelTileKey,FStandaloneTileKeyHash> Neighborhood;
|
||||||
|
Neighborhood.reserve(32);
|
||||||
|
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
||||||
|
if(Tile.Level==0&&std::abs(Tile.Coord.X-CenterChunk.X)<=1
|
||||||
|
&&std::abs(Tile.Coord.Y-CenterChunk.Y)<=1&&std::abs(Tile.Coord.Z-CenterChunk.Z)<=1)
|
||||||
|
Neighborhood.insert(Tile);
|
||||||
|
if(Neighborhood.size()!=27)
|
||||||
|
{std::fprintf(stderr,"[StreamPipeline] expected 27 player-neighborhood tiles, found %zu.\n",Neighborhood.size());return 7;}
|
||||||
|
|
||||||
|
// The initial desired set now owns all clipmap metadata needed by this Core-only run.
|
||||||
|
// Release the separate compatibility-world generation graph before compiling Core.
|
||||||
|
World.Generator.reset();
|
||||||
|
World.Manager.reset();
|
||||||
|
World.DefinitionStorage.clear();
|
||||||
|
World.BiomeStorage.clear();
|
||||||
|
World.OperationStorage.clear();
|
||||||
|
World.DensitySamples.clear();
|
||||||
|
|
||||||
|
std::string BuildError;
|
||||||
|
const bool bIncludeFarWorld=MaxLevel<0||MaxLevel>=World.FullResClipLevels;
|
||||||
|
const auto ShapeBuildStart=Clock::now();
|
||||||
|
VoxelForgeCore::ShapeBuildRequest ShapeRequest;
|
||||||
|
ShapeRequest.minVoxel={FineMin.X,FineMin.Y,FineMin.Z};
|
||||||
|
ShapeRequest.maxVoxel={FineMax.X,FineMax.Y,FineMax.Z};
|
||||||
|
ShapeRequest.clipMinVoxel={ClipMin.X,ClipMin.Y,ClipMin.Z};
|
||||||
|
ShapeRequest.clipMaxVoxel={ClipMax.X,ClipMax.Y,ClipMax.Z};
|
||||||
|
ShapeRequest.workerLimit=static_cast<uint32>(std::clamp(WorkerCount,1,16));
|
||||||
|
ShapeRequest.detail=DetailVariant;ShapeRequest.includeFarWorld=bIncludeFarWorld;
|
||||||
|
ShapeRequest.roundTunnels=bRoundTunnels;
|
||||||
|
ShapeRequest.enhancedTunnelWalls=bEnhancedTunnelWalls;
|
||||||
|
if(!Shape.compile(ShapeRequest,Scheduler,BuildError))
|
||||||
|
{std::fprintf(stderr,"[StreamPipeline] full shape build failed: %s\n",BuildError.c_str());return 2;}
|
||||||
|
const auto ShapeReady=Clock::now();
|
||||||
|
const double ShapeSeconds=std::chrono::duration<double>(ShapeReady-ShapeBuildStart).count();
|
||||||
|
FStandaloneStreamingGenerator Streamer(World,WorkerCount,bHashDensity,nullptr,MaxLevel,
|
||||||
|
bSkipUvAndColors,bSkipMaterialGroups,bSkipUV,bSkipColors,&Shape,bProfileColumnOverlap,
|
||||||
|
FarHorizonLOD8InteriorStepVoxels);
|
||||||
|
const auto StreamStart=Clock::now();
|
||||||
|
const FStandaloneStreamingUpdate Update=Streamer.StartWithDesired(Desired);
|
||||||
|
if(Update.DesiredTiles!=static_cast<int32>(Desired.Tiles.size()))
|
||||||
|
{
|
||||||
|
Streamer.Stop();
|
||||||
|
std::fprintf(stderr,"[StreamPipeline] expected %zu tiles but queued %d.\n",
|
||||||
|
Desired.Tiles.size(),Update.DesiredTiles);return 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<FHashedTile> DensityRows,MeshRows,PayloadRows,TopologyRows;
|
||||||
|
int32 Finished=0,NeighborhoodFinished=0,FullDetailFinished=0;
|
||||||
|
int32 FullDetailExpected=0;
|
||||||
|
struct FColumnXY
|
||||||
|
{
|
||||||
|
std::int64_t X=0,Y=0;
|
||||||
|
bool operator==(const FColumnXY&)const=default;
|
||||||
|
};
|
||||||
|
struct FColumnXYHash
|
||||||
|
{
|
||||||
|
std::size_t operator()(const FColumnXY& Value)const noexcept
|
||||||
|
{
|
||||||
|
const std::size_t X=std::hash<std::int64_t>{}(Value.X);
|
||||||
|
const std::size_t Y=std::hash<std::int64_t>{}(Value.Y);
|
||||||
|
return X^(Y+static_cast<std::size_t>(0x9E3779B9u)+(X<<6)+(X>>2));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
struct FFirstColumnUse
|
||||||
|
{
|
||||||
|
FVoxelTileKey Tile;
|
||||||
|
std::uint64_t WorkerHash=0;
|
||||||
|
};
|
||||||
|
std::array<std::unordered_map<FColumnXY,std::vector<FFirstColumnUse>,FColumnXYHash>,9> ColumnUsesByLOD;
|
||||||
|
std::array<std::uint64_t,9> ColumnDuplicateEventsByLOD{},NeighbourDuplicateEventsByLOD{};
|
||||||
|
std::array<std::uint64_t,9> CrossWorkerNeighbourDuplicateEventsByLOD{};
|
||||||
|
std::array<std::uint64_t,9> ColumnCaptureTilesByLOD{},ExpectedTilesByLOD{};
|
||||||
|
std::array<bool,9> ColumnCaptureCompleteByLOD{};
|
||||||
|
ColumnCaptureCompleteByLOD.fill(true);
|
||||||
|
std::array<double,9> WorkerSecondsByLOD{};
|
||||||
|
std::array<double,9> ColumnEvalMsByLOD{},MarchingExclusiveMsByLOD{};
|
||||||
|
std::array<double,9> GroundRefineExclusiveMsByLOD{},CapRefineExclusiveMsByLOD{};
|
||||||
|
std::array<double,9> MeshAssemblyMsByLOD{};
|
||||||
|
std::array<std::uint64_t,9> TileCountByLOD{};
|
||||||
|
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
||||||
|
if(Tile.Level>=0&&Tile.Level<static_cast<int32>(ExpectedTilesByLOD.size()))
|
||||||
|
++ExpectedTilesByLOD[static_cast<std::size_t>(Tile.Level)];
|
||||||
|
const auto AreSameLODNeighbours=[](const FVoxelTileKey& A,const FVoxelTileKey& B)
|
||||||
|
{
|
||||||
|
if(A.Level!=B.Level)return false;
|
||||||
|
const std::int64_t DX=std::abs(static_cast<std::int64_t>(A.Coord.X)-B.Coord.X);
|
||||||
|
const std::int64_t DY=std::abs(static_cast<std::int64_t>(A.Coord.Y)-B.Coord.Y);
|
||||||
|
const std::int64_t DZ=std::abs(static_cast<std::int64_t>(A.Coord.Z)-B.Coord.Z);
|
||||||
|
return std::max({DX,DY,DZ})<=1&&(DX+DY+DZ)>0;
|
||||||
|
};
|
||||||
|
uint64 NativeSolidBoxes=0,NativeAirBoxes=0,NativeMixedBoxes=0,NativeUnknownBoxes=0;
|
||||||
|
uint64 NativeFieldCalls=0,NativeColumnHits=0,NativeColumnMisses=0,NativeMeshingSkips=0;
|
||||||
|
double NativeClassificationMilliseconds=0.0,NativeColumnComputeMilliseconds=0.0;
|
||||||
|
double NativeMeshingMilliseconds=0.0;
|
||||||
|
for(const FVoxelTileKey& Tile:Desired.Tiles)
|
||||||
|
if(Tile.Level<World.FullResClipLevels)++FullDetailExpected;
|
||||||
|
Clock::time_point NeighborhoodReady{},FullDetailReady{},WholeViewReady{};
|
||||||
|
bool bNeighborhoodReported=false,bFullDetailReported=false;
|
||||||
|
while(Finished<Update.DesiredTiles)
|
||||||
|
{
|
||||||
|
std::vector<FStandaloneCpuTile> Ready=Streamer.TakeReady();
|
||||||
|
if(Ready.empty()){std::this_thread::sleep_for(std::chrono::milliseconds(1));continue;}
|
||||||
|
for(const FStandaloneCpuTile& Tile:Ready)
|
||||||
|
{
|
||||||
|
++Finished;
|
||||||
|
if(Tile.Key.Level>=0&&Tile.Key.Level<static_cast<int32>(TileCountByLOD.size()))
|
||||||
|
{
|
||||||
|
const std::size_t LOD=static_cast<std::size_t>(Tile.Key.Level);
|
||||||
|
++TileCountByLOD[LOD];
|
||||||
|
WorkerSecondsByLOD[LOD]+=Tile.WorkerSeconds;
|
||||||
|
ColumnEvalMsByLOD[LOD]+=Tile.CoreDiagnostics.columnEvaluationExclusiveMilliseconds;
|
||||||
|
MarchingExclusiveMsByLOD[LOD]+=Tile.CoreDiagnostics.marchingCubesExclusiveMilliseconds;
|
||||||
|
GroundRefineExclusiveMsByLOD[LOD]+=Tile.CoreDiagnostics.groundRefinementExclusiveMilliseconds;
|
||||||
|
CapRefineExclusiveMsByLOD[LOD]+=Tile.CoreDiagnostics.capRefinementExclusiveMilliseconds;
|
||||||
|
MeshAssemblyMsByLOD[LOD]+=Tile.CoreDiagnostics.meshAssemblyMilliseconds;
|
||||||
|
}
|
||||||
|
if(bProfileColumnOverlap&&Tile.Key.Level>=0
|
||||||
|
&&Tile.Key.Level<static_cast<int32>(ColumnCaptureTilesByLOD.size()))
|
||||||
|
{
|
||||||
|
const std::size_t LOD=static_cast<std::size_t>(Tile.Key.Level);
|
||||||
|
++ColumnCaptureTilesByLOD[LOD];
|
||||||
|
ColumnCaptureCompleteByLOD[LOD]=ColumnCaptureCompleteByLOD[LOD]
|
||||||
|
&&Tile.CoreDiagnostics.columnCoordinateCaptureComplete;
|
||||||
|
std::vector<std::array<std::int64_t,2>> Coordinates=
|
||||||
|
Tile.CoreDiagnostics.evaluatedColumnCoordinates;
|
||||||
|
std::sort(Coordinates.begin(),Coordinates.end());
|
||||||
|
Coordinates.erase(std::unique(Coordinates.begin(),Coordinates.end()),Coordinates.end());
|
||||||
|
for(const auto& Coordinate:Coordinates)
|
||||||
|
{
|
||||||
|
const FColumnXY XY{Coordinate[0],Coordinate[1]};
|
||||||
|
auto [Uses,Inserted]=ColumnUsesByLOD[LOD].try_emplace(XY);
|
||||||
|
std::vector<FFirstColumnUse>& PriorUses=Uses->second;
|
||||||
|
if(Inserted)
|
||||||
|
{
|
||||||
|
PriorUses.push_back({Tile.Key,Tile.CoreDiagnostics.columnEvaluationWorkerHash});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
++ColumnDuplicateEventsByLOD[LOD];
|
||||||
|
bool bHasNeighbourDuplicate=false,bHasCrossWorkerNeighbourDuplicate=false;
|
||||||
|
for(const FFirstColumnUse& Prior:PriorUses)
|
||||||
|
{
|
||||||
|
if(!AreSameLODNeighbours(Prior.Tile,Tile.Key))continue;
|
||||||
|
bHasNeighbourDuplicate=true;
|
||||||
|
bHasCrossWorkerNeighbourDuplicate=bHasCrossWorkerNeighbourDuplicate
|
||||||
|
||Prior.WorkerHash!=Tile.CoreDiagnostics.columnEvaluationWorkerHash;
|
||||||
|
}
|
||||||
|
if(bHasNeighbourDuplicate)++NeighbourDuplicateEventsByLOD[LOD];
|
||||||
|
if(bHasCrossWorkerNeighbourDuplicate)
|
||||||
|
++CrossWorkerNeighbourDuplicateEventsByLOD[LOD];
|
||||||
|
PriorUses.push_back({Tile.Key,Tile.CoreDiagnostics.columnEvaluationWorkerHash});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WholeViewReady=std::max(WholeViewReady,Tile.CompletedAt);
|
||||||
|
if(Neighborhood.contains(Tile.Key))
|
||||||
|
{
|
||||||
|
++NeighborhoodFinished;
|
||||||
|
NeighborhoodReady=std::max(NeighborhoodReady,Tile.CompletedAt);
|
||||||
|
}
|
||||||
|
if(Tile.Key.Level<World.FullResClipLevels)
|
||||||
|
{
|
||||||
|
++FullDetailFinished;
|
||||||
|
FullDetailReady=std::max(FullDetailReady,Tile.CompletedAt);
|
||||||
|
NativeSolidBoxes+=Tile.CoreDiagnostics.solidBoxes;
|
||||||
|
NativeAirBoxes+=Tile.CoreDiagnostics.airBoxes;
|
||||||
|
NativeMixedBoxes+=Tile.CoreDiagnostics.mixedBoxes;
|
||||||
|
NativeUnknownBoxes+=Tile.CoreDiagnostics.unknownBoxes;
|
||||||
|
NativeFieldCalls+=Tile.CoreDiagnostics.fieldCalls;
|
||||||
|
NativeColumnHits+=Tile.CoreDiagnostics.columnCacheHits;
|
||||||
|
NativeColumnMisses+=Tile.CoreDiagnostics.columnCacheMisses;
|
||||||
|
NativeMeshingSkips+=Tile.CoreDiagnostics.meshingSkipped?1u:0u;
|
||||||
|
NativeClassificationMilliseconds+=Tile.CoreDiagnostics.classificationMilliseconds;
|
||||||
|
NativeColumnComputeMilliseconds+=Tile.CoreDiagnostics.columnComputeMilliseconds;
|
||||||
|
NativeMeshingMilliseconds+=Tile.CoreDiagnostics.meshingMilliseconds;
|
||||||
|
}
|
||||||
|
if(bHashDensity)
|
||||||
|
{
|
||||||
|
if(Tile.bHasDensityHash)DensityRows.push_back({Tile.Key,Tile.DensityHash});
|
||||||
|
if(Tile.bHasMeshHash)MeshRows.push_back({Tile.Key,Tile.MeshHash});
|
||||||
|
if(Tile.bHasPayloadHash)PayloadRows.push_back({Tile.Key,Tile.PayloadHash});
|
||||||
|
if(Tile.bHasTopologyHash)TopologyRows.push_back({Tile.Key,Tile.TopologyHash});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!bNeighborhoodReported&&NeighborhoodFinished==static_cast<int32>(Neighborhood.size()))
|
||||||
|
{
|
||||||
|
std::printf("[PipelineMilestone] neighborhood_ready=%.3fs generated=%d/27\n",
|
||||||
|
std::chrono::duration<double>(NeighborhoodReady-ColdStart).count(),NeighborhoodFinished);
|
||||||
|
bNeighborhoodReported=true;
|
||||||
|
}
|
||||||
|
if(!bFullDetailReported&&FullDetailFinished==FullDetailExpected)
|
||||||
|
{
|
||||||
|
std::printf("[PipelineMilestone] full_detail_ready=%.3fs generated=%d/%d\n",
|
||||||
|
std::chrono::duration<double>(FullDetailReady-ColdStart).count(),
|
||||||
|
FullDetailFinished,FullDetailExpected);
|
||||||
|
bFullDetailReported=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Streamer.Stop();
|
||||||
|
bool bColumnOverlapCapturePassing=true;
|
||||||
|
if(bProfileColumnOverlap)
|
||||||
|
{
|
||||||
|
for(std::size_t LOD=0;LOD<ColumnCaptureTilesByLOD.size();++LOD)
|
||||||
|
{
|
||||||
|
const bool bLODComplete=ColumnCaptureCompleteByLOD[LOD]
|
||||||
|
&&ColumnCaptureTilesByLOD[LOD]==ExpectedTilesByLOD[LOD];
|
||||||
|
bColumnOverlapCapturePassing=bColumnOverlapCapturePassing&&bLODComplete;
|
||||||
|
std::printf("[WorldAssemblerLODColumnOverlap] lod=%zu tiles=%llu expected_tiles=%llu unique_xy_columns=%zu repeated_tile_evaluations=%llu neighbouring_duplicate_evaluations=%llu cross_worker_neighbouring_duplicates=%llu capture_complete=%d\n",
|
||||||
|
LOD,static_cast<unsigned long long>(ColumnCaptureTilesByLOD[LOD]),
|
||||||
|
static_cast<unsigned long long>(ExpectedTilesByLOD[LOD]),
|
||||||
|
ColumnUsesByLOD[LOD].size(),
|
||||||
|
static_cast<unsigned long long>(ColumnDuplicateEventsByLOD[LOD]),
|
||||||
|
static_cast<unsigned long long>(NeighbourDuplicateEventsByLOD[LOD]),
|
||||||
|
static_cast<unsigned long long>(CrossWorkerNeighbourDuplicateEventsByLOD[LOD]),
|
||||||
|
bLODComplete?1:0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(std::size_t LOD=0;LOD<TileCountByLOD.size();++LOD)
|
||||||
|
{
|
||||||
|
std::printf("[WorldAssemblerLODWorker] lod=%zu tiles=%llu worker_sum_s=%.6f column_eval_exclusive_ms=%.3f mc_exclusive_ms=%.3f ground_refine_exclusive_ms=%.3f cap_refine_exclusive_ms=%.3f mesh_assembly_ms=%.3f\n",
|
||||||
|
LOD,static_cast<unsigned long long>(TileCountByLOD[LOD]),WorkerSecondsByLOD[LOD],
|
||||||
|
ColumnEvalMsByLOD[LOD],MarchingExclusiveMsByLOD[LOD],
|
||||||
|
GroundRefineExclusiveMsByLOD[LOD],CapRefineExclusiveMsByLOD[LOD],MeshAssemblyMsByLOD[LOD]);
|
||||||
|
}
|
||||||
|
const double NeighborhoodSeconds=std::chrono::duration<double>(NeighborhoodReady-ColdStart).count();
|
||||||
|
const double NeighborhoodMeshSeconds=std::chrono::duration<double>(NeighborhoodReady-ShapeReady).count();
|
||||||
|
const double FullDetailSeconds=std::chrono::duration<double>(FullDetailReady-ColdStart).count();
|
||||||
|
const double WholeViewSeconds=std::chrono::duration<double>(WholeViewReady-ColdStart).count();
|
||||||
|
const double StreamSeconds=std::chrono::duration<double>(WholeViewReady-StreamStart).count();
|
||||||
|
std::printf("[StreamPipeline] workers=%d shape=%.3fs neighborhood_mesh=%.3fs neighborhood_ready=%.3fs full_detail_ready=%.3fs whole_view_ready=%.3fs neighborhood_tiles=%d/27 full_detail_tiles=%d/%d whole_tiles=%d/%zu stream_wall=%.3fs cache_hits=0 full_payload=1\n",
|
||||||
|
WorkerCount,ShapeSeconds,NeighborhoodMeshSeconds,NeighborhoodSeconds,
|
||||||
|
FullDetailSeconds,WholeViewSeconds,NeighborhoodFinished,
|
||||||
|
FullDetailFinished,FullDetailExpected,Finished,Desired.Tiles.size(),StreamSeconds);
|
||||||
|
std::printf("[WorldAssemblerTilePipeline] full_detail_tiles=%d solid_boxes=%llu air_boxes=%llu mixed_boxes=%llu unknown_boxes=%llu whole_tile_skips=%llu field_calls=%llu column_cache_hits=%llu column_cache_misses=%llu column_compute_worker_ms=%.3f classification_worker_ms=%.3f meshing_worker_ms=%.3f\n",
|
||||||
|
FullDetailExpected,static_cast<unsigned long long>(NativeSolidBoxes),
|
||||||
|
static_cast<unsigned long long>(NativeAirBoxes),
|
||||||
|
static_cast<unsigned long long>(NativeMixedBoxes),
|
||||||
|
static_cast<unsigned long long>(NativeUnknownBoxes),
|
||||||
|
static_cast<unsigned long long>(NativeMeshingSkips),
|
||||||
|
static_cast<unsigned long long>(NativeFieldCalls),
|
||||||
|
static_cast<unsigned long long>(NativeColumnHits),
|
||||||
|
static_cast<unsigned long long>(NativeColumnMisses),
|
||||||
|
NativeColumnComputeMilliseconds,NativeClassificationMilliseconds,
|
||||||
|
NativeMeshingMilliseconds);
|
||||||
|
|
||||||
|
bool bHashesPassing=true;
|
||||||
|
if(bHashDensity)
|
||||||
|
{
|
||||||
|
bHashesPassing=DensityRows.size()==Desired.Tiles.size()
|
||||||
|
&&MeshRows.size()==Desired.Tiles.size()
|
||||||
|
&&PayloadRows.size()==Desired.Tiles.size()
|
||||||
|
&&TopologyRows.size()==Desired.Tiles.size();
|
||||||
|
std::vector<FHashedTile> FullDensity,FullMesh,FullPayload,FullTopology;
|
||||||
|
for(const FHashedTile& Row:DensityRows)if(Row.Key.Level<World.FullResClipLevels)FullDensity.push_back(Row);
|
||||||
|
for(const FHashedTile& Row:MeshRows)if(Row.Key.Level<World.FullResClipLevels)FullMesh.push_back(Row);
|
||||||
|
for(const FHashedTile& Row:PayloadRows)if(Row.Key.Level<World.FullResClipLevels)FullPayload.push_back(Row);
|
||||||
|
for(const FHashedTile& Row:TopologyRows)if(Row.Key.Level<World.FullResClipLevels)FullTopology.push_back(Row);
|
||||||
|
std::printf("[PipelineFullDetailHash] tiles=%d density=0x%016llx mesh=0x%016llx payload=0x%016llx topology=0x%016llx\n",
|
||||||
|
FullDetailExpected,static_cast<unsigned long long>(HashTileRows(FullDensity)),
|
||||||
|
static_cast<unsigned long long>(HashTileRows(FullMesh)),
|
||||||
|
static_cast<unsigned long long>(HashTileRows(FullPayload)),
|
||||||
|
static_cast<unsigned long long>(HashTileRows(FullTopology)));
|
||||||
|
std::printf("[PipelineWholeViewHash] tiles=%zu density=0x%016llx mesh=0x%016llx payload=0x%016llx topology=0x%016llx\n",
|
||||||
|
Desired.Tiles.size(),static_cast<unsigned long long>(HashTileRows(DensityRows)),
|
||||||
|
static_cast<unsigned long long>(HashTileRows(MeshRows)),
|
||||||
|
static_cast<unsigned long long>(HashTileRows(PayloadRows)),
|
||||||
|
static_cast<unsigned long long>(HashTileRows(TopologyRows)));
|
||||||
|
}
|
||||||
|
return NeighborhoodFinished==static_cast<int32>(Neighborhood.size())
|
||||||
|
&&FullDetailFinished==FullDetailExpected&&Finished==Update.DesiredTiles&&bHashesPassing
|
||||||
|
&&(!bProfileColumnOverlap||bColumnOverlapCapturePassing)?0:6;
|
||||||
|
}
|
||||||
|
} // namespace StandaloneStreamBenchmark
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "WorldMesher.h"
|
#include "WorldMesher.h"
|
||||||
|
#include "StandaloneWorkerThread.h"
|
||||||
#include "VoxelForgeCore/VoxelForgeCore.h"
|
#include "VoxelForgeCore/VoxelForgeCore.h"
|
||||||
|
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
@@ -11,10 +12,12 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <limits>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@@ -509,7 +512,7 @@ public:
|
|||||||
Queue.clear();PriorityTasks.clear();
|
Queue.clear();PriorityTasks.clear();
|
||||||
}
|
}
|
||||||
Wake.notify_all();
|
Wake.notify_all();
|
||||||
for(std::thread& Worker:Workers)if(Worker.joinable())Worker.join();
|
for(FStandaloneWorkerThread& Worker:Workers)if(Worker.joinable())Worker.join();
|
||||||
Workers.clear();
|
Workers.clear();
|
||||||
std::lock_guard<std::mutex> Lock(Mutex);
|
std::lock_guard<std::mutex> Lock(Mutex);
|
||||||
Ready.clear();Outstanding.clear();Desired.clear();Running.clear();
|
Ready.clear();Outstanding.clear();Desired.clear();Running.clear();
|
||||||
@@ -797,7 +800,8 @@ private:
|
|||||||
{
|
{
|
||||||
VoxelForgeCore::TileGenerationOptions Options;
|
VoxelForgeCore::TileGenerationOptions Options;
|
||||||
Options.bandMinZVoxel=Job.BandZMin;Options.bandMaxZVoxel=Job.BandZMax;
|
Options.bandMinZVoxel=Job.BandZMin;Options.bandMaxZVoxel=Job.BandZMax;
|
||||||
Options.hashDensity=bHashDensity;Options.skipUvAndColors=bSkipUvAndColors;
|
Options.hashDensity=bHashDensity;
|
||||||
|
Options.skipUvAndColors=bSkipUvAndColors;
|
||||||
Options.skipMaterialGroups=bSkipMaterialGroups;Options.skipUv=bSkipUV;Options.skipColors=bSkipColors;
|
Options.skipMaterialGroups=bSkipMaterialGroups;Options.skipUv=bSkipUV;Options.skipColors=bSkipColors;
|
||||||
Options.captureColumnCoordinates=bCaptureColumnCoordinates;
|
Options.captureColumnCoordinates=bCaptureColumnCoordinates;
|
||||||
Options.lod8HorizonInteriorStepVoxels=Lod8HorizonInteriorStepVoxels;
|
Options.lod8HorizonInteriorStepVoxels=Lod8HorizonInteriorStepVoxels;
|
||||||
@@ -977,7 +981,7 @@ private:
|
|||||||
mutable std::mutex Mutex;
|
mutable std::mutex Mutex;
|
||||||
std::condition_variable Wake;
|
std::condition_variable Wake;
|
||||||
bool bStop=true;
|
bool bStop=true;
|
||||||
std::vector<std::thread> Workers;
|
std::vector<FStandaloneWorkerThread> Workers;
|
||||||
std::deque<std::function<void()>> PriorityTasks;
|
std::deque<std::function<void()>> PriorityTasks;
|
||||||
std::vector<FStandaloneTileJob> Queue;
|
std::vector<FStandaloneTileJob> Queue;
|
||||||
std::vector<FStandaloneCpuTile> Ready;
|
std::vector<FStandaloneCpuTile> Ready;
|
||||||
|
|||||||
@@ -0,0 +1,530 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "OwnerWorldLoader.h"
|
||||||
|
#include "VoxelForgeCore/VoxelForgeCore.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <limits>
|
||||||
|
#include <numeric>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace StandaloneWorldAssemblyPrototype
|
||||||
|
{
|
||||||
|
inline std::int64_t WorldAssemblyFixed(double voxels)
|
||||||
|
{return static_cast<std::int64_t>(std::llround(voxels*VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel));}
|
||||||
|
|
||||||
|
inline std::int64_t WorldAssemblyQ16(double value)
|
||||||
|
{return static_cast<std::int64_t>(std::llround(value*65536.0));}
|
||||||
|
|
||||||
|
inline std::int64_t WorldAssemblyWavelength(double frequency,double fallbackVoxels)
|
||||||
|
{
|
||||||
|
const double wavelength=std::isfinite(frequency)&&frequency>0.0?1.0/frequency:fallbackVoxels;
|
||||||
|
return std::max<std::int64_t>(1,WorldAssemblyFixed(wavelength));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint64 WorldAssemblyFeatureId(uint32 seed,int64 x,int64 y,uint32 kind)
|
||||||
|
{
|
||||||
|
uint64 hash=14695981039346656037ull;
|
||||||
|
const auto add=[&](uint64 value,int bytes)
|
||||||
|
{
|
||||||
|
for(int i=0;i<bytes;++i){hash^=static_cast<uint8>(value>>(8*i));hash*=1099511628211ull;}
|
||||||
|
};
|
||||||
|
add(seed,4);add(static_cast<uint64>(x),8);add(static_cast<uint64>(y),8);add(kind,4);
|
||||||
|
return hash?hash:1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool BuildFiniteStrateRoute(VoxelForgeCore::WorldAssemblyRecipeV1& recipe,
|
||||||
|
VoxelForgeCore::WorldAssemblyStratumPlanV1& stratum,std::uint64_t& tested,
|
||||||
|
std::uint64_t& gradeRejected,std::uint64_t& sweepRejected,std::string& error)
|
||||||
|
{
|
||||||
|
using namespace VoxelForgeCore;
|
||||||
|
constexpr std::int64_t PlayerRadiusQ=348; // 0.34 m in Core's 0.25 m voxel scale.
|
||||||
|
constexpr std::int64_t PlayerHeightQ=1802; // 1.76 m in Core's 0.25 m voxel scale.
|
||||||
|
constexpr std::int64_t HalfHeightQ=PlayerHeightQ/2;
|
||||||
|
constexpr std::int64_t StepQ=128; // 0.5 Core voxel, finer than the density lattice.
|
||||||
|
constexpr std::int64_t ProbeRadiusQ=174;
|
||||||
|
constexpr std::int64_t SupportDepthQ=256;
|
||||||
|
constexpr std::int64_t GradeQ16=17560; // tan(15 degrees), rounded upward.
|
||||||
|
constexpr std::int64_t RouteRadiusQ=4*WorldAssemblySubvoxelsPerVoxel;
|
||||||
|
struct Direction {std::int32_t x,y;};
|
||||||
|
constexpr std::array<Direction,8> directions{{
|
||||||
|
{65536,0},{46341,46341},{0,65536},{-46341,46341},
|
||||||
|
{-65536,0},{-46341,-46341},{0,-65536},{46341,-46341}}};
|
||||||
|
struct Candidate
|
||||||
|
{
|
||||||
|
std::int64_t score=0;
|
||||||
|
std::int32_t centerX=0,centerY=0,direction=0;
|
||||||
|
std::vector<WorldAssemblyRoutePointV1> points;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto& constraints=stratum.routeConstraints;
|
||||||
|
constraints.version=1;
|
||||||
|
constraints.capsuleRadiusSubvoxels=PlayerRadiusQ;
|
||||||
|
constraints.capsuleHeightSubvoxels=PlayerHeightQ;
|
||||||
|
constraints.maximumGradeQ16=GradeQ16;
|
||||||
|
constraints.sweepSpacingSubvoxels=StepQ;
|
||||||
|
constraints.supportProbeRadiusSubvoxels=ProbeRadiusQ;
|
||||||
|
constraints.supportSearchDepthSubvoxels=SupportDepthQ;
|
||||||
|
constraints.minimumClearanceSubvoxels=8;
|
||||||
|
constraints.minimumSupportProbes=3;
|
||||||
|
|
||||||
|
const Heightfield2D finalField(recipe,stratum);
|
||||||
|
if(!finalField.isValid())
|
||||||
|
{error="route planner received an invalid final composed field";return false;}
|
||||||
|
std::vector<Candidate> candidates;
|
||||||
|
constexpr std::int32_t halfLength=128;
|
||||||
|
constexpr std::int32_t waypointSpacing=8;
|
||||||
|
for(std::int32_t centerY=-256;centerY<=256;centerY+=64)
|
||||||
|
for(std::int32_t centerX=-256;centerX<=256;centerX+=64)
|
||||||
|
for(std::int32_t directionIndex=0;directionIndex<static_cast<std::int32_t>(directions.size());++directionIndex)
|
||||||
|
{
|
||||||
|
Candidate candidate;
|
||||||
|
candidate.centerX=centerX;candidate.centerY=centerY;candidate.direction=directionIndex;
|
||||||
|
candidate.points.reserve(33);
|
||||||
|
std::int64_t previousGround=0,previousX=0,previousY=0;
|
||||||
|
bool gradePass=true;
|
||||||
|
for(std::int32_t index=0;index<=32;++index)
|
||||||
|
{
|
||||||
|
const std::int64_t along=(index-16)*waypointSpacing;
|
||||||
|
const std::int64_t x=centerX+std::llround(
|
||||||
|
static_cast<double>(along)*directions[directionIndex].x/65536.0);
|
||||||
|
const std::int64_t y=centerY+std::llround(
|
||||||
|
static_cast<double>(along)*directions[directionIndex].y/65536.0);
|
||||||
|
const auto column=finalField.point(WorldAssemblyFixed(static_cast<double>(x)),
|
||||||
|
WorldAssemblyFixed(static_cast<double>(y)),0);
|
||||||
|
const std::int64_t horizontalQ=static_cast<std::int64_t>(std::llround(
|
||||||
|
std::hypot(static_cast<double>(x-previousX),static_cast<double>(y-previousY))
|
||||||
|
*WorldAssemblySubvoxelsPerVoxel));
|
||||||
|
if(index>0)
|
||||||
|
{
|
||||||
|
const std::int64_t riseQ=std::abs(column.groundHeightSubvoxels-previousGround);
|
||||||
|
if(horizontalQ==0||riseQ*65536>horizontalQ*GradeQ16)
|
||||||
|
{gradePass=false;break;}
|
||||||
|
candidate.score+=riseQ*65536/std::max<std::int64_t>(1,horizontalQ);
|
||||||
|
}
|
||||||
|
WorldAssemblyRoutePointV1 point;
|
||||||
|
point.positionSubvoxels={WorldAssemblyFixed(static_cast<double>(x)),
|
||||||
|
WorldAssemblyFixed(static_cast<double>(y)),column.groundHeightSubvoxels+HalfHeightQ};
|
||||||
|
point.radiusSubvoxels=RouteRadiusQ;
|
||||||
|
point.stableFeatureId=WorldAssemblyFeatureId(recipe.seed,
|
||||||
|
static_cast<std::int64_t>(x),static_cast<std::int64_t>(y),
|
||||||
|
0x52540000u+static_cast<std::uint32_t>(index));
|
||||||
|
candidate.points.push_back(point);
|
||||||
|
previousGround=column.groundHeightSubvoxels;previousX=x;previousY=y;
|
||||||
|
}
|
||||||
|
++tested;
|
||||||
|
if(gradePass)candidates.push_back(std::move(candidate));
|
||||||
|
else ++gradeRejected;
|
||||||
|
}
|
||||||
|
std::stable_sort(candidates.begin(),candidates.end(),[](const Candidate& a,const Candidate& b)
|
||||||
|
{
|
||||||
|
if(a.score!=b.score)return a.score<b.score;
|
||||||
|
if(a.centerY!=b.centerY)return a.centerY<b.centerY;
|
||||||
|
if(a.centerX!=b.centerX)return a.centerX<b.centerX;
|
||||||
|
return a.direction<b.direction;
|
||||||
|
});
|
||||||
|
std::uint64_t sweepAttempt=0,repairAttempt=0;
|
||||||
|
VoxelForgeCore::WorldAssemblyRouteAuditResult lastAudit{};
|
||||||
|
for(auto& candidate:candidates)
|
||||||
|
{
|
||||||
|
stratum.route=candidate.points;
|
||||||
|
std::int64_t liftQ=0;
|
||||||
|
constexpr std::int64_t RepairStepQ=64;
|
||||||
|
constexpr std::int64_t MaximumRepairLiftQ=SupportDepthQ-RepairStepQ;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if(liftQ>0)
|
||||||
|
for(std::size_t pointIndex=0;pointIndex<stratum.route.size();++pointIndex)
|
||||||
|
stratum.route[pointIndex].positionSubvoxels[2]
|
||||||
|
=candidate.points[pointIndex].positionSubvoxels[2]+liftQ;
|
||||||
|
const Heightfield2D candidateField(recipe,stratum);
|
||||||
|
const auto audit=AuditHeightfieldRoute(candidateField);
|
||||||
|
lastAudit=audit;
|
||||||
|
if(audit.passed)
|
||||||
|
{
|
||||||
|
if(liftQ>0)
|
||||||
|
std::printf("[WorldAssemblerRouteRepaired] uniform_lift_q=%lld support_limit_q=%lld\n",
|
||||||
|
static_cast<long long>(liftQ),static_cast<long long>(SupportDepthQ));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(audit.blockedCapsuleSamples==0||liftQ>=MaximumRepairLiftQ)break;
|
||||||
|
const std::int64_t needed=std::max<std::int64_t>(1,
|
||||||
|
constraints.minimumClearanceSubvoxels-audit.minimumClearanceSubvoxels);
|
||||||
|
const std::int64_t steps=(needed+RepairStepQ-1)/RepairStepQ;
|
||||||
|
const std::int64_t nextLift=std::max(liftQ+RepairStepQ,liftQ+steps*RepairStepQ);
|
||||||
|
if(nextLift>MaximumRepairLiftQ)break;
|
||||||
|
liftQ=nextLift;
|
||||||
|
++repairAttempt;
|
||||||
|
}
|
||||||
|
if(sweepAttempt<3)
|
||||||
|
std::printf("[WorldAssemblerRouteCandidateRejected] ordinal=%llu blocked=%llu unsupported=%llu grade_failures=%llu minimum_clearance_q=%lld\n",
|
||||||
|
static_cast<unsigned long long>(sweepAttempt),
|
||||||
|
static_cast<unsigned long long>(lastAudit.blockedCapsuleSamples),
|
||||||
|
static_cast<unsigned long long>(lastAudit.unsupportedCenterSamples),
|
||||||
|
static_cast<unsigned long long>(lastAudit.gradeFailures),
|
||||||
|
static_cast<long long>(lastAudit.minimumClearanceSubvoxels));
|
||||||
|
++sweepAttempt;
|
||||||
|
++sweepRejected;
|
||||||
|
}
|
||||||
|
std::printf("[WorldAssemblerRouteSearchFailed] tested=%llu grade_rejected=%llu sweepable_candidates=%llu sweep_rejected=%llu last_blocked=%llu last_unsupported=%llu last_grade_failures=%llu\n",
|
||||||
|
static_cast<unsigned long long>(tested),static_cast<unsigned long long>(gradeRejected),
|
||||||
|
static_cast<unsigned long long>(candidates.size()),static_cast<unsigned long long>(sweepRejected),
|
||||||
|
static_cast<unsigned long long>(lastAudit.blockedCapsuleSamples),
|
||||||
|
static_cast<unsigned long long>(lastAudit.unsupportedCenterSamples),
|
||||||
|
static_cast<unsigned long long>(lastAudit.gradeFailures));
|
||||||
|
std::printf("[WorldAssemblerRouteRepairSummary] repair_attempts=%llu\n",
|
||||||
|
static_cast<unsigned long long>(repairAttempt));
|
||||||
|
stratum.route.clear();
|
||||||
|
error="finite-strate route candidates failed the composed-field capsule and support sweep";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool AttachRound1WorldAssemblyPrototype(FStandaloneOwnerWorld& owner,VFJson::Value& root,
|
||||||
|
std::string& error,const std::string& manifestOutputPath,
|
||||||
|
VoxelForgeCore::WorldAssemblyManifest* outManifest=nullptr)
|
||||||
|
{
|
||||||
|
if(!owner.Manager||!owner.Generator)
|
||||||
|
{error="world assembler prototype needs the resolved standalone owner world";return false;}
|
||||||
|
int32 surfaceChunkZ=0,topChunkZ=0,bottomChunkZ=0;
|
||||||
|
bool foundSurface=false;
|
||||||
|
for(int32 chunkZ=1024;chunkZ>=-4096;--chunkZ)
|
||||||
|
{
|
||||||
|
if(owner.Manager->GetGeneratorTypeForChunk(FIntVector(0,0,chunkZ))
|
||||||
|
!=ECaveGeneratorType::SurfaceWorld)continue;
|
||||||
|
surfaceChunkZ=chunkZ;
|
||||||
|
foundSurface=owner.Manager->GetStrateChunkZBounds(chunkZ,topChunkZ,bottomChunkZ);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!foundSurface)
|
||||||
|
{error="world assembler prototype could not find a finite SurfaceWorld strate";return false;}
|
||||||
|
const FIntVector chunk(0,0,surfaceChunkZ);
|
||||||
|
const FSurfaceGenerationParams surface=owner.Manager->GetSurfaceParamsForChunk(chunk);
|
||||||
|
const FBiomeContext biomeContext=owner.Manager->GetBiomeContextForChunk(chunk);
|
||||||
|
const std::int64_t bottomVoxel=static_cast<std::int64_t>(bottomChunkZ)*CHUNK_SIZE;
|
||||||
|
const std::int64_t heightVoxels=static_cast<std::int64_t>(topChunkZ-bottomChunkZ+1)*CHUNK_SIZE;
|
||||||
|
const FBiomeMapParams& map=biomeContext.Map;
|
||||||
|
const UVoxelStrateDefinition* definition=owner.Manager->GetStrateForChunk(chunk);
|
||||||
|
|
||||||
|
VoxelForgeCore::WorldAssemblyManifest manifest;
|
||||||
|
auto& recipe=manifest.recipe;
|
||||||
|
recipe.seed=static_cast<uint32>(owner.Seed);
|
||||||
|
recipe.biomeCellSizeSubvoxels=WorldAssemblyFixed(map.CellSize);
|
||||||
|
recipe.biomeWarpSubvoxels=WorldAssemblyFixed(map.WarpStrength);
|
||||||
|
recipe.biomeWarpWavelengthSubvoxels=WorldAssemblyWavelength(map.WarpFrequency,556.0);
|
||||||
|
recipe.biomeBorderBlendSubvoxels=WorldAssemblyFixed(map.BorderBlend);
|
||||||
|
recipe.biomeClimateReliefWavelengthSubvoxels=WorldAssemblyWavelength(map.ReliefFrequency,3333.0);
|
||||||
|
recipe.biomeClimateMoistureWavelengthSubvoxels=WorldAssemblyWavelength(map.MoistureFrequency,2500.0);
|
||||||
|
recipe.biomeClimateReliefContrastQ16=WorldAssemblyQ16(map.ReliefContrast);
|
||||||
|
const auto makeProfile=[&](uint32 stableId,const FSurfaceGenerationParams& params,
|
||||||
|
const FBiomeResolved* climate)
|
||||||
|
{
|
||||||
|
VoxelForgeCore::WorldAssemblyBiomeProfileV1 profile;
|
||||||
|
profile.stableId=stableId;
|
||||||
|
profile.baseHeightSubvoxels=WorldAssemblyFixed(static_cast<double>(bottomVoxel)
|
||||||
|
+static_cast<double>(heightVoxels)*params.BaseGroundRelative);
|
||||||
|
profile.continentAmplitudeSubvoxels=WorldAssemblyFixed(params.ElevationRange);
|
||||||
|
profile.continentWavelengthSubvoxels=WorldAssemblyWavelength(params.ContinentFrequency,1000.0);
|
||||||
|
profile.mountainAmplitudeSubvoxels=WorldAssemblyFixed(params.ElevationRange*params.MountainStrength);
|
||||||
|
profile.mountainWavelengthSubvoxels=WorldAssemblyWavelength(params.MountainFrequency,500.0);
|
||||||
|
profile.detailAmplitudeSubvoxels=WorldAssemblyFixed(params.SurfaceRoughness);
|
||||||
|
profile.detailWavelengthSubvoxels=WorldAssemblyWavelength(params.DetailFrequency,25.0);
|
||||||
|
profile.reliefMinimumQ16=climate?WorldAssemblyQ16(climate->ReliefMin):0;
|
||||||
|
profile.reliefMaximumQ16=climate?WorldAssemblyQ16(climate->ReliefMax):65536;
|
||||||
|
profile.moistureMinimumQ16=climate?WorldAssemblyQ16(climate->MoistureMin):0;
|
||||||
|
profile.moistureMaximumQ16=climate?WorldAssemblyQ16(climate->MoistureMax):65536;
|
||||||
|
profile.reliefStrengthQ16=WorldAssemblyQ16(params.ReliefStrength);
|
||||||
|
profile.reliefContrastQ16=WorldAssemblyQ16(params.ReliefContrast);
|
||||||
|
profile.reliefWavelengthSubvoxels=WorldAssemblyWavelength(params.ReliefFrequency,667.0);
|
||||||
|
profile.heightWarpStrengthSubvoxels=WorldAssemblyFixed(params.HeightWarpStrength);
|
||||||
|
profile.heightWarpWavelengthSubvoxels=WorldAssemblyWavelength(params.HeightWarpFrequency,125.0);
|
||||||
|
profile.beachWidthSubvoxels=WorldAssemblyFixed(params.BeachWidth);
|
||||||
|
profile.cliffStrengthQ16=WorldAssemblyQ16(params.CliffStrength);
|
||||||
|
profile.cliffSlopeThresholdQ16=std::max<std::int64_t>(1,WorldAssemblyQ16(params.CliffSlopeThreshold));
|
||||||
|
profile.cliffSharpnessQ16=WorldAssemblyQ16(params.CliffSharpness);
|
||||||
|
profile.cliffSampleDistanceSubvoxels=WorldAssemblyFixed(std::max(0.5f,params.CliffSampleDist));
|
||||||
|
const double structuralAbsBound=static_cast<double>(params.ElevationRange)
|
||||||
|
+static_cast<double>(params.ElevationRange)*params.MountainStrength
|
||||||
|
+2.0*params.SurfaceRoughness;
|
||||||
|
const double cliffAbsBound=2.0*structuralAbsBound*params.CliffStrength*params.CliffSharpness;
|
||||||
|
profile.cliffMaximumDisplacementSubvoxels=WorldAssemblyFixed(params.CliffStrength>0.0f
|
||||||
|
?std::max(1.0,cliffAbsBound):0.0);
|
||||||
|
profile.hasCapProfile=true;
|
||||||
|
profile.capHeightSubvoxels=WorldAssemblyFixed(static_cast<double>(bottomVoxel)
|
||||||
|
+static_cast<double>(heightVoxels)*params.CeilingRelative);
|
||||||
|
profile.capWarpStrengthSubvoxels=WorldAssemblyFixed(params.CeilingWarpStrength);
|
||||||
|
profile.capWarpWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingWarpFrequency,100.0);
|
||||||
|
profile.capUndulationSubvoxels=WorldAssemblyFixed(params.CeilingUndulation);
|
||||||
|
profile.capWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingUndulationFrequency,500.0);
|
||||||
|
profile.capDetailAmplitudeSubvoxels=WorldAssemblyFixed(params.CeilingRoughness);
|
||||||
|
profile.capDetailWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingRoughnessFrequency,25.0);
|
||||||
|
profile.capRidgeAmplitudeSubvoxels=WorldAssemblyFixed(params.CeilingRidgeStrength);
|
||||||
|
profile.capRidgeWavelengthSubvoxels=WorldAssemblyWavelength(params.CeilingRidgeFrequency,50.0);
|
||||||
|
return profile;
|
||||||
|
};
|
||||||
|
if(biomeContext.IsValid()&&definition)
|
||||||
|
{
|
||||||
|
for(const FBiomeResolved& resolved:biomeContext.Biomes)
|
||||||
|
{
|
||||||
|
const UVoxelBiomeDefinition* biome=definition->Biomes.IsValidIndex(resolved.Index)
|
||||||
|
?definition->Biomes[resolved.Index]:nullptr;
|
||||||
|
FSurfaceGenerationParams params=surface;
|
||||||
|
if(biome&&biome->bOverrideTerrain&&biome->GeneratorType==ECaveGeneratorType::SurfaceWorld)
|
||||||
|
{
|
||||||
|
params=biome->SurfaceParams;
|
||||||
|
params.StrateTopWorldZ=surface.StrateTopWorldZ;
|
||||||
|
params.StrateBottomWorldZ=surface.StrateBottomWorldZ;
|
||||||
|
params.BoundarySealThickness=surface.BoundarySealThickness;
|
||||||
|
params.BaseDensity=surface.BaseDensity;
|
||||||
|
params.WaterLevelRelative=surface.WaterLevelRelative;
|
||||||
|
}
|
||||||
|
recipe.biomes.push_back(makeProfile(0x1001u+static_cast<uint32>(resolved.Index),params,&resolved));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(recipe.biomes.empty())recipe.biomes.push_back(makeProfile(0x1001u,surface,nullptr));
|
||||||
|
|
||||||
|
VoxelForgeCore::WorldAssemblyStratumPlanV1 stratum;
|
||||||
|
stratum.strateIndex=owner.Manager->GetStrateIndex(
|
||||||
|
static_cast<float>((static_cast<double>(surfaceChunkZ*CHUNK_SIZE+CHUNK_SIZE/2))*VOXEL_SIZE));
|
||||||
|
stratum.topChunkZ=topChunkZ;
|
||||||
|
stratum.bottomChunkZ=bottomChunkZ;
|
||||||
|
const double strateBottom=static_cast<double>(bottomVoxel);
|
||||||
|
const double strateHeight=static_cast<double>(heightVoxels);
|
||||||
|
stratum.capHeightSubvoxels=WorldAssemblyFixed(strateBottom+strateHeight*surface.CeilingRelative);
|
||||||
|
stratum.capUndulationSubvoxels=WorldAssemblyFixed(surface.CeilingUndulation);
|
||||||
|
stratum.capWavelengthSubvoxels=WorldAssemblyWavelength(surface.CeilingUndulationFrequency,250.0);
|
||||||
|
stratum.capDetailAmplitudeSubvoxels=WorldAssemblyFixed(surface.CeilingRoughness);
|
||||||
|
stratum.capDetailWavelengthSubvoxels=WorldAssemblyWavelength(surface.CeilingRoughnessFrequency,25.0);
|
||||||
|
stratum.capRidgeAmplitudeSubvoxels=WorldAssemblyFixed(surface.CeilingRidgeStrength);
|
||||||
|
stratum.capRidgeWavelengthSubvoxels=WorldAssemblyWavelength(surface.CeilingRidgeFrequency,50.0);
|
||||||
|
stratum.waterSurfaceSubvoxels=WorldAssemblyFixed(strateBottom+strateHeight*surface.WaterLevelRelative);
|
||||||
|
stratum.waterEnabled=definition&&definition->bHasWater&&surface.WaterLevelRelative>0.0f;
|
||||||
|
|
||||||
|
// Select a deterministic steep edge in the resolved owner field for a bounded shelf.
|
||||||
|
// Selection d'une pente deterministe dans le champ resolu pour une saillie bornee.
|
||||||
|
constexpr int probeSide=49,probeStep=32;
|
||||||
|
std::array<float,probeSide*probeSide> heights{};
|
||||||
|
std::array<uint8,probeSide*probeSide> valid{};
|
||||||
|
for(int y=0;y<probeSide;++y)
|
||||||
|
for(int x=0;x<probeSide;++x)
|
||||||
|
{
|
||||||
|
const float px=static_cast<float>((x-probeSide/2)*probeStep);
|
||||||
|
const float py=static_cast<float>((y-probeSide/2)*probeStep);
|
||||||
|
float ceiling=0.0f;
|
||||||
|
const std::size_t index=static_cast<std::size_t>(y)*probeSide+x;
|
||||||
|
valid[index]=owner.Generator->GetSurfaceHeightAt(px,py,topChunkZ,heights[index],ceiling)?1u:0u;
|
||||||
|
}
|
||||||
|
double steepest=0.0;int cliffX=0,cliffY=0;bool xAxis=true;int downhill=1;
|
||||||
|
for(int y=1;y<probeSide-1;++y)
|
||||||
|
for(int x=1;x<probeSide-1;++x)
|
||||||
|
{
|
||||||
|
const std::size_t center=static_cast<std::size_t>(y)*probeSide+x;
|
||||||
|
if(!valid[center]||!valid[center-1]||!valid[center+1]||!valid[center-probeSide]||!valid[center+probeSide])continue;
|
||||||
|
const double dx=static_cast<double>(heights[center+1]-heights[center-1]);
|
||||||
|
const double dy=static_cast<double>(heights[center+probeSide]-heights[center-probeSide]);
|
||||||
|
const double slope=(std::abs(dx)+std::abs(dy))/(4.0*probeStep);
|
||||||
|
if(slope>steepest){steepest=slope;cliffX=(x-probeSide/2)*probeStep;cliffY=(y-probeSide/2)*probeStep;
|
||||||
|
xAxis=std::abs(dx)>=std::abs(dy);downhill=(xAxis?dx:dy)>=0.0?-1:1;}
|
||||||
|
}
|
||||||
|
if(steepest>0.05)
|
||||||
|
{
|
||||||
|
float ground=0.0f,ceiling=0.0f;
|
||||||
|
if(owner.Generator->GetSurfaceHeightAt(static_cast<float>(cliffX),static_cast<float>(cliffY),
|
||||||
|
topChunkZ,ground,ceiling))
|
||||||
|
{
|
||||||
|
VoxelForgeCore::WorldAssemblyFeatureV1 shelf;
|
||||||
|
shelf.stableId=WorldAssemblyFeatureId(recipe.seed,cliffX,cliffY,0x4f564552u);
|
||||||
|
shelf.type=4;
|
||||||
|
constexpr int reach=72,width=36,height=64,feather=8;
|
||||||
|
const int dirX=xAxis?downhill:0,dirY=xAxis?0:downhill;
|
||||||
|
const int minX=xAxis?(dirX>0?cliffX-feather:cliffX-reach-feather)
|
||||||
|
:cliffX-width-feather;
|
||||||
|
const int maxX=xAxis?(dirX>0?cliffX+reach+feather:cliffX+feather)
|
||||||
|
:cliffX+width+feather;
|
||||||
|
const int minY=xAxis?cliffY-width-feather
|
||||||
|
:(dirY>0?cliffY-feather:cliffY-reach-feather);
|
||||||
|
const int maxY=xAxis?cliffY+width+feather
|
||||||
|
:(dirY>0?cliffY+reach+feather:cliffY+feather);
|
||||||
|
VoxelForgeCore::Heightfield2D baseField(recipe,stratum);
|
||||||
|
double lowestGround=std::numeric_limits<double>::infinity();
|
||||||
|
double highestGround=-std::numeric_limits<double>::infinity();
|
||||||
|
for(int sampleY=minY;sampleY<=maxY;sampleY+=4)
|
||||||
|
for(int sampleX=minX;sampleX<=maxX;sampleX+=4)
|
||||||
|
{
|
||||||
|
const auto sample=baseField.point(WorldAssemblyFixed(sampleX),
|
||||||
|
WorldAssemblyFixed(sampleY),0);
|
||||||
|
const double heightQ=static_cast<double>(sample.groundHeightSubvoxels)
|
||||||
|
/VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel;
|
||||||
|
lowestGround=std::min(lowestGround,heightQ);
|
||||||
|
highestGround=std::max(highestGround,heightQ);
|
||||||
|
}
|
||||||
|
if(!std::isfinite(lowestGround)||!std::isfinite(highestGround))
|
||||||
|
{error="world assembler cliff shelf could not bound its terrain columns";return false;}
|
||||||
|
shelf.minimumSubvoxels={WorldAssemblyFixed(minX),WorldAssemblyFixed(minY),
|
||||||
|
WorldAssemblyFixed(std::max<double>(bottomVoxel,lowestGround-4.0))};
|
||||||
|
shelf.maximumSubvoxels={WorldAssemblyFixed(maxX),WorldAssemblyFixed(maxY),
|
||||||
|
WorldAssemblyFixed(std::min<double>((topChunkZ+1)*CHUNK_SIZE,
|
||||||
|
highestGround+height+4.0))};
|
||||||
|
shelf.parametersSubvoxels={WorldAssemblyFixed(dirX),WorldAssemblyFixed(dirY),
|
||||||
|
WorldAssemblyFixed(height),WorldAssemblyFixed(reach)};
|
||||||
|
stratum.features.push_back(shelf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::uint64_t routeCandidates=0,routeGradeRejected=0,routeSweepRejected=0;
|
||||||
|
if(!BuildFiniteStrateRoute(recipe,stratum,routeCandidates,routeGradeRejected,
|
||||||
|
routeSweepRejected,error))return false;
|
||||||
|
std::printf("[WorldAssemblerRoutePlan] candidates=%llu grade_rejected=%llu sweep_rejected=%llu accepted_points=%zu capsule_m=0.34x1.76 corridor_radius_vox=4 support_probe_points=5 minimum_support_probes=%u status=PASS\n",
|
||||||
|
static_cast<unsigned long long>(routeCandidates),
|
||||||
|
static_cast<unsigned long long>(routeGradeRejected),
|
||||||
|
static_cast<unsigned long long>(routeSweepRejected),stratum.route.size(),
|
||||||
|
stratum.routeConstraints.minimumSupportProbes);
|
||||||
|
manifest.plan.strates.push_back(std::move(stratum));
|
||||||
|
if(!manifest.finalize(error))return false;
|
||||||
|
if(outManifest)*outManifest=manifest;
|
||||||
|
const std::string manifestText=manifest.ToJson();
|
||||||
|
const auto roundTrip=VoxelForgeCore::WorldAssemblyManifest::FromJson(manifestText,error);
|
||||||
|
if(!roundTrip||!roundTrip->validate(error)||roundTrip->ToJson()!=manifestText
|
||||||
|
||roundTrip->contentHash!=manifest.contentHash)
|
||||||
|
{if(error.empty())error="world assembly canonical plan serialization did not round-trip";return false;}
|
||||||
|
std::printf("[WorldAssemblerPlanSerialization] bytes=%zu canonical_round_trip=true route_points=%zu plan_hash=%016llx manifest_hash=%016llx status=PASS\n",
|
||||||
|
manifestText.size(),manifest.plan.strates.front().route.size(),
|
||||||
|
static_cast<unsigned long long>(manifest.plan.contentHash),
|
||||||
|
static_cast<unsigned long long>(manifest.contentHash));
|
||||||
|
if(!manifestOutputPath.empty())
|
||||||
|
{
|
||||||
|
const std::filesystem::path outputPath(manifestOutputPath);
|
||||||
|
std::error_code directoryError;
|
||||||
|
if(!outputPath.parent_path().empty())
|
||||||
|
std::filesystem::create_directories(outputPath.parent_path(),directoryError);
|
||||||
|
if(directoryError)
|
||||||
|
{error="could not create the world assembly manifest output directory";return false;}
|
||||||
|
std::ofstream output(outputPath,std::ios::binary);
|
||||||
|
if(!output)
|
||||||
|
{error="could not open the world assembly manifest output path";return false;}
|
||||||
|
output.write(manifestText.data(),static_cast<std::streamsize>(manifestText.size()));
|
||||||
|
if(!output)
|
||||||
|
{error="could not write the world assembly manifest payload";return false;}
|
||||||
|
}
|
||||||
|
VFJson::Value manifestJson;
|
||||||
|
if(!VFJson::Parser(manifestText).Parse(manifestJson,error))return false;
|
||||||
|
auto* rootObject=std::get_if<VFJson::Value::Object>(&root.Data);
|
||||||
|
if(!rootObject)
|
||||||
|
{error="owner snapshot root is not a JSON object";return false;}
|
||||||
|
(*rootObject)["world_assembly"]=std::move(manifestJson);
|
||||||
|
std::printf("[WorldAssemblerPrototype] recipe_version=%u evaluator_version=%u strata=%zu biomes=%zu strate_index=%d chunk_z=%d..%d serialized_bytes=%zu recipe_hash=%016llx plan_hash=%016llx manifest_hash=%016llx source=owner_surface_params_and_biome_map route_points=%zu features=%zu\n",
|
||||||
|
manifest.recipe.schemaVersion,manifest.recipe.evaluatorVersion,manifest.plan.strates.size(),
|
||||||
|
manifest.recipe.biomes.size(),manifest.plan.strates.front().strateIndex,topChunkZ,bottomChunkZ,
|
||||||
|
manifestText.size(),static_cast<unsigned long long>(manifest.recipe.contentHash),
|
||||||
|
static_cast<unsigned long long>(manifest.plan.contentHash),
|
||||||
|
static_cast<unsigned long long>(manifest.contentHash),manifest.plan.strates.front().route.size(),
|
||||||
|
manifest.plan.strates.front().features.size());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool OverrideStandaloneSeed(VFJson::Value& root,int32 seed,std::string& error)
|
||||||
|
{
|
||||||
|
auto* object=std::get_if<VFJson::Value::Object>(&root.Data);
|
||||||
|
if(!object){error="owner snapshot root is not a JSON object";return false;}
|
||||||
|
(*object)["seed"].Data=static_cast<double>(seed);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool OverrideStandaloneRenderDistance(VFJson::Value& root,int32 chunks,std::string& error)
|
||||||
|
{
|
||||||
|
auto* object=std::get_if<VFJson::Value::Object>(&root.Data);
|
||||||
|
if(!object){error="owner snapshot root is not a JSON object";return false;}
|
||||||
|
(*object)["render_distance_chunks"].Data=static_cast<double>(std::max(0,chunks));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool SelectTopStrateAsFloatingIslands(VFJson::Value& root,std::string& error)
|
||||||
|
{
|
||||||
|
auto* rootObject=std::get_if<VFJson::Value::Object>(&root.Data);
|
||||||
|
if(!rootObject){error="owner snapshot root is not a JSON object";return false;}
|
||||||
|
auto stratesEntry=rootObject->find("strates");
|
||||||
|
if(stratesEntry==rootObject->end())
|
||||||
|
{error="owner snapshot has no strata array";return false;}
|
||||||
|
auto* strates=std::get_if<VFJson::Value::Array>(&stratesEntry->second.Data);
|
||||||
|
if(!strates||strates->empty())
|
||||||
|
{error="owner snapshot strata array is empty";return false;}
|
||||||
|
auto top=strates->begin();
|
||||||
|
for(auto it=std::next(strates->begin());it!=strates->end();++it)
|
||||||
|
if(it->Get("top_chunk_z").Number()>top->Get("top_chunk_z").Number())top=it;
|
||||||
|
auto* strateObject=std::get_if<VFJson::Value::Object>(&top->Data);
|
||||||
|
if(!strateObject){error="top owner strate is not an object";return false;}
|
||||||
|
auto assetEntry=strateObject->find("asset");
|
||||||
|
if(assetEntry==strateObject->end())
|
||||||
|
{error="top owner strate has no resolved asset";return false;}
|
||||||
|
auto* asset=std::get_if<VFJson::Value::Object>(&assetEntry->second.Data);
|
||||||
|
if(!asset){error="top owner strate asset is not an object";return false;}
|
||||||
|
(*asset)["GeneratorType"].Data=static_cast<double>(
|
||||||
|
static_cast<std::uint8_t>(ECaveGeneratorType::FloatingIslands));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool AttachFloatingIslandWorldAssembly(FStandaloneOwnerWorld& owner,
|
||||||
|
VFJson::Value& root,VoxelForgeCore::WorldAssemblyManifest& assembly,std::string& error)
|
||||||
|
{
|
||||||
|
if(!owner.Manager)
|
||||||
|
{error="floating-island assembly needs the resolved standalone strate manager";return false;}
|
||||||
|
const FStrateSlot* islandSlot=nullptr;
|
||||||
|
for(const FStrateSlot& slot:owner.Manager->GetLayout())
|
||||||
|
if(slot.Definition&&slot.Definition->GeneratorType==ECaveGeneratorType::FloatingIslands)
|
||||||
|
{islandSlot=&slot;break;}
|
||||||
|
if(!islandSlot)
|
||||||
|
{error="floating-island recipe requested but no FloatingIslands strate was resolved";return false;}
|
||||||
|
const std::uint64_t divisor=std::gcd<std::uint64_t>(owner.OwnerVoxelSizeMicrons,
|
||||||
|
owner.CoreVoxelSizeMicrons);
|
||||||
|
if(divisor==0)
|
||||||
|
{error="owner/Core voxel import ratio is invalid for the floating-island recipe";return false;}
|
||||||
|
|
||||||
|
VoxelForgeCore::FloatingIslandRecipeV1 recipe;
|
||||||
|
recipe.seed=static_cast<std::uint32_t>(owner.Seed);
|
||||||
|
recipe.ownerVoxelSizeMicrons=owner.OwnerVoxelSizeMicrons;
|
||||||
|
recipe.coreVoxelSizeMicrons=owner.CoreVoxelSizeMicrons;
|
||||||
|
recipe.ownerToCoreScaleNumerator=owner.OwnerVoxelSizeMicrons/static_cast<std::uint32_t>(divisor);
|
||||||
|
recipe.ownerToCoreScaleDenominator=owner.CoreVoxelSizeMicrons/static_cast<std::uint32_t>(divisor);
|
||||||
|
const std::int64_t coreVoxelsPerOwnerChunk=static_cast<std::int64_t>(CHUNK_SIZE)
|
||||||
|
*recipe.ownerToCoreScaleNumerator/recipe.ownerToCoreScaleDenominator;
|
||||||
|
const std::int64_t minimumZ=static_cast<std::int64_t>(islandSlot->BottomChunkZ)
|
||||||
|
*coreVoxelsPerOwnerChunk*VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel
|
||||||
|
+2*VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel;
|
||||||
|
const std::int64_t maximumZ=static_cast<std::int64_t>(islandSlot->TopChunkZ+1)
|
||||||
|
*coreVoxelsPerOwnerChunk*VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel
|
||||||
|
-2*VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel;
|
||||||
|
if(maximumZ<=minimumZ)
|
||||||
|
{error="FloatingIslands strate is too short for a bounded Core recipe";return false;}
|
||||||
|
recipe.layoutMinimumZSubvoxels=minimumZ;
|
||||||
|
recipe.layoutMaximumZSubvoxels=maximumZ;
|
||||||
|
recipe.layoutCenterTopZSubvoxels=minimumZ+(maximumZ-minimumZ)/2;
|
||||||
|
|
||||||
|
auto planned=VoxelForgeCore::PlanFloatingIslandCluster(recipe,error);
|
||||||
|
if(!planned)return false;
|
||||||
|
VoxelForgeCore::WorldAssemblyFloatingIslandPlanV1 islands;
|
||||||
|
islands.strateIndex=islandSlot->StrateIndex;
|
||||||
|
islands.topChunkZ=islandSlot->TopChunkZ;
|
||||||
|
islands.bottomChunkZ=islandSlot->BottomChunkZ;
|
||||||
|
islands.manifest=std::move(*planned);
|
||||||
|
assembly.floatingIslands.push_back(std::move(islands));
|
||||||
|
if(!assembly.finalize(error))return false;
|
||||||
|
|
||||||
|
VFJson::Value assemblyJson;
|
||||||
|
if(!VFJson::Parser(assembly.ToJson()).Parse(assemblyJson,error))return false;
|
||||||
|
auto* rootObject=std::get_if<VFJson::Value::Object>(&root.Data);
|
||||||
|
if(!rootObject){error="owner snapshot root is not a JSON object";return false;}
|
||||||
|
(*rootObject)["world_assembly"]=std::move(assemblyJson);
|
||||||
|
std::printf("[FloatingIslandWorldAssembly] seed=%d strate_index=%d chunks=%d..%d island_count=%zu recipe_hash=%016llx status=PASS\n",
|
||||||
|
owner.Seed,islandSlot->StrateIndex,islandSlot->TopChunkZ,islandSlot->BottomChunkZ,
|
||||||
|
assembly.floatingIslands.back().manifest.plan.islands.size(),
|
||||||
|
static_cast<unsigned long long>(assembly.floatingIslands.back().manifest.recipe.contentHash));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace StandaloneWorldAssemblyPrototype
|
||||||
Reference in new issue
Block a user