WIP: Character creator: the Vitruvian body (CharMorph, CC0) replaces MakeHuman's mesh #139
Draft
khyretos
wants to merge 1 commit from
khyretos/claude/creator-vitruvian into claude/creator-polish
AGit
pull from: khyretos/claude/creator-vitruvian
merge into: khyretos:claude/creator-polish
khyretos:main
khyretos:renovate-hold-imgui-rnnoise
khyretos:gh-pages
khyretos:windows-results
khyretos:renovate/font-awesome-7.x
khyretos:lint-fix/yaml_prettier
khyretos:renovate/https-code.forgejo.org-forgejo-upload-artifact-5.x
khyretos:renovate/https-code.forgejo.org-forgejo-download-artifact-7.x
khyretos:renovate/https-code.forgejo.org-actions-cache-6.x
khyretos:renovate/xiph-rnnoise-0.x
khyretos:renovate/cmake-mirrors-non-major
khyretos:lint-fix/json_prettier
khyretos:lint-fix/bash_shfmt
khyretos:ci/coverage-ccache
khyretos:ci/speed-ccache-jobs
khyretos:claude/integration
khyretos:claude/creator-vitruvian-wip
khyretos:claude/park-engine-foundations
khyretos:claude/park-parity
khyretos:claude/jiggle-skeleton-base
khyretos:claude/creator-polish-base
khyretos:claude/creator-polish
khyretos:claude/creator-wardrobe
khyretos:claude/creator-anime
khyretos:claude/creator-clothes
khyretos:pre-release
khyretos:release
khyretos:claude/mpm-water
khyretos:lint-fix/markdown_markdownlint
khyretos:claude/lua-nav
khyretos:claude/creator-hair
khyretos:claude/dynamic-navmesh
khyretos:claude/lua-audio
khyretos:claude/save-slots
khyretos:archive/2026-10-24/clothref
khyretos:archive/2026-10-24/f01aref
khyretos:archive/2026-10-24/f02aref
khyretos:archive/2026-10-24/f12ref
khyretos:archive/2026-10-24/g18eref
khyretos:archive/2026-10-24/g19aref
khyretos:archive/2026-10-24/g19b2
khyretos:archive/2026-10-24/g19bref
khyretos:archive/2026-10-24/g19cref
khyretos:archive/2026-10-24/g19dref
khyretos:archive/2026-10-24/reflA
khyretos:archive/2026-10-24/reflB
khyretos:khyretos/rhi-shaders
khyretos:claude/rhi-light-sets
khyretos:claude/rhi-pipeline-state
khyretos:archive/2026-10-24/r1gref
khyretos:archive/2026-10-24/ciref
khyretos:archive/2026-10-24/r1eref
khyretos:archive/2026-10-24/r1dref
khyretos:archive/2026-10-24/r1cref
khyretos:archive/2026-10-24/r1bref
khyretos:archive/2026-10-24/r1aref
khyretos:archive/2026-10-24/f13ref
khyretos:archive/2026-10-24/f11ref
khyretos:archive/2026-10-24/f10dref
khyretos:khyretos/ci-on-prs
khyretos:archive/2026-10-24/f10cref
khyretos:archive/2026-10-24/f10bref
khyretos:claude/bloom
khyretos:archive/2026-10-24/f10ref
khyretos:archive/2026-10-24/f08ref
khyretos:archive/2026-10-24/f07ref
khyretos:archive/2026-10-24/f05bref
khyretos:archive/2026-10-24/f05ref
khyretos:archive/2026-10-24/f03ref
khyretos:archive/2026-10-24/f02cref
khyretos:benchmark-data
khyretos:claude/cloth-passes
khyretos:archive/2026-10-24/f02bref
khyretos:archive/2026-10-24/refl-merge-base
khyretos:archive/2026-10-24/claude-b087-ref
khyretos:archive/2026-10-24/claude-macos-cross
khyretos:archive/2026-10-24/claude-macos-ref
khyretos:archive/2026-10-24/stash-macos-ref
khyretos:archive/2026-10-24/claude-win-probe
khyretos:patches/inbox
khyretos:tennis-feedback-wip
khyretos:archive/2026-10-24/runner-kit-check
No reviewers
Labels
No labels
deps
deps-major
hold
security
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
khyretos/kk-engine!139
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "khyretos/claude/creator-vitruvian"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The creator's realistic body is CharMorph Vitruvian's skin (26k vertices, a real nose, lips, eyelids) with its own 4K skin maps, in the same pack format, so sliders, rig, clothes, hair and share codes work unchanged. tools/makehuman/vitruvian_pack.py makes it; KKE_HUMAN_BODY=makehuman brings the old body back. Stacked on #137. Full notes: handoff files/creator-vitruvian-pr.md
Kees: the models look like cavemen and I never did the high-fidelity models he asked for from the sources he gave. MakeHuman's 13,000 vertex face and body were the problem, however the sliders were set. - assets/humans/vitruvian.kkhpack: CharMorph Vitruvian's skin (26,000 vertices, a real nose, lips, eyelids, ears, fingers) in the same pack format, so the sliders, rig, clothes, hair, eyes and share codes work on it unchanged. MakeHuman's 1,280 targets, skin weights, skeleton and helper meshes are carried onto it; the default sliders land on Vitruvian's own shape (MakeHuman's default macro offsets are subtracted). - vitruvian_skin_{albedo,normal,roughness}.jpg: Vitruvian's own 4K UDIM skin repacked as one 4096 atlas (12 MB as PNG would have been 52). - tools/makehuman/vitruvian_pack.py makes both (under two minutes). Body-type targets are smoothed (sigma 18 mm): MakeHuman's fine detail (nipples, ribs) did not line up and left creased chests and flank swells at 8 mm. Eyeballs are fitted to Vitruvian's own, so brows and lashes land on the face. Helper meshes ride a smooth field, or the clothes came out lumpy with ragged hems. - The creator uses it when the pack is there; KKE_HUMAN_BODY=makehuman brings the old body back. Hair is drawn fuller (more strands per guide, wider spread) on the better head. - Tests: the Vitruvian pack has MakeHuman's sliders and rig on a finer body, default sliders give a person and the archetypes differ, eyes brows and hair sit on the face, every garment fits it. Not in this commit: anime shading from the toon-shader sources, the mouth, the crown parting, more hair styles on the new head. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>Title
WIP: Character creator: the Vitruvian body (CharMorph, CC0) replaces MakeHuman's mesh
User description
The creator's realistic body is CharMorph Vitruvian's skin (26k vertices, a real nose, lips, eyelids) with its own 4K skin maps, in the same pack format, so sliders, rig, clothes, hair and share codes work unchanged. tools/makehuman/vitruvian_pack.py makes it; KKE_HUMAN_BODY=makehuman brings the old body back. Stacked on #137. Full notes: handoff files/creator-vitruvian-pr.md
PR Type
Enhancement
Description
Replaces MakeHuman mesh with Vitruvian body (26k vertices)
Adds
vitruvian_pack.pyto generate pack and 4K skin mapsUpdates character creator to load Vitruvian by default
Extends tests for Vitruvian body compatibility
Diagram Walkthrough
File Walkthrough
3 files
Switches default human pack to Vitruvian with env overrideAdds m_skinPrefix field for Vitruvian texture prefixNew script to build Vitruvian pack from CharMorph data1 files
Adds Vitruvian body tests for rig, sliders and hair2 files
Credits CharMorph Vitruvian authors and CC0 licenceDocuments Vitruvian body integration and generation steps2 files
Registers Vitruvian pack and maps as new dependenciesCopies Vitruvian pack and skin maps to runtime assets1 files
PR Reviewer Guide 🔍
📋 Focus areas: 🔴 2 open · ✅ 0 handled. Every push re-checks them; a handled area moves to Resolved findings at the bottom.
Hard-coded file paths for skin maps
The
skinMaterialfunction inCharacterCreatorModule.cpp(lines 796-801) uses a lambda to search for skin texture files, but it only checks for.jpgand.pngextensions. This is problematic because the PR introduces new JPEG files (vitruvian_skin_*.jpg) while the old code expected PNGs. Although the lambda attempts to find either extension, relying on file extensions rather than a more robust asset loading mechanism or configuration could lead to runtime errors if the file naming convention changes or if the build system produces files with unexpected extensions. Additionally, the logic assumes the files are located directly inm_humansDir, which might not account for subdirectories or different packaging strategies in the future.Potential resource leak in main()
In the
main()function ofvitruvian_pack.py(line 664), thelogfunction is defined as a local closure that prints to stdout. While this is generally acceptable for CLI tools, there is no explicit cleanup or error handling for theargs.out_dirdirectory if an exception occurs afteros.makedirs(args.out_dir, exist_ok=True)(line 661) but before the pack or maps are written. If an error occurs duringbuild_packorbuild_maps, the partially created output directory will remain, potentially leaving stale data. It would be better to wrap the main logic in a try-finally block to ensure cleanup or at least log the error more explicitly before exiting.PR Code Suggestions ✨
No code suggestions found for the PR.
🧹 Lint report · ❌ 38 problems in 6 checks · 🧹 3 formatting checks to tidy
Nothing here blocks the merge (report only).
MARKDOWN · markdownlint: first lines of the output
CPP · cppcheck: first lines of the output
YAML · yamllint: first lines of the output
BASH · shellcheck: first lines of the output
DOCKERFILE · hadolint: first lines of the output
REPOSITORY · trivy: first lines of the output
🧹 Formatting only (layout, no behaviour; the nightly lint-fix job applies these as a PR): YAML · prettier (57 files checked), BASH · shfmt (11 files checked), JSON · prettier (147 files checked)
✅ Clean: actionlint, git_diff, gitleaks, grype, jsonlint, secretlint, stylelint, trufflehog, xmllint
MegaLinter on soucouyant · full logs in the Actions run · comment
/improvefor AI fix suggestionsView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.