From 1c6b9564353a24d668c254e220cfee74187f7172 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sat, 7 Nov 2026 09:29:11 +0100 Subject: [PATCH] =?UTF-8?q?bootstrap:=20finish=20project=20bootstrap=20?= =?UTF-8?q?=E2=80=94=20scale=20test,=20MPFB=20character,=20build=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Static-mesh scale test passes: 1 m = 100.00 cm, origin preserved, axis mapping east→+X / north→−Y / up→+Z (named presets ue_metric_v1 both sides). - MPFB 2.0.18 acceptance passes: generated human + standard 137-bone rig with weights + v2 skin baked to 1024² diffuse; imports as SkeletalMesh with Skeleton, Material, and Texture2D in /Game/Test/Character. - MPFB headless requires XDG_CONFIG_HOME at the Flatpak config tree; documented in Art/blender/README.md, probe in Tools/addon_compat_probe.py. - Docs/build.md completed: fresh-checkout build, packaging, headless checks. - Docs/setup.md reconciled with reality; ROADMAP/bootstrap closed out. --- Art/blender/README.md | 15 ++ .../character/character-2026-11-07.blend | 3 + .../scaletest/scale-test-2026-11-07.blend | 3 + Docs/build.md | 66 +++++++- Docs/setup.md | 37 ++--- Docs/toolchain.md | 4 +- .../Test/Character/M_Character_Export.uasset | 3 + .../Test/Character/T_Skin_Diffuse.uasset | 3 + .../Content/Test/Character/character.uasset | 3 + .../Test/Character/character_Skeleton.uasset | 3 + .../Test/ScaleTest/M_ScaleTest_Red.uasset | 3 + .../Content/Test/ScaleTest/ScaleTest_A.uasset | 3 + .../Content/Test/ScaleTest/ScaleTest_B.uasset | 3 + .../Content/Test/ScaleTest/ScaleTest_C.uasset | 3 + MEMORY.md | 11 ++ ROADMAP.md | 14 +- Tools/addon_compat_probe.py | 64 ++++++++ Tools/mpfb_character_export.py | 148 ++++++++++++++++++ Tools/scale_test_export.py | 81 ++++++++++ Tools/ue_character_import.py | 117 ++++++++++++++ Tools/ue_scale_test_import.py | 60 +++++++ 21 files changed, 614 insertions(+), 33 deletions(-) create mode 100644 Art/blender/character/character-2026-11-07.blend create mode 100644 Art/blender/scaletest/scale-test-2026-11-07.blend create mode 100644 Game/GigLine/Content/Test/Character/M_Character_Export.uasset create mode 100644 Game/GigLine/Content/Test/Character/T_Skin_Diffuse.uasset create mode 100644 Game/GigLine/Content/Test/Character/character.uasset create mode 100644 Game/GigLine/Content/Test/Character/character_Skeleton.uasset create mode 100644 Game/GigLine/Content/Test/ScaleTest/M_ScaleTest_Red.uasset create mode 100644 Game/GigLine/Content/Test/ScaleTest/ScaleTest_A.uasset create mode 100644 Game/GigLine/Content/Test/ScaleTest/ScaleTest_B.uasset create mode 100644 Game/GigLine/Content/Test/ScaleTest/ScaleTest_C.uasset create mode 100644 Tools/addon_compat_probe.py create mode 100644 Tools/mpfb_character_export.py create mode 100644 Tools/scale_test_export.py create mode 100644 Tools/ue_character_import.py create mode 100644 Tools/ue_scale_test_import.py diff --git a/Art/blender/README.md b/Art/blender/README.md index 382a1f3..d62c0c7 100644 --- a/Art/blender/README.md +++ b/Art/blender/README.md @@ -19,6 +19,7 @@ B=/var/lib/flatpak/app/org.blender.Blender/x86_64/stable/active/files C="$HOME/.var/app/org.blender.Blender/config/blender/5.2" LD_LIBRARY_PATH="$B/blender/lib" \ +XDG_CONFIG_HOME="$HOME/.var/app/org.blender.Blender/config" \ BLENDER_USER_SCRIPTS="$C/scripts" \ "$B/blender/blender" -b --factory-startup \ --python Tools/blosm_blockout.py -- \ @@ -143,3 +144,17 @@ The extract is complete for the block but not for every relation inside its bbox - Not cleaned, not subdivided into façade modules, not UV-mapped, not detailed. - Materials are placeholders from Blosm's simple mode. Realistic mode needs the paid material pack and was not run. - Terrain, kerbs, and crossing ramps are not in it: those come from the DEM cross-sections in `Geo/verification/2026-11-06-cross-sections.md`. + +## Scale test and the Unreal frame (2026-11-07) + +`Art/blender/scaletest/scale-test-2026-11-07.blend` — three 1 m cubes at origin, +10 m east, +10 m north, plus one red test material. Regenerate with `Tools/scale_test_export.py`; import with `Tools/ue_scale_test_import.py`. Both are the named-preset templates for production assets. + +Export preset **`ue_metric_v1`** (Blender FBX): `apply_unit_scale`, `apply_scale_options='FBX_SCALE_NONE'`, `axis_forward='-Y'`, `axis_up='Z'`, `use_space_transform`, no bake-space-transform. Import preset **`ue_metric_v1`** (UE `FbxImportUI`): static mesh, import materials, uniform scale 1.0, no unit conversion, no force-front-X. + +Measured result in Unreal centimetres: 1 m cube → exactly 100.00 cm; origin preserved. Axis mapping **east → +X, north → −Y, up → +Z**. The north mirror is inherent to the right-handed Blender → left-handed UE conversion; the FBX importer fixes triangle winding, so geometry is not visually mirrored. Compass conversions in game code must use north = −Y. + +## Add-on compatibility (re-checked 2026-11-07) + +`Tools/addon_compat_probe.py` loads both pinned add-ons headless and runs an MPFB smoke test. Result on Blender 5.2.0 LTS: Blosm 2.7.28 imports; MPFB 2.0.18 enables and `mpfb.create_human` generates a default human (19 158 verts, UVs, no materials, no armature — skeleton and baked materials are separate steps). + +**Required invocation change:** every direct-binary headless run must now set `XDG_CONFIG_HOME="$HOME/.var/app/org.blender.Blender/config"`. Without it Blender resolves the extensions dir to `~/.config/blender/5.2/extensions`, where nothing is installed, and `bl_ext.blender_org.mpfb` is not discovered. Blosm is unaffected (it lives in `scripts/addons`, found via `BLENDER_USER_SCRIPTS`), but set the variable in all runs for consistency. diff --git a/Art/blender/character/character-2026-11-07.blend b/Art/blender/character/character-2026-11-07.blend new file mode 100644 index 0000000..ea52303 --- /dev/null +++ b/Art/blender/character/character-2026-11-07.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da3fa22b14105a89bc9087d278ebe674940c73da20c7b8c1e8ec59f775f4d736 +size 2228931 diff --git a/Art/blender/scaletest/scale-test-2026-11-07.blend b/Art/blender/scaletest/scale-test-2026-11-07.blend new file mode 100644 index 0000000..6d78bf0 --- /dev/null +++ b/Art/blender/scaletest/scale-test-2026-11-07.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:556c6ebae42f6f10665d34ffeb18004c192ea59a22f365ae0cd278a0239881a4 +size 96907 diff --git a/Docs/build.md b/Docs/build.md index 5dc523c..45845c5 100644 --- a/Docs/build.md +++ b/Docs/build.md @@ -1,6 +1,6 @@ # Build -Fresh-checkout build procedure. To be completed once the pinned engine is installed and a blank project has been packaged — see [setup.md](setup.md). Until then this file records only the constraints that are already known. +Fresh-checkout build procedure. Completed 2026-11-07 after the pinned engine was installed and a blank `Game/GigLine` build was packaged and launch-tested. ## Constraints @@ -8,14 +8,72 @@ Fresh-checkout build procedure. To be completed once the pinned engine is instal - Build output (`Binaries/`, `Intermediate/`, `Saved/`, `DerivedDataCache/`) is never committed. - Large content is LFS-tracked, so a fresh clone needs `git lfs install && git lfs pull` before any build. -## Procedure (placeholder) +## Engine + +Pinned install: **Unreal Engine 5.8.4** (CL 58902052, promoted build) at +`/run/media/system/DATA/Engines/UE_5.8.4`. The engine bundles **no** Linux clang; the system clang (23.1.4, Fedora 45) is the game-code toolchain. Game targets must use `BuildSettingsVersion.V7` to share the installed editor's build environment. + +## Fresh-checkout build ```bash git clone gig-line && cd gig-line git lfs install && git lfs pull -# engine path, project generation, build, and packaging commands — fill in after setup +Tools/check-lfs.sh # must pass before any content build + +# Compile the project's editor target (first build also proves the toolchain) +cd /run/media/system/DATA/Engines/UE_5.8.4 +Engine/Build/BatchFiles/Linux/Build.sh GigLineEditor Linux Development \ + -project="$PWD/../../Documents/06-games/gig-line/Game/GigLine/GigLine.uproject" \ + -WaitMutex +# Expected tail: "Result: Succeeded"; module binary lands in +# Game/GigLine/Binaries/Linux/libUnrealEditor-GigLine.so + +# Open in the editor (GUI, Vulkan) +./Engine/Binaries/Linux/UnrealEditor \ + /run/media/system/DATA/Documents/06-games/gig-line/Game/GigLine/GigLine.uproject ``` +Adapt the `-project=` path to the actual checkout location. + +## Package a Linux build + +```bash +cd /run/media/system/DATA/Engines/UE_5.8.4 +Engine/Build/BatchFiles/RunUAT.sh BuildCookRun \ + -project="/run/media/system/DATA/Documents/06-games/gig-line/Game/GigLine/GigLine.uproject" \ + -noP4 -platform=Linux -clientconfig=Development \ + -cook -allmaps -build -stage -pak \ + -archive -archivedirectory="/run/media/system/DATA/Builds/GigLine" \ + -unattended +# Expected: "BUILD SUCCESSFUL" (~1 min for the blank project; archive ~1.1 GiB) +# Launch test: /run/media/system/DATA/Builds/GigLine/Linux/GigLine.sh +``` + +The archive directory is deliberately **outside** the repository; never archive into the checkout. + +## Headless content checks + +Both content-acceptance tests run headless and are the template for all asset import verification: + +```bash +# Static-mesh scale test (Blender export -> Unreal import -> measure) +# Blender: Tools/scale_test_export.py, Unreal: Tools/ue_scale_test_import.py +# MPFB character (generate -> rig -> bake -> export -> skeletal import) +# Blender: Tools/mpfb_character_export.py, Unreal: Tools/ue_character_import.py + +# Unreal side of any test: +./Engine/Binaries/Linux/UnrealEditor-Cmd \ + /run/media/system/DATA/Documents/06-games/gig-line/Game/GigLine/GigLine.uproject \ + -run=pythonscript -script=/Tools/