Character Appearance Phase 1 Done

Bump appearance payloads to version 2 and add `morphRegions` and `facialBoneMorphs` capture, serialization, and proxy application. Also fix head-part syncing when sender and proxy counts differ by reallocating the proxy array instead of deferring the whole list, and update the Python harness and protocol docs to match.
This commit is contained in:
2026-06-30 17:37:02 +12:00
parent 8ff1a90fa5
commit 5b54db64d4
10 changed files with 346 additions and 32 deletions
+13 -1
View File
@@ -49,9 +49,19 @@ namespace F4T::RemotePlayerState
float large{};
};
// Bone-based facial morph (TESNPC::facialBoneRegionSliderValues entry).
// Mirrors BGSCharacterMorph::Transform (position, rotation, scale).
struct RemoteAppearanceFacialBoneMorph
{
std::uint32_t id{};
float position[3]{};
float rotation[3]{};
float scale[3]{ 1.0F, 1.0F, 1.0F };
};
struct RemoteAppearance
{
std::uint32_t version{ 1 };
std::uint32_t version{ 2 };
std::uint32_t raceFormId{};
float height{ 1.0F };
RemoteAppearanceMorphWeight morphWeight;
@@ -60,6 +70,8 @@ namespace F4T::RemotePlayerState
std::uint32_t facialHairColorFormId{};
std::vector<std::uint32_t> headPartFormIds;
std::vector<RemoteAppearanceMorph> morphSliders;
std::vector<float> morphRegionSliders;
std::vector<RemoteAppearanceFacialBoneMorph> facialBoneMorphs;
};
struct RemotePlayerState