Four color gradients! Standard APIs! Wowwwww
This commit is contained in:
parent
141eee69ee
commit
2fa9b838f7
5 changed files with 35 additions and 34 deletions
|
@ -13,7 +13,7 @@ class ViewController: NSViewController, RendererDelegate {
|
|||
private static func defaultParameters() -> Parameters {
|
||||
var p = Parameters()
|
||||
let defaults = UserDefaults.standard
|
||||
let style = defaults.colorStyle ?? .gradient2Horizontal
|
||||
let style = defaults.colorStyle ?? .gradient2
|
||||
p.colorStyle = style
|
||||
let color0 = defaults.color0 ?? Float4(0.50, 0.79, 1, 1)
|
||||
p.color0 = color0
|
||||
|
|
|
@ -16,14 +16,10 @@ public enum MetaballsError: Error {
|
|||
public enum ColorStyle: UInt32 {
|
||||
/// Single flat color
|
||||
case singleColor = 1
|
||||
/// Two color horizontal gradient
|
||||
case gradient2Horizontal = 2
|
||||
/// Two color vertical gradient
|
||||
case gradient2Vertical = 3
|
||||
/// Four color gradient from corners
|
||||
case gradient4Corners = 4
|
||||
/// Four color gradient from middle of sides
|
||||
case gradient4Sides = 5
|
||||
/// Two color gradient
|
||||
case gradient2 = 2
|
||||
/// Four color gradient
|
||||
case gradient4 = 4
|
||||
}
|
||||
|
||||
public struct Parameters {
|
||||
|
|
|
@ -25,15 +25,17 @@ public class PreferencesViewController: NSViewController {
|
|||
return [
|
||||
StyleItem(name: NSLocalizedString("Single Color", comment: "single color menu item"),
|
||||
tag: Int(ColorStyle.singleColor.rawValue),
|
||||
colorNames: [NSLocalizedString("Color", comment: "single color name")]),
|
||||
StyleItem(name: NSLocalizedString("Two Color Gradient — Horizontal", comment: "two color horizontal gradient menu item"),
|
||||
tag: Int(ColorStyle.gradient2Horizontal.rawValue),
|
||||
colorNames: [NSLocalizedString("Right", comment: "two color horizontal gradient, color 1"),
|
||||
NSLocalizedString("Left", comment: "two color horizontal gradient, color 2")]),
|
||||
StyleItem(name: NSLocalizedString("Two Color Gradient — Vertical", comment: "two color vertical gradient menu item"),
|
||||
tag: Int(ColorStyle.gradient2Vertical.rawValue),
|
||||
colorNames: [NSLocalizedString("Top", comment: "two color vertical gradient, color 1"),
|
||||
NSLocalizedString("Bottom", comment: "two color vertical gradient, color 2")]),
|
||||
colorNames: [NSLocalizedString("A", comment: "first color")]),
|
||||
StyleItem(name: NSLocalizedString("Two Color Gradient", comment: "two color gradient menu item"),
|
||||
tag: Int(ColorStyle.gradient2.rawValue),
|
||||
colorNames: [NSLocalizedString("A", comment: "first color"),
|
||||
NSLocalizedString("B", comment: "second color")]),
|
||||
StyleItem(name: NSLocalizedString("Four Color Gradient", comment: "four color gradient menu item"),
|
||||
tag: Int(ColorStyle.gradient4.rawValue),
|
||||
colorNames: [NSLocalizedString("A", comment: "first color"),
|
||||
NSLocalizedString("B", comment: "second color"),
|
||||
NSLocalizedString("C", comment: "third color"),
|
||||
NSLocalizedString("D", comment: "fourth color")]),
|
||||
]
|
||||
}
|
||||
|
||||
|
|
|
@ -27,14 +27,10 @@ typedef struct {
|
|||
typedef enum {
|
||||
/// Single flat color
|
||||
SingleColor = 1,
|
||||
/// Two color horizontal gradient
|
||||
Gradient2Horizontal = 2,
|
||||
/// Two color vertical gradient
|
||||
Gradient2Vertical = 3,
|
||||
/// Four color gradient from corners
|
||||
Gradient4Corners = 4,
|
||||
/// Four color gradient from middle of sides
|
||||
Gradient4Sides = 5,
|
||||
/// Two color gradient
|
||||
Gradient2 = 2,
|
||||
/// Four color gradient
|
||||
Gradient4 = 4,
|
||||
} ColorStyle;
|
||||
|
||||
typedef struct {
|
||||
|
@ -88,19 +84,26 @@ sampleToColorShader(RasterizerData in [[stage_in]],
|
|||
case SingleColor:
|
||||
out = singleColor(sample, target, feather, parameters.colors[0]);
|
||||
break;
|
||||
case Gradient2Horizontal: {
|
||||
const float3 transformedColor = (parameters.colorTransform * float3(in.position.xy, 1.0));
|
||||
case Gradient2: {
|
||||
const float3 transformedColor = parameters.colorTransform * float3(in.position.xy, 1.0);
|
||||
const float blend = transformedColor.x / parameters.size[0];
|
||||
out = gradient2(sample, target, feather, blend, parameters.colors[0], parameters.colors[1]);
|
||||
const float4 color = mix(parameters.colors[0], parameters.colors[1], blend);
|
||||
out = singleColor(sample, target, feather, color);
|
||||
break;
|
||||
}
|
||||
case Gradient2Vertical: {
|
||||
const float blend = in.position.y / parameters.size[1];
|
||||
out = gradient2(sample, target, feather, blend, parameters.colors[0], parameters.colors[1]);
|
||||
case Gradient4: {
|
||||
const float3 transformedColorCoords = parameters.colorTransform * float3(in.position.xy, 1.0);
|
||||
const float2 blend = float2(transformedColorCoords.x / parameters.size[0],
|
||||
transformedColorCoords.y / parameters.size[1]);
|
||||
const float4 color = mix(mix(parameters.colors[0], parameters.colors[2], blend.y),
|
||||
mix(parameters.colors[1], parameters.colors[3], blend.y),
|
||||
blend.x);
|
||||
out = singleColor(sample, target, feather, color);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -147,7 +150,7 @@ gradient2(float sample,
|
|||
float4 fromColor,
|
||||
float4 toColor)
|
||||
{
|
||||
float4 blendedColor = averageTwoColors(normalizedBlend, fromColor, toColor);
|
||||
float4 blendedColor = mix(fromColor, toColor, normalizedBlend);
|
||||
float4 out = singleColor(sample, target, feather, blendedColor);
|
||||
return out;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ import ScreenSaver
|
|||
private static func defaultParameters() -> Parameters {
|
||||
var p = Parameters()
|
||||
let defaults = UserDefaults.standard
|
||||
let style = defaults.colorStyle ?? .gradient2Horizontal
|
||||
let style = defaults.colorStyle ?? .gradient2
|
||||
p.colorStyle = style
|
||||
let color0 = defaults.color0 ?? Float4(0.50, 0.79, 1, 1)
|
||||
p.color0 = color0
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue