Решили: свечение оружия при касте адресуется по РОЛИ части. Роль живёт компонентом-меткой
UnitPartRole на узле части скелета (Weapon/Shield/Limb/Body), а само свечение — три поля в
общем BodyVisualState (Glow/GlowColor/GlowRoles), не отдельный канал. Каждое тело само решает,
светится ли его часть (SkeletalBodyVisual — по пересечению роли с маской; SpriteBodyVisual —
целиком), и передаёт готовый partGlows в BodyShaderIds.Write.
Почему: роль принадлежит ЧАСТИ (клинку), а не порядку в SkeletalBodyVisual._parts — метка на
узле переживает пересборку списка частей, тогда как параллельный List<PartRole> рассинхронился бы с
_parts на первом же RebuildParts. Свечение поверх общего состояния, а не вторым писателем в
UnitView: меч обязан И светиться сам, И вспыхивать со всеми при ударе — второй независимый канал
развёл бы одно тело по двум владельцам. Write не выводит свечение из маски сам (не знает ролей
части) — признак вычисляет тело, поэтому покадровое тело без ролей светится целиком без спец-кейса в
шейдерном слое.
Грабли: Body — одновременно неймспейс (Guildmaster.Presentation.Body) и свойство вида
(IUnitBodyVisual Body). В объявлении типа Body.PartRole резолвится в неймспейс, а в ВЫРАЖЕНИИ
(roles == Body.PartRole.None) — в свойство, и компиляция падает CS0236/CS1061. Снято алиасом
using PartRole = Guildmaster.Presentation.Body.PartRole; в UnitView.
Владелец правды: PartRole.cs, UnitPartRole.cs, SkeletalBodyVisual.cs (кэш ролей +
partGlows), BodyShaderIds.cs (Write), тест FeelToggleCoverageTests (тумблер EnableCastGlow).