34 Commits
Author SHA1 Message Date
adminandClaude Opus 4.8 cdd9fa9532 MeshPainter: Rückseiten-Abweisung über Flächen-Normale bei großem Brush
Zusätzlich zum Kugel-Test wird die Oberflächen-Normale jedes Texels gegen
die Brush-Normale geprüft (CPU/GPU/Preview). Neues Inspector-Feld
"Brush Max Surface Angle" (90-180°, Default 120°). Bei fehlenden Mesh-Normalen
Degradation zur reinen Kugel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 22:26:35 +02:00
adminandClaude Opus 4.8 1f42c990fb MeshPainter: Kugel-Brush statt Box, cornerGuard entfernt
Stamp testet den Brush wieder als 3D-Kugel (du²+dv²+dn² = r²) statt
als Box (|du|,|dv|,|dn| = r) — konsistent über CPU, GPU-Brush und
Preview. Die Box reichte diagonal bis r·√3 und spannte einen 2r-dicken
Slab entlang der Normale, wodurch an Nähten/Kanten/dünner Geometrie auf
die Gegenseite/Nachbarinseln gemalt wurde. Die Kugel reicht in jede
Richtung exakt r und überbrückt echte 3D-Nähte weiterhin, greift aber
nicht mehr über r hinaus.

cornerGuard war nur ein Pflaster gegen genau diesen Box-Übergriff und
ist damit überflüssig: Config-Felder, Suppress-Check und Helper
(DabWrapsAroundCorner, CornerWrapFraction, InBrushBox, SquareReach)
entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 22:11:41 +02:00
adminandClaude Fable 5 2de153d8fe Add toon shader with outline for pose icon stage
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>
2026-07-12 18:59:15 +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 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 d0d7028ebb Add PictureTessellationLit shader (tessellation + height displacement)
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>
2026-07-11 00:25:38 +02:00
adminandClaude Fable 5 cf794643a6 Fix camo forward pass on Deferred+ (ComplexLit forward-only path, HalfLambert/X-ray restored)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:28:22 +02:00
adminandClaude Fable 5 bdce9ea0c8 Move HeroCutout shader files from Unused to Shaders
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>
2026-07-09 18:34:01 +02:00
adminandClaude Fable 5 6db78397da Apply camo brightness/saturation grade in GBuffer pass for HTrace GI
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>
2026-07-08 13:24:52 +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 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
adminandClaude 9dc8f21528 FurShell: scale-aware length/curvature + X-ray glow mirror
The fur is drawn from a CPU-baked unit-scale mesh whose instance matrix
carries the avatar's world scale, so the extrusion scaled fully 1:1 with
the player (hider 0.5 / hunter 1.5). That read as too-short fur on the
small hider and too-long on the big hunter, and the curvature droop was
sized off the raw unity_ObjectToWorld which doesn't carry the per-instance
scale in the RenderMeshInstanced path.

- FurShellRenderer pushes the avatar's lossyScale (_FurObjScale) plus a new
  Fur Scale Influence (0..1, default 0.5) that blends the fur SIZE between
  fully proportional (1) and a constant world length (0). The shader
  pre-divides the object-space displacement so the net world length follows
  effScale; curl droop and wind use the same effScale, keeping the curl
  SHAPE invariant across avatar sizes and influence settings.
- The body's see-through X-ray reveal (forward half) is mirrored onto the
  visible fur so strands glow WITH the reveal instead of hiding it under
  opaque fur. FurShellRenderer pulls the live colour/pulse/flash from the
  sibling MeshPainter (new getters), in phase with the body. A new X-Ray
  Fur Strength (default 0.2) tames the per-shell accumulation, since the
  body writes the glow once (opaque) but the fur stacks N transparent
  shells that each composite it.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 16:33:21 +02:00
