Releases: tkleisas/MiVic
Releases · tkleisas/MiVic
Release list
v0.3.2
Full Changelog: v0.3.1...v0.3.2
v0.3.1
v0.3.0
v0.2.2
MiVic v0.2.1 — the imported figure stands in the briefing
v0.2.0 built the figure; this is the scene using it. `m1_briefing` now stands
`personality_elder_skinned` at its desk — the MakeHuman body, the aged caucasian
skin, the pack's jacket and jeans repainted into one khaki, grey hair, and a
moustache painted into the skin map. The generated figure stays: it is still what
the measurement harness and the committed baseline are about, and still what the
soldiers are built on.
Both figures remain in the project, and they face opposite ways in their glbs, so
the yaw flips with the asset. The speakers in the script take the new name, because
a line must be spoken by somebody standing in the room.
Two defects the swap exposed, both of the kind that make a check quietly weaker
rather than red:
* **The cast stopped being counted.** A skinned figure keeps its meshes on the
skeleton rather than in `Parts`, so the director reported it as *nought* parts
and the check that reads that count to catch an empty frame went from 94 parts
to 50 — the set alone. It reports 57 now, seven of them the body, eyes, brows,
teeth, hair, tunic and boots.
* **The figure was 22.29 MB**, of which images were 20.65 and geometry 1.64, and
8.86 was `male_casualsuit05_normal` — a normal map. `SkinnedModel` asks a
primitive for its `baseColorTexture` and `SkinnedEffect` has one sampler slot,
so an ambient-occlusion, normal or roughness map is bytes nothing will ever
read. They are unlinked before export and the rest capped at 1024 on the
longest side; the skin keeps its 2048 because a face is the reason the figure
exists. 22.29 MB → 8.83 MB.
The README's briefing image is regenerated from the scene. Its command now says
`--width 1280 --height 720`, because the script defaults to 960x540 and the image is
not, and because `render_cutscene.py` runs the Debug build while the probes run from
Release — which is how the first regeneration produced a contact sheet of the *old*
figure with nothing anywhere reporting a problem.
Full Changelog: v0.2.0...v0.2.1
MiVic v0.2.0 — the briefing has a man in it
The cast of a scripted scene is no longer built from boxes. A cutscene figure can
now be a **rigged, skinned, textured model**, and the briefing figures are built by
MakeHuman through MPFB2: a real skull, a real skin, a skeleton with an `Idle` clip,
and a moustache painted into the skin map.
Ported, not written: NoPasaranFC's `Graphics3D/Skinning/` stack, MIT and the same
author. A glb is parsed at runtime with SharpGLTF, so it loads identically on
DesktopGL and on Android, and a scene file can name the clip a figure plays. The
figure is posed from the director's own clock rather than from frame deltas, so two
runs of a probe photograph the same moment.
Three bugs in this span were all the same kind — a thing that is present and does
not appear — and all three were settled by reading a file rather than by reasoning:
* Assets added before the rig are exported *unskinned*. `add_mhclo_asset` looks
for a skeleton and, finding none, does `clothes.parent = basemesh` and stops,
with no warning. The body proxy was in the glb the whole time, at 13,652
vertices, with no JOINTS_0 and no WEIGHTS_0, which renders as absent. That is
why the frame was byte-identical with and without it.
* The visible body is a *proxy* and `base.obj` is a stand-in that is never meant
to be seen. Blender hides it behind a MASK modifier, and `export_apply=False` —
which skinning requires — is exactly what discards that mask.
* A generated model is coloured by a map found beside it by name; an imported one
carries its own. `SkinnedModel` had been reading the embedded textures all along
and `CutsceneAssets` was overwriting them. The model's own material wins now,
which needs the loader to say "no material" and "would not decode" with two
different values, because one value cannot mean both.
The generator aims bones at directions instead of rotating them by guessed angles —
one `rotation_difference`, carried through the chain by assigning `pose_bone.matrix`
— because the rest pose is a 48-degree A-pose and MakeHuman's pose pack ships a
`t-pose.json` and nothing else. The moustache is painted into the skin map, placed
by measuring the mesh: the head is found from the head bone, because in the rest pose
the fingers reach further forward than the nose does.
`docs/MAKEHUMAN.md` is the guide, and it is the deliverable that was asked for: two
installation roots when only one has `clothes/` in it, the API calls that are silent
no-ops in the wrong order, and how to check the result. `docs/ART_PIPELINE.md` §2.6
records the three causes above.
Full Changelog: v0.1.1...v0.2.0