Netcode: receiver-side paint reveal gate + fur pipette gating

Hide remote avatars until this client has actually applied a snapshot
reaching the owner-published baseline cutoff, preventing the default
grey/white material from flashing before a player's painting has loaded.

- PlayerPaintSync: owner-authoritative _publishedCutoff NetworkVariable,
  receiver tracks _appliedCutoff; explicit blank publish for never-painted
  avatars so they still reveal.
- NetworkPlayerSetup: cache _paintSync, hide body renderers on spawn, gate
  UpdateVisibility on PaintRevealReady.
- MeshPainter.Pick: fur toggle now follows pickedHeight (own paint-mesh
  only), matching the Occlusion/Height pipette behaviour.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 4.8 committed 2026-07-04 12:08:46 +02:00
1 parent 49704448e9
commit ed09d6a1b0
3 files changed
+47 -6

No files matched your search

@@ -8,8 +8,9 @@ public partial class MeshPainter
[Header("Brush - pipette (eyedropper)")]
[Tooltip("Pipette mode: a click samples the channel values at the hit point on ANY surface " +
"(albedo, metallic, smoothness, emission) and adopts them into the brush (opacities/alphas " +
"left untouched) instead of painting. Height (occlusion) is adopted and its toggle enabled " +
"only when our own paint mesh is picked; any other surface disables the height toggle. On a " +
"left untouched) instead of painting. Height (occlusion) and fur length are adopted and their " +
"toggles enabled only when our own paint mesh is picked; any other surface disables those " +
"toggles and keeps their values. On a " +
"foreign object the data channels are read texel-exact from the material; albedo follows " +
"'Pipette Albedo From Screen'. Held button picks once.")]
public bool pipette = false;
@@ -84,9 +85,10 @@ public partial class MeshPainter
paintMetallicSmoothness = true;
paintOcclusion = pickedHeight;
paintEmission = true;
// Fur toggle always turns on with a pick; the length is only adopted off our own paint mesh
// (pickedHeight), so a foreign-surface pick enables fur but leaves furLength at its current value.
fur = true;
// Fur mirrors height/occlusion: adopted and its toggle enabled only when our OWN paint mesh was
// picked (pickedHeight, where furLength was sampled); any other surface disables the fur toggle
// and keeps furLength.
fur = pickedHeight;
pipette = false;