Add spray brush, paint interval, and per-channel paint opacity
Spray brush mode: bakes a procedural scattered-dot mask per stamp (random position, size, alpha within the brush disc) and paints it through the existing single-stamp pipeline; dot centers clamped to (0.5 - dotR) so the spray footprint matches the solid brush radius. Paint interval: float on MeshPainter; 0 keeps the continuous interpolated stroke, >0 emits a single timed dab every x.xx seconds. Color picker alpha: horizontal alpha bar on both HSV pickers, runtime-built in Rebind (no prefab re-bake), passed through to brushColor.a / emissionColor.a. Metallic/smoothness + occlusion paint opacity: new opacity fields applied in both CPU and GPU backends (GPU MSO draw split into MS and occlusion sub-stamps for independent opacity), with cloned alpha sliders wired into the HUD. Also includes the prefab layout tweaks and scene adjustments. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
af3aa34d66
commit
b07d9a22d2
9 files changed
+1227
-86
No files matched your search
@@ -51,7 +51,9 @@ public class PaintHud : MonoBehaviour
|
||||
private const string PickerEmission = "Picker_Emission";
|
||||
private const string SliderMetallic = "Slider_Metallic";
|
||||
private const string SliderSmoothness = "Slider_Smoothness";
|
||||
private const string SliderMetallicSmoothnessAlpha = "Slider_MetallicSmoothnessAlpha";
|
||||
private const string SliderOcclusion = "Slider_Occlusion";
|
||||
private const string SliderOcclusionAlpha = "Slider_OcclusionAlpha";
|
||||
private const string SliderEmissionIntensity = "Slider_EmissionIntensity";
|
||||
private const string SliderBrushSize = "Slider_BrushSize";
|
||||
|
||||
@@ -168,14 +170,16 @@ public class PaintHud : MonoBehaviour
|
||||
WirePanelFade(panel, PanelEmission, ToggleEmission);
|
||||
|
||||
WirePicker(panel, PickerAlbedo, painter ? painter.brushColor : Color.red,
|
||||
c => { if (painter) painter.brushColor = new Color(c.r, c.g, c.b, painter.brushColor.a); });
|
||||
c => { if (painter) painter.brushColor = c; });
|
||||
|
||||
WireSlider(panel, SliderMetallic, painter ? painter.metallic : 0f, v => { if (painter) painter.metallic = v; });
|
||||
WireSlider(panel, SliderSmoothness, painter ? painter.smoothness : 0.5f, v => { if (painter) painter.smoothness = v; });
|
||||
WireSlider(panel, SliderMetallicSmoothnessAlpha, painter ? painter.metallicSmoothnessOpacity : 1f, v => { if (painter) painter.metallicSmoothnessOpacity = v; });
|
||||
WireSlider(panel, SliderOcclusion, painter ? painter.occlusion : 0.5f, v => { if (painter) painter.occlusion = v; });
|
||||
WireSlider(panel, SliderOcclusionAlpha, painter ? painter.occlusionOpacity : 1f, v => { if (painter) painter.occlusionOpacity = v; });
|
||||
|
||||
WirePicker(panel, PickerEmission, painter ? painter.emissionColor : Color.black,
|
||||
c => { if (painter) painter.emissionColor = new Color(c.r, c.g, c.b, painter.emissionColor.a); });
|
||||
c => { if (painter) painter.emissionColor = c; });
|
||||
WireSlider(panel, SliderEmissionIntensity, painter ? painter.emissionIntensity : 1f, v => { if (painter) painter.emissionIntensity = v; });
|
||||
|
||||
WireSlider(panel, SliderBrushSize, painter ? painter.brushSize : 16f, v => { if (painter) painter.brushSize = Mathf.RoundToInt(v); });
|
||||
@@ -310,7 +314,7 @@ public class PaintHud : MonoBehaviour
|
||||
}
|
||||
|
||||
// Cached gradient sprites for the colour picker.
|
||||
private static Sprite _satSprite, _valSprite, _hueSprite;
|
||||
private static Sprite _satSprite, _valSprite, _hueSprite, _alphaSprite;
|
||||
|
||||
/// <summary>Horizontal white-out: opaque white (left) -> transparent (right) = saturation.</summary>
|
||||
public static Sprite SaturationSprite()
|
||||
@@ -344,6 +348,23 @@ public class PaintHud : MonoBehaviour
|
||||
return _valSprite;
|
||||
}
|
||||
|
||||
/// <summary>Horizontal white transparency ramp: transparent (left) -> opaque (right) = alpha.
|
||||
/// Tinted to the current colour by the picker so it reads as a colour-over-backdrop fade.</summary>
|
||||
public static Sprite AlphaSprite()
|
||||
{
|
||||
if (_alphaSprite) return _alphaSprite;
|
||||
const int n = 64;
|
||||
var tex = NewGradientTex(n, 1);
|
||||
for (int x = 0; x < n; x++)
|
||||
{
|
||||
byte a = (byte)Mathf.RoundToInt(255f * (x / (float)(n - 1)));
|
||||
tex.SetPixel(x, 0, new Color32(255, 255, 255, a));
|
||||
}
|
||||
tex.Apply(false);
|
||||
_alphaSprite = ToSprite(tex);
|
||||
return _alphaSprite;
|
||||
}
|
||||
|
||||
/// <summary>Horizontal full-saturation hue ramp 0..1.</summary>
|
||||
public static Sprite HueSprite()
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user