- Generated concealment colliders for The Room (Fortuny ON base/top)
- Main + The Room scene edits, Wall_White material variants
- ProjectSettings churn (PackageManager, ProBuilder settings)
- .gitignore: exclude imported Allsky / ArchVizPRO Vol.6 / Isle of Assets packs
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Clamp override was off (value 65472 = effectively unbounded), so single
bright HDR pixels pulsed the bloom frame-to-frame. Clamp on at 80,
threshold 0.6->0.8, intensity 0.2->0.3.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- PoseIconStage: permanent editor capture pipeline (context menu 'Capture All Icons') — renders each entry at 4096x4096, alpha-crops, writes Icon_pose_*.png and wires sprites onto matching PlayerPose assets
- PlayerPose: new iconScale property (0.1-2), applied to the icon child in PoseMenu's radial layout
- OverviewMenu: paint-mode special-case removed — Esc/Tab opens the overview menu in every mode
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cel-shaded white body with tinted shadow band plus inverted-hull
clip-space outline (constant screen width, works in deferred via
SRPDefaultUnlit). Key light added to the Pose Icon scene, material
wired to the Paintman.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Applies a pose clip plus root position/rotation to the staged Paintman
for authoring pose icons (screenshot pipeline follows later).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
With a small pose set (hunter) the pose button and C hotkey advance
to the next pose immediately instead of opening the radial overlay.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PlayerPose: Icon (Sprite) + Title (string) UI properties
- PoseMenu: modal pause overlay building a radial menu from Icon Button
prefab instances; active pose disabled (hover ring marks it); click
applies pose via SetPoseIndex and closes
- OverviewMenu: pose button wiring with pause hand-off, Esc/Tab chain
extended; hotkeys C (toggle pose menu) and V (paint mode) mirroring
the buttons incl. identical gating
- PlayerPoseController: C cycle hotkey and NextPose() removed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The center re-probe could miss the still-touching climbed face and adopt
a hit on a different collider much farther out, flipping the wall normal
and letting the standoff servo drag the capsule across the pinch every
other frame. When the probed gap is well beyond the standoff and the
full-capsule span still holds a steep surface meaningfully closer, keep
that contact instead of defecting to the far hit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- OverviewMenu: taunt button (manual ping + close, hider/seek-only), Tab triggers the Escape chain (TypingGuard-gated)
- GameModeManager: LocalPlayerIsHider helper, allow E-ping in free cam (Q/E no longer used for movement)
- FreeCamController: vertical movement only via Space/Ctrl
- Icons: Icon_taunt (wired), Icon_firstperson_paint (unwired, for later)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Scene edits wiring the new Icon Button prefab/icons into the Overview
menu (includes the usual re-save YAML reshuffle) plus TMP font SDF
atlas churn from the UI work.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New Match Results menu + button (user authoring), MatchResultScreen
_panelRoot reference; includes the usual re-save YAML reshuffle.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MatchResultScreen becomes a self-contained modal (IsOpen/Open/Close,
_panelRoot, pause handling); resolution auto-open moves there from the
session browser. OverviewMenu integrates it into the Esc chain and hides
the Match Results button until results exist (same pattern as the
role-scoped mode buttons).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Overview UI canvas active, OverviewMenu component wired to panel,
browser reference and mode buttons; includes YAML reshuffle from the
scene re-save (content verified unchanged).
- EditorSettings: known 1-line churn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New OverviewMenu component: Esc toggles the pause overlay, buttons
switch modes via GameModeManager.TrySwitchTo<T>() and close the panel;
visibility follows the role-scoped mode set, active mode disabled.
- Esc in paint mode exits to camera mode instead (PlayerControlMode,
hunter falls back to FirstPersonMode) rather than opening the menu.
- Centralized all Esc handling in OverviewMenu (browser close included)
to avoid frame races; OnlineSessionBrowserUI gains IsOpen/Open/Close.
- GameModeManager: switchKey Tab-cycle removed, TrySwitchTo<T> added.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The Room export split/renamed to 'The Room Scene.asset' / 'The Room Audio.asset' under Assets/Scenes (old root-level export removed), scene references updated
- Default Steam Audio material: transmission raised (0.8/0.6/0.3) so walls dampen less aggressively
- EditorSettings: enter-play-mode options reset
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SteamAudioGeometry on Map root (exportAllChildren) + exported static
mesh asset so occlusion raycasts have scene geometry to hit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New occlusion opt-in on SoundEffect: spatialized instances get a
SteamAudioSource with raycast occlusion + frequency-dependent
transmission (walls muffle instead of hard-mute)
- Replace SoundEffectDistanceRange asset indirection with an explicit
_3d bool (user refactor); rolloff/distance now left to defaults
- Hey.asset: occlusion enabled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New Assets/Audio/ with Hey.asset (+ ogg samples), Sound Effect
Distance Range moved there; Main.unity wires Hey.asset to the
MatchManager radar ping; The Room AudioSource tweak and regenerated
Player.prefab GlobalObjectIdHash (editor churn).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MatchManager: new Radar Ping Sound property; MsgRadarPing now goes to
all clients (spawnBlips flag keeps blips hunter-only), sound plays 3D
at each pinged hider. Distance-based stagger (speed of sound + 35 ms
min gap) prevents phase cancellation when multiple hiders ping.
SoundEffect: new spatialize toggle (per asset, applied only to 3D
instances -> Steam Audio HRTF); removed unused fade field.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Official Unity package under Assets/Plugins/SteamAudio; enabled as
Spatializer + Ambisonic Decoder in the audio settings (HRTF: sounds
behind the listener are filtered/muffled directionally). Download
staging Tools/SteamAudio/ gitignored.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Particles kept playing at the last hit position when the cursor left the
mesh mid-stroke. New _stampLandedThisFrame flag: reset before each stamp
attempt, set only where the dab actually paints (after placement and
corner guard); no landed stamp -> StopPaintParticles immediately.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Enthält zwangsläufig auch den PaintHud-RectTransform-Churn (Prefab-Override-Anker/Größen) — Szenen-File nicht splitbar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Cursor_Normal/Paint/Pipette: generierte Grafiken jetzt in Vollauflösung (766-829 px, Max Size im Importer steuert Anzeigegröße), Paint-Ring-Inneres freigestellt
- Neuer Cursor_Blank (transparent): wird während eines Strokes auf dem Mesh gesetzt statt Cursor.visible zu togglen (fixt Flicker-Kampf mit dem Orbit-Input)
- CursorController: Hotspots normalisiert (0-1, unabhängig von Import Max Size); Zustandskette Pipette > (Stroke ? Blank : Paint) > Normal; off-mesh während Stroke -> Normal
- MeshPainter: StrokeInProgress-Flag (Maustaste auf Paint-Pfad gehalten)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Scene file can't be split: also carries PaintHud anchor/size re-serialization
from the layout pass.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- CursorController: polls painter state in LateUpdate; paint cursor only
while the brush preview decal actually draws (MeshPainter.BrushPreviewVisible),
pipette while held/toggled, fallback to normal over UI (InputUtil.PointerOverUi)
- Auto ForceSoftware while Unity Recorder is recording (reflection into
editor-only assembly, 0.5s poll, editor-only) so the cursor is captured;
back to hardware cursor when recording stops
- 3 placeholder cursor PNGs (32x32, cursor import type) with per-cursor hotspots
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
IsGloballyEnabled() kill switch: Awake destroys the component at
runtime, OnEnable self-disables in the editor. Flip the constant to
re-enable.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Distanz-LOD am Renderer (Start/End/Min Shells, pro Kamera), Rendering Layer Mask wie beim MeshRenderer
- Cutout in der AlphaTest-Queue statt Transparent-Blend (Early-Z killt Overdraw), Shells tip-to-root submitted
- LightMode UniversalForwardOnly (Deferred+ hatte den Opaque-Pass sonst nicht gezeichnet)
- FurGBuffer-Pass (ComplexLit-Muster): HTrace WSGI sieht das Fell, kein Durchscheinen mehr
- Root-AO-Fix: Grading straehnen-relativ (gradeH) statt absoluter Shell-Hoehe -- schwarze Streifen weg
- Distanz-Aggregations-Fade wieder entfernt (auf Wunsch, Fern-Straehnen bleiben voll)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Transparent queue sorted fur draws per object, so overlapping fur
renderers swapped in front of each other frame to frame. FurForward
now writes depth; new Depth Sort Clip tunable discards low-coverage
fragments before they write depth (avoids halo punch-through).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The mixer's start snapshot overwrites exposed params set before the
first frame, so the BeforeSceneLoad SetFloat was discarded. Re-apply
the saved volume after one frame (Awaitable.NextFrameAsync).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Generated _normal/_height maps for all frame photo textures (DeepBump)
- The Room: picture frame pass; Lobby/Test Map scene passes
- AudioMixer: unmute group
- New layer 8 "BlockCam" (TagManager) + Main Camera culling mask includes it
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shader (PictureTessellationLit):
- Lighting parity with URP Lit: lightmaps, shadowmask/mixed, APV, DBuffer
decals, vertex additional lights, rendering layers, fragment fog
- UniversalGBuffer pass (with tessellation + graded albedo) so HTrace WSGI
composes correct GI instead of a cyan veil over pictures
- Skip GPU tessellation entirely when strength/displacement is 0
- Inspector ranges matched to builder (-3..3 bump, -10..10 tessellation)
Builder:
- Frame Thickness & Padding are now absolute meters (size-independent)
instead of fractions of the picture size
- Tooltip updates for the new default/range semantics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Generated _normal/_height PNGs for the P10027xx photo set, wired height maps
and strength values on scene frames, Frame Picture material switched to the
new PictureTessellationLit shader.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Optional Picture Normal Map + Height Map fields on the per-frame material
instance (_BumpMap/_NORMALMAP keyword, _HeightMap; height doubles as
occlusion map when the material has none)
- Sliders: Normal Map Strength, Occlusion Strength, Tessellation Strength
(0-3, default 1), Occlusion Contrast (-1-3), Brightness (0-3)
- Picture Crop left/right/top/bottom via UV window remap; aspect follows
the cropped pixel dimensions
- Picture Subdivisions (1-64): picture surface as triangle grid for
tessellation displacement
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hull/domain tessellation with height-map displacement, occlusion map with
strength/contrast controls, height-weighted brightness multiplier, standard
PBR (base/normal/metallic/smoothness). ComplexLit pattern (UniversalForwardOnly)
so custom shading survives Deferred+; ShadowCaster/DepthOnly/DepthNormalsOnly
all run through the same displacement domain.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Right-click a texture > Process > Generate Normal + Height Map (DeepBump):
runs the DeepBump ML CLI (color_to_normals, then normals_to_height) in the
background with progress display. Sources larger than 2048px are downscaled
via Pillow/Lanczos first (quadratic tile cost, avoids grid seams). Normal
imports as Normal Map, height as linear (sRGB off). Tool lives outside
Assets under Tools/DeepBump (gitignored: cloned repo + local venv).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Enable mipmaps on the existing photo texture imports and add the new
IMG_20250412 photo set; scene pass in The Room.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The renderer wiring had flipped it to Base; as a Base camera with
Don't Clear it rendered fullscreen into an uninitialized target
(RenderGraph debug yellow). Overlay restores stack compositing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Classic hit path now captures a statue record like conversion does;
rename the statue infrastructure (CaptureStatue/SpawnStatues/
DespawnStatues/_statueRecords) since it is no longer conversion-only.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A pointer-up after a drag no longer counts as a click (dragging flag +
press-to-release distance within the existing tolerance), so drag ->
release -> click cannot trigger a reset anymore. PaintHud prefab:
pointer tolerance 4 px, HalfLambert default back to 0.5.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Also serializes wallStepOffset on Player prefab and includes SliderDoubleClickReset wiring in Main (mixed scene edits).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Content pass: new photo textures, picture frames built with
PictureFrameBuilder in the scene, Frame Inner.mat tweak; removed the
now-obsolete photo materials and Paint prefab variants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Assigned texture drives the picture material BaseMap via a per-frame
material instance (asset untouched, frames sharing a material stay
independent) and takes priority for aspect resolution. New default
picture material Frame Picture.mat wired in the script defaults.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Frame thickness, corner radius, padding, inner depth and picture depth
are now normalized factors (scale with Size, no dead clamp zones).
Picture aspect is computed inside-out so padding and frame thickness
no longer distort the image. New Frame Inner.mat as inner default.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace Width/Height with a single Size (longer side); the shorter side
follows the picture material's base map source-image aspect (editor-
resolved, serialized for builds, 1:1 fallback). Add Range attributes on
all frame parameters and default material references (new Frame.mat).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PictureFrameBuilder test frame now carries its 6 generated BoxColliders
(pictureDepth -0.05 pedestal case) plus the usual regenerated
SkyboxReflection cubemap churn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rebuild now runs once per frame via ExecuteAlways Update (OnValidate only
sets a dirty flag + QueuePlayerLoopUpdate), fixing inspector drag stutter
from stacked delayCalls. Adds automatic BoxCollider generation (4 frame
bars, opening slab, optional pedestal box for raised pictures) with an
ownership list so manual colliders stay untouched. Corner radius is
intentionally ignored for colliders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Includes the migrated frame values (Inner Depth 0.1, Picture Depth -0.05)
and the usual regenerated SkyboxReflection cubemap churn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
HeroCutoutLit.shader and its HeroCutout.hlsl include are in active use
(hero cutout occluder material); Assets/Shaders/ is the established
home for shader code. GUIDs preserved via .meta move, relative include
path unchanged - no references break.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The MotionVectors pass (drawn by HTrace and URP against the real camera
depth buffer) was stock URP: no cutout clip and ZWrite on, so it wrote
the wall depth back into the hole after opaques. The skybox then failed
the depth test there (black disc) and all screen-space effects
(SSAO/GI) shaded the hole with the occluded wall's depth.
The pass now runs ApplyHeroCutout before URP's fragment entry point.
ObjectMotionVectors.hlsl forces its own entry via include_with_pragmas,
so the pragmas are declared explicitly and the file is plain-included.
Complements the earlier GBuffer clip; XR MV pass and ShadowCaster stay
stock on purpose. Includes render-queue churn on the occluder material.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds the ping-pong processed TV video and a VideoClipPlaylist on the
Video object (one item, full range, loop). Includes regenerated
SkyboxReflection cubemap churn from SkyboxEnvironmentUpdater.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>