Commit Graph
210 Commits
Author SHA1 Message Date
adminandClaude Fable 5 c6b67faa60 Add Overview UI icon set, Icon Button prefab and hover/disabled ring
- 7 generated icons (settings, statistics, paint, freecam, thirdperson,
  firstperson v3 viewfinder, spectator eye) + hand-painted hover ring,
  full-res PNGs imported as sprites (max size 256)
- Icon Background texture (user asset)
- IconButtonHover: shows the Hover child on pointer hover or while the
  button is non-interactable (doubles as active-mode marker)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 14:46:41 +02:00
adminandClaude Fable 5 7669ae1b66 Complete Match Results modal: standalone overlay, auto-open on resolution
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>
2026-07-12 12:55:05 +02:00
adminandClaude Fable 5 7ac6038121 Add OverviewMenu escape menu, remove Tab mode cycling
- 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>
2026-07-12 12:34:12 +02:00
adminandClaude Fable 5 4c63a5e5dd Audio: radar taunt at head height + Steam Audio source tuning
- MatchManager: taunt positions resolve the FirstPersonTarget child instead of the player root (shared TauntPosition helper, root fallback)
- SoundEffectInstance: physics-based distance attenuation + raycast occlusion on runtime SteamAudioSource

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 00:26:01 +02:00
adminandClaude Fable 5 706100e322 Audio: per-SoundEffect occlusion via Steam Audio + 3D flag refactor
- 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>
2026-07-11 23:33:29 +02:00
adminandClaude Fable 5 0172a1e834 Radar ping taunt sound + per-SoundEffect spatialize opt-in
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>
2026-07-11 23:11:39 +02:00
adminandClaude Fable 5 1d5676ab3c Stop paint particles when no stamp lands during a held stroke
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>
2026-07-11 22:21:56 +02:00
adminandClaude Fable 5 094cf3a493 Paint-Partikel beim Malen: Emission pro Stamp, Scale = Brush-Radius, Farbe = Brush-Albedo mit Helligkeits-Streuung
- MeshPainter: Paint Particles Prefab, lazy Instanz, Play/Stop am Stroke, MinMaxGradient (Albedo +-25%/15% dunkel/hell)
- PaintSplatter.prefab + Paint Particle Material/Textur, Wiring am Player.prefab
- FurShellRenderer: Kill-Switch-Destroy nur im Play-Mode (Edit-Mode-Error beim Prefab-Load)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 22:13:16 +02:00
adminandClaude Fable 5 423a2d15ec Cursors: Krea-Grafiken in voller Auflösung, Blank-Cursor beim Malen, normalisierte Hotspots
- 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>
2026-07-11 21:35:36 +02:00
adminandClaude Fable 5 ae5fa63141 Custom mouse cursor: normal/paint/pipette with recorder-aware software mode
- 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>
2026-07-11 18:09:14 +02:00
adminandClaude Fable 5 39ab1a3ced Disable FurShellRenderer globally (not production-ready yet)
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>
2026-07-11 17:48:29 +02:00
adminandClaude Fable 5 b4e4c19e54 FurShell: Performance-Umbau (Distanz-LOD, Cutout+Early-Z, Tip-to-Root) + Deferred+/HTrace-Fixes
- 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>
2026-07-11 16:59:38 +02:00
adminandClaude Fable 5 874ddccb4f FurShell: per-pixel z-order between fur objects (ZWrite On + coverage clip)
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>
2026-07-11 14:30:47 +02:00
adminandClaude Fable 5 38b9369051 Fix master volume not applied on startup
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>
2026-07-11 13:06:44 +02:00
adminandClaude Fable 5 57a4627b81 PictureFrameBuilder/Shader: lighting parity, HTrace GBuffer pass, absolute frame metrics
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>
2026-07-11 12:30:19 +02:00
adminandClaude Fable 5 defd970cf8 PictureFrameBuilder: normal/height maps, strengths, crop, subdivisions
- 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>
2026-07-11 00:25:49 +02:00
adminandClaude Fable 5 8a5f5fd832 Add DeepBump normal + height map generator editor tool
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>
2026-07-11 00:25:30 +02:00
adminandClaude Fable 5 eeaf45aa8f Nameplates: run positioning in Update instead of LateUpdate
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 22:37:19 +02:00
adminandClaude Fable 5 a2a0e85831 Spawn hider statues in resolution phase for classic mode too
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>
2026-07-10 22:37:11 +02:00
adminandClaude Fable 5 14015d7134 Ignore drag-releases in slider double-click reset; tune HUD slider defaults
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>
2026-07-10 22:37:03 +02:00
adminandClaude Fable 5 7fb0ff54b1 Add double-click-to-reset on all sliders (interval + pointer tolerance) and sync PaintHud slider defaults
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:28:22 +02:00
adminandClaude Fable 5 b30db72e0c Add ledge grab: walking over an edge attaches to the wall below (not while sprinting)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:28:22 +02:00
adminandClaude Fable 5 66f890869f Move Play Scene window menu entry to Tools/Play Scene
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:26:04 +02:00
adminandClaude Fable 5 0be503c927 Add SoundEffect audio system (ScriptableObject-based) with test assets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:25:56 +02:00
adminandClaude Fable 5 5dbdc0e6b2 Add Picture Texture field to PictureFrameBuilder
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>
2026-07-10 07:53:54 +02:00
adminandClaude Fable 5 6a15a68a2e Make picture frame properties relative and fix picture aspect ratio
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>
2026-07-09 21:32:19 +02:00
adminandClaude Fable 5 850c92bcce Derive picture frame size from picture texture aspect ratio
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>
2026-07-09 20:33:18 +02:00
adminandClaude Fable 5 5c6657d9d0 PictureFrameBuilder: auto box colliders + coalesced rebuild in Update
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>
2026-07-09 20:07:54 +02:00
adminandClaude Fable 5 210d0adc3e Add PictureFrameBuilder procedural picture frame component
Editor-tunable frame mesh: sliced scaling (constant profile), 4 material
submeshes (picture/interior/frame/back), padding, frame thickness/depth,
rounded outer edges (quarter-cylinder strips + eighth-sphere corner caps).
Frame Inner Depth sets the interior plane; Picture Depth is relative to it
(positive = recessed, negative = raised pedestal) with auto perimeter walls.
Meshes are per-instance, DontSave, rebuilt in OnEnable/OnValidate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 19:19:59 +02:00
adminandClaude Fable 5 36ce4a66df Add VideoClipPlaylist component for sequential gapless clip playback
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>
2026-07-09 16:38:57 +02:00
adminandClaude Fable 5 ff01e07fa1 Add editor tool to create ping-pong videos from VideoClips via ffmpeg
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>
2026-07-09 16:09:34 +02:00
adminandClaude Fable 5 ae36b2076d Add step pass to wall climb for small ledges on walls and ceilings
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>
2026-07-09 15:45:31 +02:00
adminandClaude Fable 5 270c42d85b Add host-configurable match settings persisted in settings
- GameSettings: 7 match fields (mode, hunter count, hide/seek/resolve
  durations, radar ping interval/lifetime) with authored defaults
