wip(unreal): VoxelForgeCore UBT module + asset adapter reproduce the standalone world

Luna, integration round 1 (BuildHost only; owner's project and assets untouched):
- New runtime module VoxelForgeCore: one shim per Standalone/Core/core_sources.txt row
  (sources stay canonical under Standalone/), NoPCH/no unity, manifest check; VoxelForge
  links it (no runtime routing yet). UE link-safety audit: 18 shims, 83,843 symbol lines
  vs 399 Unreal-style names, 0 clashes.
- Adapter (editor commandlet path) turns staged copies of the owner's DA_* assets into
  schema-v1 JSON; with clip_radius=3/max_clip_level=8 it reproduces all four Core hashes
  (0xdb2991c73215af4c, 0x8236c5edd7fc8e4f, 0x4c48fa75a543d58e, 0xbea22e76b34a4dfc) and
  walkability 5,642/5,642 at worker limits 1, 8 and 16.
- Noted: the owner's settings asset says max clip level 6 (standalone used 8); Core uses
  25 cm voxels vs the plugin runtime's 12.5 cm.
Not done yet: AVoxelWorld switch and Core runtime route (round 2).
Docs: CODEMAP, ARCHITECTURE, SHARED_CPP_LIBRARY_PLAN, UNREAL_INTEGRATION_REPORT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-08 19:38:18 +02:00
1 parent a1dfc0422e
commit 29ca99af7f
32 files changed
+919 -69

No files matched your search

@@ -11,6 +11,17 @@
#include <utility>
#include <vector>
// UBT supplies this export/import macro for the runtime module. The standalone target has no
// module boundary, so leave it empty there. UBT fournit la macro; le viewer autonome reste neutre.
#ifndef VOXELFORGECORE_API
#define VOXELFORGECORE_API
#endif
#if defined(VFCORE_PRIVATE_IMPLEMENTATION)
#define VFCORE_API
#else
#define VFCORE_API VOXELFORGECORE_API
#endif
namespace VoxelForgeCore
{
struct Vec2f { float x = 0.0f, y = 0.0f; };
@@ -28,7 +39,7 @@ namespace VoxelForgeCore
friend bool operator==(const TileKey&, const TileKey&) = default;
};
struct TileKeyHash
struct VFCORE_API TileKeyHash
{
std::size_t operator()(const TileKey& key) const noexcept;
};
@@ -87,7 +98,7 @@ namespace VoxelForgeCore
Vec3d viewerStartVoxels{};
};
class ResolvedWorldSnapshot
class VFCORE_API ResolvedWorldSnapshot
{
public:
ResolvedWorldSnapshot() = default;
@@ -110,7 +121,7 @@ namespace VoxelForgeCore
// The library requests work; the host decides whether that means a pool, fibers, or serial
// execution. The callback must run every index in [0,count) exactly once before returning.
class JobScheduler
class VFCORE_API JobScheduler
{
public:
using Task = void(*)(void* context, std::size_t index, std::size_t workerIndex);
@@ -333,7 +344,7 @@ namespace VoxelForgeCore
bool skipMaterialGroups = false;
};
class World
class VFCORE_API World
{
public:
explicit World(ResolvedWorldSnapshot snapshot);