Add appearance tint syncing (appearance v3)

Introduce tint syncing for skin/complection/makeup/beard by adding RemoteAppearanceTint and a tints vector, and bump appearance payload version to 3. Parse/emit tints in networking and update fake server/client test payloads. Capture live Player/NPC tintingData during appearance capture. Apply tints to proxies by updating existing entries or reconstructing missing ones via template resolution and MakeTintEntry (game allocator + vtable fixup); unresolved templates are skipped with throttled warnings. Update docs/changelog and add logging for applied tints. Backwards compatible with v1/v2 packets.
This commit is contained in:
2026-06-30 22:07:49 +12:00
parent 5b54db64d4
commit 76fd8772bd
10 changed files with 317 additions and 9 deletions
+16 -1
View File
@@ -59,9 +59,23 @@ namespace F4T::RemotePlayerState
float scale[3]{ 1.0F, 1.0F, 1.0F };
};
// Character tint layer (TESNPC/PlayerCharacter tintingData entry).
// Drives skin tone, complexion, makeup, dirt, scars, and beard shade.
struct RemoteAppearanceTint
{
std::uint16_t id{}; // idLink, matches a race tint template uniqueID
std::uint32_t type{}; // BGSCharacterTint::EntryType (mask/palette/texture)
std::uint8_t value{}; // tingingValue intensity (0-255)
std::uint32_t color{}; // ARGB packed color (palette entries only)
std::uint16_t swatch{}; // swatchID (palette entries only)
bool hasColor{ false }; // whether color/swatch are meaningful
bool operator==(const RemoteAppearanceTint&) const = default;
};
struct RemoteAppearance
{
std::uint32_t version{ 2 };
std::uint32_t version{ 3 };
std::uint32_t raceFormId{};
float height{ 1.0F };
RemoteAppearanceMorphWeight morphWeight;
@@ -72,6 +86,7 @@ namespace F4T::RemotePlayerState
std::vector<RemoteAppearanceMorph> morphSliders;
std::vector<float> morphRegionSliders;
std::vector<RemoteAppearanceFacialBoneMorph> facialBoneMorphs;
std::vector<RemoteAppearanceTint> tints;
};
struct RemotePlayerState