adminandClaude Opus 4.8 9290ef650b Hunter shot: replicated laser beam + X-ray hit flash; snapshot apply in-place reseed
- Laser.shader + HunterLaserBeam: additive HDR beam, fade in/out over opacity
  and thickness, code-driven LineRenderer, tunable emission multiplier.
- FirstPersonMode: TryShoot computes world endpoint, fires beam with lateral
  muzzle offset (right) so it isn't dead-center from hunter view.
- NetworkPlayerSetup: shot relay RPCs (owner->server->all) + hit-flash RPC
  (server->all), flash OR-branch in ComputeXRay.
- MatchManager: hit reveal broadcasts X-ray flash first, delays hider removal
  by hitRevealDelay so the glow is visible before the body vanishes.
- MeshPainter reseed: in-place fast path avoids full GPU backend teardown on
  snapshot apply (no ~70MB RT churn), fixes spawn/paint-load hitch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 14:18:55 +02:00
adminandClaude Opus 4.8 5b95cb7f56 Authoring: Main scene, HUD panel, move FurShell material to Assets/Materials
- Main.unity + PaintHudPanel.prefab: fur/paint HUD authoring updates.
- Rename FurShell_Test.mat -> Materials/FurShell.mat (same GUID).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 12:08:58 +02:00
adminandClaude Opus 4.8 49704448e9 Fur authoring: Player-FurShellRenderer, Paint-HUD-Panel, Testszene & -material
Avatar-Setup und HUD-Autoring fuer das Fur-Feature (Code liegt in 1b783a3):
- Player.prefab: FurShellRenderer am Player verdrahtet, furLength-Default 0.5
- PaintHudPanel.prefab: Slider_FurLength + Fur-Panel-Widgets
- The Room.unity: Fur-Testaufbau
- FurShell_Test.mat: Test-Material fuer den Shell-Shader

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:41:57 +02:00
adminandClaude Opus 4.8 1b783a39be Fur: Albedo-gekoppelte Länge, Toggle-Gate, Soft-Edge, World-Gravity, Pipette & FP-Hide
- Fur-Map trägt nur noch R = Länge (linearer Datenkanal); Farbe kommt per-texel
  aus der Live-Albedo-RT (an _BaseMap des Shell-Shaders gebunden)
- Toggle_Fur als echtes Gate (IsChannelActive = fur), Default aus, furLength 0.5
- Weicher Alpha-Übergang (radial/tip/length coverage) statt Hard-Clip; Transparent-
  Pass mit Depth-Bias (Offset -1,-1) gegen Body-Durchflimmern
- Root dunkler / Tip heller aus gemalter Farbe abgeleitet (kein Fix-Tint)
- Gravity/Curl in World-Space nach Transform (unabhängig von Mesh-Rotation)
- Pipette aktiviert Fur-Toggle immer; liest R-Kanal als Länge
- First-Person blendet FurShellRenderer mit aus
- Netzwerk (FlagFur), Undo, Persistence (fur.png R=Länge) mitgezogen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:40:58 +02:00
adminandClaude Opus 4.8 7536e8ec8b Fur als 4. Paint-Map + Ziel-Opacity-Blend
Fur wird die vierte kanonische Paint-Map (RGB=Farbe, A=Länge). Integration
über Seed (kahl), GPU/CPU-Paint, Undo, Netzwerk-Sync, Persistence (fur.png,
v6) und Live-RT-Hook im FurShellRenderer. HUD-Binding (Toggle/Picker/Alpha)
aktiviert. Fur-Alpha lerpt jetzt zu einer Ziel-Opacity (Slider_FurOpacity)
statt additiv Richtung 1 zu akkumulieren (zwei Brush-Passes: Fade + Deposit).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 21:35:53 +02:00
adminandClaude Opus 4.8 43791abc79 Add fur-map support, skinned driver, and world-down curvature to fur shell
FurShell now reads an RGBA fur map (RGB = per-texel strand colour,
A = fur length) so the standalone look can be driven per-texel. Alpha 0
clips the whole shell stack (root included) so a painted body shows
through; _SolidRoot keeps the opaque base shell only for the full-coverage
prototype. White map default keeps the standalone prototype unchanged.