- MatchSettingSlider (new): enum-driven panel binder, seeds from
  settings, saves on change; lifetime label shows one decimal
  (invariant culture)
- MatchManager: ApplyHostMatchSettings() on StartMatch (clamped);
  phase message now carries ping interval so clients tick correctly

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:04:54 +02:00
adminandClaude Fable 5 0ab92933de Support styled multi-text nameplate label containers
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>
2026-07-08 20:40:56 +02:00
adminandClaude Fable 5 4c6a452f9d Fix late joiners never seeing earlier peers behind the paint reveal gate
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>
2026-07-08 20:40:48 +02:00
adminandClaude Fable 5 b71cd61533 Add match result evaluation with live scoreboard in the Esc menu
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>
2026-07-08 20:40:36 +02:00
adminandClaude Fable 5 262a20326a Hide hider nameplates from hunters during seek phase
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>
2026-07-08 15:05:48 +02:00
adminandClaude Fable 5 0e7ce0c410 Add player names: settings persistence, replication, screen-space nameplates
- 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>
2026-07-08 14:58:15 +02:00
adminandClaude Fable 5 78ab6e2dd6 Fix wall climb on thin boards: rim detection, vault, edge-normal hardening
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>
2026-07-08 12:51:34 +02:00
adminandClaude Fable 5 6c03e5d3f6 Refactor Assets/Scripts: trim restating comments, minor structure cleanups
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>
2026-07-08 08:29:18 +02:00
adminandClaude Fable 5 eeee5fc2f0 Refactor PlayerCharacterController: volumetric climb probes, slim comments
- 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>
2026-07-08 08:09:12 +02:00
adminandClaude Opus 4.8 e5b5138232 PlayerController: robust wall-climb hold on thin boards
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>
2026-07-08 07:23:56 +02:00
adminandClaude Opus 4.8 f4d31b0c24 ConcealmentMeter: add per-collider AABB broadphase in the voxel loop
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>
2026-07-08 07:23:48 +02:00
adminandClaude Opus 4.8 50781e32d2 Camo: generalize brightness + add persistent saturation
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>
2026-07-08 07:23:40 +02:00
adminandClaude Opus 4.8 deee9d6ca1 Add SkyboxEnvironmentUpdater: runtime sky reflection + ambient
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>
2026-07-07 18:18:59 +02:00
admin b74123188b Setup lighting (GI, AO) 2026-07-07 13:28:49 +02:00
admin 669b4e1308 Add Majoras Mask, update gitignore 2026-07-07 11:16:43 +02:00
adminandClaude Opus 4.8 1fbd66095c Radar ping: anchor sweeps to seek start so they stay in sync with the HUD
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>
2026-07-06 22:36:59 +02:00
adminandClaude Opus 4.8 ee01b3b8ab MeshPainter: resample saved paint to avatar resolution on load
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>
2026-07-06 22:36:53 +02:00
adminandClaude Opus 4.8 9d16524ded FurShell: remove scale-influence, curvature scales with player scale
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>
2026-07-06 17:31:05 +02:00