The orbit rig read the wheel unfiltered for zoom, so scrolling a paint-mode
scroll list also zoomed the camera. Gate the zoom behind a shared
InputUtil.PointerOverUi() helper (EventSystem raycast); MeshPainter's private
IsPointerOverUi() now delegates to the same helper (DRY).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The FreeCamera's CharacterController stayed enabled permanently, so its
invisible capsule sat in the play area at (0,1,0) and blocked players even
when the freecam was not in use: the controller script disables only itself
in Awake, not the independent CharacterController collider.
Keep the capsule out of the physics world unless the freecam is actually
flying: disable it in Awake and toggle it with SetActive (enabled before the
teleport in SyncToCurrentView, which preserves the current enabled state).
Also ignore collision against all live players instead of just the first on
each activation, since Physics.IgnoreCollision is reset when the capsule is
toggled off and back on.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The orbit camera suppressed wheel zoom whenever Shift/Ctrl was held, to
reserve Shift/Ctrl+wheel for the paint brush resize. But Shift is also
the sprint key, so sprinting blocked zoom outside paint mode.
Gate the reservation on PanEnabled (set only by PaintMode.Enter/Exit), so
the wheel is only claimed for brush resize while actually in paint mode;
otherwise it zooms normally.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Move scripts under Assets/Scripts/ into Components, GameMode, Helper,
Network, Enum, Struct and ScriptableObject folders. Pure file moves
(plus folder .meta files); no code changes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>