FurShellRenderer drops the MeshFilter requirement and resolves its mesh
per frame: on a SkinnedMeshRenderer it borrows the SkinnedColliderBaker's
per-frame baked pose so the fur follows the animation with no extra bake.

Curvature/gravity now bends strands toward WORLD down (converted into
object space via unity_WorldToObject) instead of object-local down, so a
rotated player mesh droops downward correctly. Identity rotation is
unchanged, so the test sphere is unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 20:47:15 +02:00
adminandClaude Opus 4.8 bf4297a3b1 Add generic shell-texturing fur shader and renderer
FurShell.shader renders N normal-extruded shells with per-strand
alpha-cutout for hair/fur/grass on any mesh (needs only normals/UVs).
Parameters cover length, density, thickness, taper, tip fill, curvature,
per-strand direction randomness, wind sway and silhouette strand stretch.

FurShellRenderer drives every parameter via MaterialPropertyBlock and
draws the mesh shellCount times with RenderMeshInstanced from
beginCameraRendering (works in edit, game and screenshot cameras).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:34:58 +02:00
adminandClaude Opus 4.8 ae0e2de7cf Make the x-ray pulse an asymmetric rising curve
Replace the symmetric sine with a raised cosine raised to
_XRayPulseShape: a long near-zero plateau, a slow rise and a short
full peak. Both shader halves use the identical formula to stay in
phase.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 21:52:47 +02:00
adminandClaude Opus 4.8 c54e0cf502 Add see-through X-ray reveal overlay for players
Add a second, additive HDR emission color (_XRayColor) that reveals a
player through walls as a pulsing energy glow, driven during matches:

- Shader: XRayOverlay pass (ZTest Greater, additive) for occluded parts
  plus a matching additive term in the forward fragment for visible
  parts, so the glow shows everywhere and never double-blends. Exposes
  _XRayColor, _XRayPulseSpeed and _XRayPulseStrength for a breathing pulse.
- Render it after opaques via a RenderObjects feature (custom XRayReveal
  light-mode tag) on both PC and Mobile renderers, so the through-wall
  test is depth-sort independent and no longer drops out at some camera
  angles/distances.
- MeshPainter drives _XRayColor alpha through a framerate-independent
  fade (xrayFadeDuration) rather than a hard toggle.
- Reveal is driven per avatar on every client: all remaining un-found
  hiders glow during the Resolution phase, and a hider whose
  ConcealmentMeter EmbeddedPercent exceeds MatchManager.embeddedRevealPercent
  glows via an owner-authoritative NetworkVariable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 12:22:17 +02:00
adminandClaude Opus 4.8 59939b3496 Add painted-height HUD sliders for AO shift and relief intensity
Wire three material-backed look sliders (occlusion AO shift, relief normal
intensity, parallax intensity) through the paint HUD, its layout/state
persistence, the .paint slot format (bumped to v4), owner-authoritative
network sync and the runtime reset, mirroring the existing camo-knob path so
they save, restore, replicate and reset alongside the brush values.

Change the occlusion AO mapping from a division threshold to a linear shift:
AO fades from 1 down to (1 - shift) at the deepest painted hole, so a 0 shift
no longer leaves black spots. Enable _NORMALMAP alongside _PARALLAXMAP so URP
transforms the painted relief normal into world space (otherwise it discards
normalTS and the relief is invisible), and pin the added keyword in the build
keep-alive material.

