Plays a list of items (clip + percentage range) on a VideoPlayer.
Double-buffers via a second player (auto-created child incl. AudioSource
copy) and drives the screen texture through a MaterialPropertyBlock,
flipping only once the next player delivers frames - no black/freeze gap.
Editor drawer renders each item as clip row + min-max percent range slider.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Right-click a VideoClip -> Process -> Ping-Pong Video: runs ffmpeg in the
background (forward + reversed video concat, audio played twice), writes
<name>_pingpong.mp4 next to the source and imports it. Supports
multi-select, silent clips (video-only retry), progress display and
unique output paths.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New TV Video material + environment video clip on the plasma TV
- New P1002728 photo material/texture, P1002712 texture, three new
paint prefab variants
- Living-room prefab variants updated across the set
- Remove stale generated concealment collider PolyShape assets
- The Room scene content pass
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ground-stepOffset analogue for climbing (wallStepOffset, default 0.1):
when climb movement is blocked by a small ledge, the capsule lifts
along the wall normal in pre-swept sub-steps and continues, with a
short servo hold to prevent being pulled back into the ledge. Ground
detach while climbing down now requires floor that extends away from
the wall, so narrow step tops no longer cause a mid-wall exit.
Wall->ceiling handoff additionally checks OverheadIsPassableStep():
if the overhead surface is only a small protrusion within the step
allowance, the handoff is skipped and the step pass carries the
capsule over the edge. Genuine overhangs hand off unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New IMG_20250412_132757_908 texture/material on a quad, level edits,
regenerated skybox reflection cubemap churn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Main: match results section (winner banner, summary, header + row
template) authored inside the session panel and wired as the result
screen's section root; nameplate template restructured into a
NameLabelContainer with styled texts using the custom font. The Room:
regenerated SkyboxReflection cubemap serialization churn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The atlas was generated at sampling 159 with padding 4 (~40:1 instead
of the required ~10:1), so at small render sizes the SDF edge smoothing
could never reach zero alpha at the glyph quad border - every character
rendered a faint translucent rectangle. Regenerated in place (same
asset/GUID/material): sampling 85 / padding 8, gradient scale 9, full
Latin-1 charset (native umlauts instead of fallback mixing), kerning
pairs rebuilt. LiberationSans fallback asset picks up the current
serialization format from the re-save.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PlayerNameplates clones a GameObject container instead of a single
TMP_Text and drives all TMP_Text children (text + distance font size),
so the label template can be authored with layered texts (e.g. outline
or shadow copies) in the editor.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Applying a snapshot now also raises the replica's sequence horizon: a
snapshot covers all events up to its captured cutoff. Previously the
horizon only advanced with the live stamp stream, so the server replica
of a player who never painted served snapshots with cutoff 0 - late
joiners then waited forever for the published baseline cutoff and the
reveal gate never opened (third client could not see the second).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MatchManager tracks per-participant outcomes from match start (hunter /
hiding / found / converted / left), freezes hit rows with seek time and
finder name, and decides the winner at seek end (any untouched hider ->
hiders win). Results replicate via a Match_Result named message,
broadcast live on hide start, every hit and mid-match leave (no-op once
the winner is frozen), with late joiners served the current state.
MatchResultScreen renders the scoreboard as a section of the session
panel: winner banner ("Match in progress" while live), summary counts
and pooled rows (name, outcome, time, found by); the section hides when
no result data exists. OnlineSessionBrowserUI auto-opens the Esc
overlay when the Resolution sub-phase begins.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Generalize the body-renderer gate to all avatars so nameplates inherit
the existing visibility matrix (hide phase, found hiders, paint reveal,
conversion settle), and add the one case the body gate cannot cover:
hunters see camouflaged hider bodies during seek, so suppress hider
names for a local hunter viewer while LocalSubPhase == Seek.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- GameSettings: playerName field persisted in Settings.json
- NetworkPlayerSetup: owner-written DisplayName NetworkVariable
(seeded from settings on spawn, sanitized/truncated, live rename push)
- PlayerNameField: binds the session panel name input to settings
- PlayerNameplates: screen-space overlay labels above players with
distance-based font scaling (clamped min/max), pooling, FP self-hide
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
HTrace WSGI composites indirect lighting after post-processing using the
GBuffer albedo/occlusion of the player's stock URP GBuffer pass. That pass
knew neither the painted-height AO semantics nor the brightness/saturation
grade, so desaturated paint reappeared fully saturated in shadow/indirect
light and painted height modulated GI with the raw 0.5-centered value.
- PlayerCamoShared.hlsl (new): single source for camo knobs,
ApplyPaintedHeightSurface and ApplyCamoBodyGrade shared by both passes
- PlayerCamoGBuffer.hlsl (new): CamoGBufferFragment = URP 17.3 Lit GBuffer
fragment + height-AO remap on occlusion + grade applied to albedo
- PlayerCamoLit.shader: GBuffer pass now uses CamoGBufferFragment
- PlayerCamo.hlsl: consumes the shared helpers (forward path unchanged)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The swept-sphere probes tilt their contact normal while rolling over a
thin board's edge, which faked slope top-outs, ceiling hand-offs and
bare-rim vaults mid-face. Confirmed via temporary exit-path logging
(stripped again) and fixed at the verified causes:
- RaycastWallFace: confirm "face flattened into a slope" with a thin,
strictly horizontal ray instead of trusting the tilted sphere normal
(a vertical board still reads steep; real ramps still top out).
- Rim judging: the full-capsule span probe is the arbiter — while it
still sees a steep face anywhere along the capsule, re-adopt that true
normal (breaking the tilt self-amplification feedback loop) and keep
climbing; only a persistent rim (wallTopOutConfirm debounce) vaults.
- WallContinuesAbove: band-sampled horizontal sweep so a grazed shelf
edge above never reads as a cleared rim.
- Bare rim: parks by default (upward motion clamped); holding up vaults
over the edge via MantleOverEdge, headroom-gated.
- ProbeWallSpan sweeps strictly horizontally; center probe always
rejects down-facing hits (edge grazes), wall->ceiling hand-off only
via the explicit head-gap check against clearly down-facing surfaces.
- Slope/ground top-outs additionally gated on a genuine stand
(HasStandableTop) so a board's own top edge no longer detaches.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sweep over 48 files (Editor/ excluded): remove comments that restate the
code, condense class summaries, fix three stale doc statements
(HsvColorPicker alpha bar, PaintHud layoutPrefab, MasterVolume
FallbackDefault). Inline two single-use wrappers (IsPointerOverUi,
BuildModes), drop an unused using, replace a magic literal with the
existing ParallaxBase constant, and convert ~10 UnityEngine.Object null
checks to the implicit-bool convention. No serialized fields, signatures,
RPC/NetworkVariable names, defaults, or #if blocks touched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Replace all thin raycast climb probes with capsule-width SphereCasts:
fixes drop on thin boards (mid-face contact never lost, top-out only
fires at the real top edge) and edge flicker on curved surfaces
(continuous contact normal instead of per-frame face flips)
- Remove WallProbeTangentSamples fan fallback (obsolete with SphereCasts)
- Collapse WallInFront/WallPresentAtOffset/WallHitAt into WallPresentAt,
inline ApplyMeshOffset wrapper
- Trim redundant comments, keep non-obvious rationale and tooltips
- No serialized fields removed or renamed (prefab values intact)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
DefaultVolumeProfile gains an HTraceAOVolume override (AO mode, intensity 2,
radius 2). PC_RPAsset flips the SSAO prefilter permutation (interleaved on,
blue noise off, high sample count). URP global settings register the extra
feature rid.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Player.mat gets _Saturation: 0 (neutral). PaintHudPanel renames
Slider_HalfLambertBrightness -> Slider_Brightness and adds Slider_Saturation
(range set for the new -1..0..+ semantics).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ProbeWall now falls back to a horizontal multi-sample fan across the capsule
cross-section when the center ray misses, so a thin/narrow board keeps its
grab instead of dropping after wallExitGrace (which stays at 0.15). The
top-out mantle no longer commits on the first probe miss: it requires the
top-edge signature (wall at foot, moving up, headroom clear) to persist for
wallTopOutConfirm (new tunable, default 0.06s) and uses hardened multi-sample
foot/headroom probes, so a transient mid-face miss or a VHACD hull gap no
longer triggers a false mantle.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cache each environment candidate's world AABB once per evaluation and gate
the expensive per-voxel tests (Collider.ClosestPoint, ContainsWorld, concave
raycast) behind a cheap bounds.Contains prefilter. Collapses the hot loop
from O(voxel x colliders) worth of ClosestPoint/raycast calls to O(voxel x
few) for dense collider clusters (VHACD hulls, furniture), removing the
framedrop when overlapping many colliders. Conservative AABB test never
drops a real hit, so EmbeddedPercent is identical, just cheaper.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Move brightness out of the half-lambert diffuse term to a final exposure
multiply on the whole shaded body color (diffuse + GI + specular), and add
a saturation grade (0 = neutral, -1 = grayscale, >0 = boosted) on the same
final stage. Saturation rides as a 4th component on CamoKnobs (Vector3 ->
Vector4) so it inherits all three persistence paths: HUD JSON, network
replication (_camo NetworkVariable), and painting-slot metadata. Wires the
renamed Slider_Brightness and new Slider_Saturation. Bumps HudFileVersion
and PaintMetaVersion with load-time remaps so existing paintings keep their
look (old 1=neutral saturation remaps to 0=neutral).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reordered/updated the HTrace AO profile reference, MetallicIndirectFallback 1 -> 0 and DebugSceneMismatch 0 -> 1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Added SkyboxEnvironmentUpdater to the scene and switched Environment Reflections to Custom with the generated SkyboxReflection cubemap; unassigned the borrowed Supercyan forest LightingData asset (m_LightingDataAsset -> 0) and lowered ambient intensity to 0.75. Gold material metallic 1 -> 0.9 to soften the reflection look.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New [ExecuteAlways] component that renders the skybox (or an optional override material) into a custom reflection cubemap and refreshes DynamicGI so smooth/metallic materials reflect the sky without a baked LightingData asset. Uses a deferred apply plus a synchronous warm-render so the ambient probe resolves after domain reload; runs the reflection capture as a stripped CameraType.Reflection to avoid the URP MIP-bind error. Exposes reflection intensity (0..4) and optional ambient override.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refreshed brush atlases (Brushes.psb + hard/soft/square PNGs), new DiscordChaos material + texture, and PaintHudPanel slider range/value tweaks.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New Paintman-Wall animation and Pose_Wall asset (authored via the UMotion project) added to the Player's pose list. Player MeshPainter textureSize 1024->512.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Additional ProBuilder mesh work in The Room plus updated ProBuilder shape/select editor settings (Plane shape defaults).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RunSeekPhase fired the interval ping from an accumulating countdown that discarded each cycle's frame overshoot and drifted seconds late over a match, while the HUD ping countdown is anchored absolutely to _seekStartTime. Fire on absolute interval boundaries (n*interval from _seekStartTime) instead, sharing the HUD's anchor so the on-screen timer hits 0:00 the same moment the sweep fires. A missed boundary is skipped, never bursted.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the resolution gate in LoadPaintByName/ReadMapPng. A slot saved at any size is now bilinearly resampled per map to the current avatar's textureSize (new ResampleBilinear/Bilerp helpers, running on the stored bytes with no gamma conversion to match downstream consumption), so any painting loads onto any avatar regardless of the size it was saved at.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
hideDuration 90->120, seekDuration 300->240; radar ping interval and lifetime adjustments plus blip fade defaults.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bundle Microsoft.CodeAnalysis (C#) plus its dependencies under
Assets/Plugins/Roslyn for source-generator / analyzer support.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
FurShell.mat: remove the now-orphaned _FurScaleInfluence serialization.
Player.prefab: _xrayFurStrength tuned to ~0 (fur X-ray glow off).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the _FurScaleInfluence blend (fur stays a constant world length at
any avatar size, as tuned to influence 0) and scale the gravity curvature
droop by the avatar world scale (_FurObjScale) instead, so the bend tracks
the player: hider 0.5 => smaller droop, hunter 1.5 => bigger droop.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds com.unity.multiplayer.playmode 2.0.2 (manifest + lock) for local multi-client testing. Serializes the package's generated PlayMode.meta and VirtualProjectsConfig.json.
Co-Authored-By: Claude <noreply@anthropic.com>
Material now stores the shader's new _FurObjScale/_FurScaleInfluence and
X-ray glow properties (template defaults; FurShellRenderer remains the
single source of truth and overrides them live from the painter).
Co-Authored-By: Claude <noreply@anthropic.com>