Stop the pipette from picking the occlusion/height value and turn its toggle
off after a pick. Default the knobs to 0.2 shift / 1.4 normal / 1.0 parallax
across the shader, painter, network and HUD fallbacks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 07:07:39 +02:00
adminandClaude Opus 4.8 fdcb4f8d8a Drive parallax height and relief from the painted occlusion channel
Reuse the existing occlusion paint channel (no new map, MAP_COUNT stays 3):
0.5 is neutral, above 0.5 raises a hill, below 0.5 sinks a hole and also
fades ambient occlusion (saturate(2*occ)). Bind the MSO map to _ParallaxMap,
enable _PARALLAXMAP, derive a relief normal from the height gradient, and
reseed unpainted occlusion to 0.5 so untouched surfaces stay visually neutral.
Pin the _PARALLAXMAP runtime variant in the build keep-alive material.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:40:23 +02:00
adminandClaude Opus 4.8 b5bd1fdb8b Rework the camo shader to flatten toward darkness, drop FormSoftness
Rebuild the camo controls around hiding a painted player in a dark scene. _HalfLambert is now a two-segment curve (0 = no effect / URP Lit, 0.5 = classic half-lambert soft terminator, 1 = fully flat) and a companion _HalfLambertBrightness (-1..1) additively shifts the flattened diffuse so the body tone matches the scene. _SpecularDampen still scales down the direct highlight. The view-coupled _FormSoftness normal-bend is removed entirely (it flipped light/dark with the camera); all knobs are now term-based and view-independent, and stay byte-identical to URP/Lit at their no-op values.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 20:12:31 +02:00
admin e351336b39 Reorganize project folders and clean up editor tooling
Move editor scripts to Assets/Scripts/Editor (PlaySceneWindow, SceneCollection),
move DefaultNetworkPrefabs and the Main Camera custom blends asset into
Assets/Settings, and shelve the unused HeroCutout shader/include under
Assets/Unused. Rename the Chameleon background texture, delete the obsolete
DefaultParentForEditor script and New Lighting Settings asset, add a The Room
SceneCollection asset, and drop the redundant Assets menu entry from the
StraightenKnees tool.
2026-06-29 16:23:50 +02:00
adminandClaude Opus 4.8 05cd52aa5e Add player camouflage shader
Custom/PlayerCamoLit is a URP 17 Lit clone whose ForwardLit pass routes
through PlayerCamo.hlsl - a faithful copy of UniversalFragmentPBR that
delegates all GI/APV/shadow/cluster-light helpers unchanged and only swaps
the three light calls for a camo variant. Three sliders flatten the form
cues that give a painted player away: _FormSoftness bends the per-pixel
normal toward the camera (softens diffuse + specular + reflections),
_HalfLambert lifts the diffuse shadow side, _SpecularDampen scales down the
direct highlight. All sliders at 0 are byte-identical to URP/Lit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 16:22:57 +02:00
adminandClaude Opus 4.8 ac25f59232 Add radial hero-cutout shader for third-person camera
Reveal the player when geometry sits between the orbit camera and the
character: a screen-space circular mask in a URP/Lit clone (HeroCutoutLit)
clips occluders in front of the player, depth-gated so only geometry nearer
than the hero is cut. The cutout lives outside UnityPerMaterial (SRP batcher
intact) and is a no-op when disarmed, so occluders look identical to URP/Lit.

A runtime driver (HeroCutout.cs on Main/GameManager) feeds the player's
screen position, radius, feather and depth into global shader properties and
only arms while the third-person orbit vcam is live; it disarms in
first-person, free-cam and the pause menu. Applied to the lobby walls via a
dedicated occluder material (floor left solid). Shipped but shelved for now.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 17:18:32 +02:00
adminandClaude Opus 4.8 fa7082817e Fix frozen rim pixels via GPU coverage stamp; add brush masks
Replace the CPU island-mask dilation guard on the GPU backend with a
coverage pass rendered through the same brush rasterizer, so sub-pixel
rim texels that the GPU brush can never reach fall into the gutter and
stay paintable (no more frozen loaded pixels at island edges).

Also includes user content: additional brush masks (dirt) with an
expanded mask selector in the HUD prefab, and CharacterController /
wall-climb inspector tuning.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 07:11:27 +02:00
adminandClaude Opus 4.8 c7ec12e6d9 Split mesh painter into partials and add occlusion via combined mask map
- Split MeshPainter into partial classes (Setup/Backend/Gpu/Cpu) for maintainability
- Add ambient occlusion painting, packed with metallic/smoothness into one
  MSO mask map (R=metallic, G=occlusion, A=smoothness) bound to both
  _MetallicGlossMap and _OcclusionMap, kept independently paintable via
  per-channel ColorMask
- Gate painting from a single IsChannelActive source so AO-only strokes work
- Blend albedo/emission in linear space on CPU to match the GPU framebuffer
- Pre-compensate data-channel writes for sRGB->linear so GPU matches CPU
- Harden GPU shader fallback to reflect real backend state

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:31:52 +02:00
admin 86c0a33687 Add metallic, smoothness, and emission painting to mesh painter
Extend the painter from a single albedo map to three paint maps:
albedo (_BaseMap), packed metallic+smoothness (_MetallicGlossMap,
R=metallic A=smoothness), and emission (_EmissionMap/_EmissionColor).

- Per-channel toggles (paint albedo / metallic+smoothness / emission)
- Metallic/Smoothness sliders and emission color + intensity brush params
- One brush shader drives all maps; metallic-smoothness uses a work
  layout (R=metallic G=smoothness A=coverage) and a pack pass
  (Hidden/MeshPaintPackMS) to the URP layout after each stroke
- GPU and CPU backends mirror all three maps with the same mask and
  seam-dilation logic
- Material keywords (_METALLICSPECGLOSSMAP, _EMISSION) enabled and the
  new maps seeded from the original material values
2026-06-23 16:08:32 +02:00
admin d5fc5ee804 Add brush preview and drive paint opacity from brush color alpha
- Add hover preview (MeshPaintPreview.shader) with a Preview Mode enum
  (Off / Flat Decal / On Surface) sharing the paint placement path so
  size, mask, alignment and rotation match the actual stroke.
- Preview Opacity now ranges up to 4.0 so faint/grey masks can be shown
  more strongly (saturates to full opacity before the hardware blend).
- Add Paint On Move Only: stamp once on mouse-down, then only while the
  cursor moves (GPU and CPU paths alike).
- Remove brushOpacity; brushColor.a is now the global opacity multiplier
  over the mask in both backends (the alpha channel was previously unused
  by the brush shader).
2026-06-23 13:58:39 +02:00
admin c67d519f68 Add square mask brush with opacity blending to mesh painter
Replace the 3D sphere brush with a square stamp in the surface tangent
plane whose shape and opacity come from a grayscale/alpha mask. Masks
are assignable via an inspector list with a live-switchable active index;
an empty list falls back to a procedurally generated circle mask that
reproduces the previous round brush.

- Mask drives opacity (luma * alpha * brushOpacity) via source-over blend
  instead of a hard threshold cut; gray 0.5 = 50%.
- GPU and CPU paths stay identical; non-readable textures are supported on
  the CPU via GPU blit-readback.
- Dilate pass treats any alpha > 0 as painted so soft edges survive seam
  padding.
- Brush alignment enum (Camera/World) plus manual rotation; tangent frame
  handedness fixed so stamps read upright and unmirrored in both modes.
2026-06-23 11:28:19 +02:00
adminandClaude Opus 4.8 fa4474f6d4 Initial commit: Unity mesh painter project
Unity 6000.3 (URP) project with live mesh painting in play mode.

- MeshPainter.cs: paint a SkinnedMesh with the mouse, seamless across
  UV islands via 3D-space painting, GPU and CPU backends (switchable),
  edge-padding/dilation against bilinear seam bleed
- FrameRateLimiter.cs: simple frame rate limiting component
- MeshPaintBrush / MeshPaintDilate shaders for the GPU paint path
- Unity-specific .gitignore and .gitattributes

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 12:03:24 +02:00