Makepad Code (editor layout, selection, sidebar, early yield), the EN/ZH Translator with voice, Weather with a generated offline forecast, Amp playing its offline library, and fixes across the other apps and examples. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
665 lines
32 KiB
Text
665 lines
32 KiB
Text
// title: Cyberpunk
|
|
// Cyberpunk — night-city street tech: a carbon-fibre front over dark
|
|
// gunmetal, plates cut with hard chamfers and edge-lit by cyan and magenta
|
|
// neon, warning tape wrapped round the cut corners, keys with a holographic
|
|
// foil sheen, a HUD over the screen with a static chroma split and glitch
|
|
// slices, a wedge-ladder signal meter and a segmented, chroma-fringed
|
|
// spectrum. Wet metal: the front takes the screen's light in streaks.
|
|
//
|
|
// Assignments only, over the base templates in `src/hw.rs`
|
|
// (see local/agent_state/skeuomorph/music/STYLE_GUIDE.md).
|
|
use mod.prelude.widgets_internal.*
|
|
|
|
// ---- palette: black glass, electric cyan, hot magenta, warning yellow ----
|
|
mod.widgets.hw_palette.screen_bg = #x07080c
|
|
mod.widgets.hw_palette.screen_text = #xe6fbff
|
|
mod.widgets.hw_palette.screen_muted = #x6b8499
|
|
mod.widgets.hw_palette.accent = #x14f0ff
|
|
mod.widgets.hw_palette.panel_text = #xe6fbff
|
|
mod.widgets.hw_palette.panel_muted = #x7390a6
|
|
mod.widgets.hw_palette.menu_bg = #x0b0d12
|
|
mod.widgets.hw_palette.spill_mono = 0.0
|
|
mod.widgets.hw_palette.spill_knee = 1.3
|
|
mod.widgets.hw_palette.caption_bg = #x06070a
|
|
mod.widgets.hw_palette.caption_text = #x14f0ff
|
|
|
|
// ---- the front: carbon-fibre twill, wet ----
|
|
mod.widgets.HwChassis.draw_bg.ground = #x1b1d22
|
|
mod.widgets.HwChassis.draw_bg.light_ink = vec4(0.80, 0.92, 1.0, 1.0)
|
|
mod.widgets.HwChassis.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.01, 1.0)
|
|
mod.widgets.HwChassis.draw_bg.glow_ink = vec4(0.08, 0.94, 1.0, 1.0)
|
|
mod.widgets.HwChassis.draw_bg.spill = vec2(1.7, 0.7)
|
|
mod.widgets.HwChassis.draw_bg.vignette = vec4(0.5, 0.30, 0.30, 1.10)
|
|
mod.widgets.Window.pass.clear_color = #x121317
|
|
// 2/2 twill: tows 5 pt wide, alternating direction in diagonal steps, each
|
|
// tow a rounded strand that catches the light across its width.
|
|
mod.widgets.HwChassis.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let w = self.world.xy
|
|
let q = w / 5.0
|
|
let c = floor(q)
|
|
let f = fract(q)
|
|
let orient = step(1.5, fract((c.x + c.y) / 4.0) * 4.0)
|
|
let across = mix(f.y, f.x, orient)
|
|
let along = mix(f.x, f.y, orient)
|
|
let tow = sin(across * 3.14159)
|
|
let shade = 0.50 + 0.55 * sqrt(max(tow, 0.0))
|
|
let bright = mix(1.18, 0.78, orient)
|
|
let fibre = 0.94 + 0.10 * self.hw_hash(vec2(floor(across * 7.0) + c.x * 13.0, c.y * 7.0 + orient))
|
|
let gap = smoothstep(0.0, 0.08, along) * smoothstep(0.0, 0.08, 1.0 - along)
|
|
return base * shade * bright * fibre * (0.75 + 0.25 * gap)
|
|
}
|
|
mod.widgets.HwChassis.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let w = self.world.xy
|
|
var col = self.surface(p, self.ground.xyz)
|
|
let v = length((self.pos - self.vignette.xy) * vec2(0.9, 1.3))
|
|
col = col * (self.vignette.w - self.vignette.z * v * v)
|
|
// Wet streaks: long vertical runs where the metal is glossy, which
|
|
// mirror the neighbour light far more than the dry weave.
|
|
let streak = self.hw_noise(vec2(w.x * 0.045, w.y * 0.004)) * 0.7 + self.hw_noise(vec2(w.x * 0.2, w.y * 0.01)) * 0.3
|
|
let wet = smoothstep(0.40, 0.80, streak)
|
|
let sp = self.env_spill(vec3(0.0, 0.0, 1.0))
|
|
col = col * (1.0 - self.env_ao(0.0)) + sp * (0.55 + 1.6 * wet)
|
|
col = col + self.light_ink.xyz * wet * 0.012
|
|
return vec4(col + self.dither(), 1.0)
|
|
}
|
|
|
|
// ---- raised plates: dark gunmetal, hard chamfers, neon edge light ----
|
|
mod.widgets.HwPlate.radius = 18
|
|
mod.widgets.HwPlate.draw_bg.ground = #x25282e
|
|
mod.widgets.HwPlate.draw_bg.light_ink = vec4(0.78, 0.90, 1.0, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.01, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.pattern = vec4(1.0, 1.4, 0.10, 0.6)
|
|
mod.widgets.HwPlate.draw_bg.pattern_ink = vec4(0.98, 0.84, 0.05, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.relief = vec4(1.4, 0.2, 2.5, 0.45)
|
|
mod.widgets.HwPlate.draw_bg.finish = vec4(0.6, 0.45, 0.30, 0.35)
|
|
mod.widgets.HwPlate.draw_bg.shadow = vec4(0.80, 10.0, 1.0, 0.75)
|
|
mod.widgets.HwPlate.draw_bg.glow_ink = vec4(0.08, 0.94, 1.0, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.spill = vec2(2.4, 0.6)
|
|
mod.widgets.HwPlate.draw_bg.grain = 0.02
|
|
// Chamfered: the top-left and bottom-right corners cut hard, the others clipped.
|
|
mod.widgets.HwPlate.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let box = length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
let k = mix(self.radius * 0.3, self.radius, step(0.0, s.x * s.y))
|
|
return max(box, (q.x + q.y + min(k, min(h.x, h.y))) * 0.7071)
|
|
}
|
|
// The finish, plus warning tape wrapped across the bottom-right cut and a
|
|
// row of vent slots along the top.
|
|
mod.widgets.HwPlate.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let w = self.world.xy
|
|
let row = floor(w.y * 1.4)
|
|
let streak = self.hw_noise(vec2(w.x * 0.01 + row * 7.13, row * 0.37))
|
|
var col = base * (1.0 + (streak - 0.5) * 0.12)
|
|
let uv = p / max(self.rect_size, vec2(1.0, 1.0))
|
|
col = col * (1.06 - uv.y * 0.12)
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let k = min(self.radius, min(h.x, h.y))
|
|
let cd = (q.x + q.y + k) * 0.7071
|
|
let br = step(0.0, s.x) * step(0.0, s.y)
|
|
let tape = smoothstep(-13.0, -12.0, cd) * (1.0 - smoothstep(-6.0, -5.0, cd)) * br
|
|
let st = smoothstep(0.46, 0.54, fract(w.x / 7.0)) * (1.0 - smoothstep(0.94, 1.0, fract(w.x / 7.0)))
|
|
let chip = smoothstep(0.72, 0.8, self.hw_noise(w * 0.3))
|
|
let tcol = mix(self.pattern_ink.xyz * (0.92 + 0.1 * self.hw_hash(floor(w * 2.0))), vec3(0.04, 0.04, 0.045), st)
|
|
col = mix(col, tcol, tape * (1.0 - chip * 0.75))
|
|
// Vent slots near the top-right: short dark bars.
|
|
let vx = p.x - (self.rect_size.x - self.inset - 64.0)
|
|
let vy = p.y - (self.inset + 7.0)
|
|
let slot = step(0.0, vx) * step(vx, 44.0) * step(0.2, fract(vx / 5.0)) * step(fract(vx / 5.0), 0.62) * step(0.0, vy) * step(vy, 5.0)
|
|
col = mix(col, vec3(0.01, 0.01, 0.015), slot * 0.9)
|
|
return col
|
|
}
|
|
mod.widgets.HwPlate.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
var o = self.layer(self.surface(p, self.ground.xyz))
|
|
let d = self.sd(p)
|
|
let uv = p / max(self.rect_size, vec2(1.0, 1.0))
|
|
// Neon edge light: a tube just inside the lip, cyan at the top fading
|
|
// into magenta at the foot, broken in a few places.
|
|
let t = smoothstep(0.15, 0.85, uv.y * 0.8 + uv.x * 0.2)
|
|
let ink = mix(vec3(0.08, 0.94, 1.0), vec3(1.0, 0.12, 0.72), t)
|
|
let gate = step(0.10, fract((p.x + p.y * 1.3) / 170.0))
|
|
let line = (1.0 - smoothstep(0.25, 0.85, abs(d + 3.2))) * gate
|
|
let halo = exp(-abs(d + 3.2) / 2.8) * 0.35 * gate
|
|
let a = o.w * step(d, 0.0)
|
|
o = vec4(o.xyz + (mix(ink, vec3(1.0, 1.0, 1.0), line * 0.45) * line * 0.95 + ink * halo) * a, o.w)
|
|
return o
|
|
}
|
|
|
|
// ---- recessed panels: black wells with a faint HUD grid ----
|
|
mod.widgets.HwPanel.radius = 14
|
|
mod.widgets.HwPanel.draw_bg.ground = #x0d0f14
|
|
mod.widgets.HwPanel.draw_bg.light_ink = vec4(0.70, 0.90, 1.0, 1.0)
|
|
mod.widgets.HwPanel.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwPanel.draw_bg.inner = vec4(0.90, 10.0, 0.0, 0.55)
|
|
mod.widgets.HwPanel.draw_bg.finish = vec4(0.6, 0.4, 0.10, 0.6)
|
|
mod.widgets.HwPanel.draw_bg.glow_ink = vec4(0.08, 0.94, 1.0, 1.0)
|
|
mod.widgets.HwPanel.draw_bg.spill = vec2(1.5, 0.6)
|
|
mod.widgets.HwPanel.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let box = length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
let k = mix(self.radius * 0.3, self.radius, step(0.0, s.x * s.y))
|
|
return max(box, (q.x + q.y + min(k, min(h.x, h.y))) * 0.7071)
|
|
}
|
|
mod.widgets.HwPanel.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let f = fract(p / vec2(16.0, 16.0))
|
|
let g = max(1.0 - smoothstep(0.0, 0.07, f.x), 1.0 - smoothstep(0.0, 0.07, f.y))
|
|
return base + vec3(0.02, 0.07, 0.09) * g * 0.35
|
|
}
|
|
mod.widgets.HwPanel.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
var o = self.layer(self.surface(p, self.ground.xyz))
|
|
let d = self.sd(p)
|
|
// A hairline of cyan round the well's floor.
|
|
let line = (1.0 - smoothstep(0.2, 0.8, abs(d + 1.6))) * step(d, 0.0)
|
|
o = vec4(o.xyz + vec3(0.08, 0.94, 1.0) * line * 0.28 * o.w, o.w)
|
|
return o
|
|
}
|
|
|
|
// ---- the screen's surround: black, deep, a magenta-to-cyan neon tube ----
|
|
mod.widgets.HwBezel.radius = 22
|
|
mod.widgets.HwBezel.draw_bg.ground = #x0a0b0e
|
|
mod.widgets.HwBezel.draw_bg.light_ink = vec4(0.70, 0.88, 1.0, 1.0)
|
|
mod.widgets.HwBezel.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwBezel.draw_bg.pattern = vec4(5.0, 1.0, 0.10, 0.0)
|
|
mod.widgets.HwBezel.draw_bg.inner = vec4(1.0, 14.0, 0.0, 0.6)
|
|
mod.widgets.HwBezel.draw_bg.relief = vec4(2.0, 0.3, 3.0, 0.55)
|
|
mod.widgets.HwBezel.draw_bg.spill = vec2(1.2, 0.5)
|
|
mod.widgets.HwBezel.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let box = length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
let k = mix(self.radius * 0.3, self.radius, step(0.0, s.x * s.y))
|
|
return max(box, (q.x + q.y + min(k, min(h.x, h.y))) * 0.7071)
|
|
}
|
|
mod.widgets.HwBezel.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
var o = self.layer(self.surface(p, self.ground.xyz))
|
|
let d = self.sd(p)
|
|
let uv = p / max(self.rect_size, vec2(1.0, 1.0))
|
|
let ink = mix(vec3(1.0, 0.12, 0.72), vec3(0.08, 0.94, 1.0), smoothstep(0.1, 0.9, uv.x))
|
|
let line = 1.0 - smoothstep(0.35, 1.1, abs(d + 2.0))
|
|
let halo = exp(-abs(d + 2.0) / 3.5) * 0.45
|
|
let a = o.w * step(d, 0.0)
|
|
o = vec4(o.xyz + (mix(ink, vec3(1.0, 1.0, 1.0), line * 0.5) * line + ink * halo) * a, o.w)
|
|
return o
|
|
}
|
|
|
|
// ---- the glass: chamfered like the bezel, a chroma split round the rim.
|
|
// Nothing is drawn over the picture itself. ----
|
|
// No dark rim or bulge over the picture: it reads clean and bright.
|
|
mod.widgets.HwGlass.draw_bg.glass = vec4(0.0, 0.05, 0.0, 0.0)
|
|
mod.widgets.HwGlass.draw_bg.tint = vec4(0.60, 0.90, 1.0, 0.0)
|
|
mod.widgets.HwGlass.draw_bg.radius = 16.0
|
|
mod.widgets.HwGlass.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let c = self.rect_size * 0.5
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
let s = p - c
|
|
let q = abs(s) - c
|
|
let k = mix(self.radius * 0.3, self.radius, step(0.0, s.x * s.y))
|
|
let d = max(max(q.x, q.y), (q.x + q.y + k) * 0.7071)
|
|
let cov = 1.0 - smoothstep(-px, px, d)
|
|
// A darker rim (the picture itself is left clean).
|
|
let edge = smoothstep(-30.0, 0.0, d) * self.glass.z
|
|
let dark = edge
|
|
// Chroma split round the rim: a magenta outline shifted left, cyan right.
|
|
let km = mix(self.radius * 0.3, self.radius, step(0.0, (s.x + 1.6) * s.y))
|
|
let qm = abs(s + vec2(1.6, 0.0)) - c
|
|
let dm = max(max(qm.x, qm.y), (qm.x + qm.y + km) * 0.7071)
|
|
let qc = abs(s - vec2(1.6, 0.0)) - c
|
|
let kc = mix(self.radius * 0.3, self.radius, step(0.0, (s.x - 1.6) * s.y))
|
|
let dc = max(max(qc.x, qc.y), (qc.x + qc.y + kc) * 0.7071)
|
|
let rm = 1.0 - smoothstep(0.2, 0.9, abs(dm + 5.0))
|
|
let rc = 1.0 - smoothstep(0.2, 0.9, abs(dc + 5.0))
|
|
// A soft reflection sheet.
|
|
let r = smoothstep(0.6, 0.0, self.pos.y + (self.pos.x - 0.5) * 0.3) * self.glass.y
|
|
var add = vec3(1.0, 0.12, 0.72) * rm * 0.55 + vec3(0.08, 0.94, 1.0) * rc * 0.55
|
|
add = add + self.tint.xyz * r
|
|
let inside = vec4(add * cov, dark * cov)
|
|
return inside + vec4(0.02, 0.02, 0.025, 1.0) * (1.0 - cov)
|
|
}
|
|
|
|
// ---- keys: chamfered gunmetal caps with holographic foil ----
|
|
mod.widgets.HwKey.radius = 11
|
|
mod.widgets.HwKey.depth = 2.6
|
|
mod.widgets.HwKey.press = -3.0
|
|
mod.widgets.HwKey.draw_bg.ground = #x2a2d34
|
|
mod.widgets.HwKey.draw_bg.light_ink = vec4(0.85, 0.95, 1.0, 1.0)
|
|
mod.widgets.HwKey.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.01, 1.0)
|
|
mod.widgets.HwKey.draw_bg.relief = vec4(2.2, 0.2, 2.6, 0.5)
|
|
mod.widgets.HwKey.draw_bg.finish = vec4(0.6, 0.45, 0.35, 0.3)
|
|
mod.widgets.HwKey.draw_bg.shadow = vec4(0.85, 6.0, 1.0, 0.8)
|
|
mod.widgets.HwKey.draw_bg.inner = vec4(0.72, 9.0, 0.0, 0.07)
|
|
mod.widgets.HwKey.draw_bg.glow_ink = vec4(1.0, 0.12, 0.72, 1.0)
|
|
mod.widgets.HwKey.draw_bg.spill = vec2(2.2, 0.55)
|
|
mod.widgets.HwKey.draw_bg.led = vec4(6.0, 6.0, 1.8, 1.0)
|
|
mod.widgets.HwKey.draw_bg.led_off = vec4(0.10, 0.06, 0.10, 1.0)
|
|
mod.widgets.HwKey.draw_bg.critical_ink = vec4(0.98, 0.84, 0.05, 1.0)
|
|
mod.widgets.HwKey.draw_bg.critical_band = vec4(1.0, 3.0, 6.0, 0.0)
|
|
mod.widgets.HwKey.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let box = length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
let k = mix(self.radius * 0.25, self.radius, step(0.0, s.x * s.y))
|
|
return max(box, (q.x + q.y + min(k, min(h.x, h.y))) * 0.7071)
|
|
}
|
|
// Foil: thin-film colours that shift with the window position, strongest
|
|
// in a diagonal band, over faint brushing.
|
|
mod.widgets.HwKey.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let w = self.world.xy
|
|
let row = floor(w.y * 1.6)
|
|
let br = self.hw_noise(vec2(w.x * 0.02 + row * 7.13, row * 0.37))
|
|
var col = base * (1.0 + (br - 0.5) * 0.10)
|
|
let uv = p / max(self.rect_size, vec2(1.0, 1.0))
|
|
let t = (w.x * 0.8 + w.y) * 0.006 + self.hw_noise(w * 0.04) * 0.5 + uv.x * 0.35
|
|
let ha = 0.5 + 0.5 * sin(t * 6.2832)
|
|
let hb = pow(0.5 + 0.5 * sin(t * 10.7 + 1.3), 6.0)
|
|
var film = mix(vec3(0.05, 0.85, 1.0), vec3(0.95, 0.15, 0.85), ha)
|
|
film = mix(film, vec3(1.0, 0.85, 0.35), hb * 0.7)
|
|
let b = uv.x + uv.y * 0.6 - 0.75
|
|
let band = exp(-(b * b) / 0.03) * 0.55 + 0.07
|
|
let grating = 0.5 + 0.5 * sin((w.x - w.y) * 2.4)
|
|
col = col * (1.0 - band * 0.45) + film * band * (0.45 + 0.40 * grating)
|
|
return col
|
|
}
|
|
mod.widgets.HwKey.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
var o = self.layer(self.key_face(p, self.ground.xyz))
|
|
// A neon pipe just inside the edge: dim cyan, hot magenta when lit.
|
|
let d = self.sd(p)
|
|
let lit = clamp(self.lit, 0.0, 1.0)
|
|
let ink = mix(vec3(0.08, 0.94, 1.0), vec3(1.0, 0.12, 0.72), lit)
|
|
let line = (1.0 - smoothstep(0.2, 0.8, abs(d + 1.2))) * step(d, 0.0)
|
|
let rim_glow = exp(min(d, 0.0) / 5.0) * step(d, 0.0) * lit * 0.45
|
|
o = vec4(o.xyz * (1.0 - lit * 0.25) + ink * (line * (0.55 + 0.5 * lit) + rim_glow) * o.w, o.w)
|
|
o = self.key_marks(o, p)
|
|
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
|
|
}
|
|
mod.widgets.HwKeyButton.draw_text.color = #xc8faff
|
|
mod.widgets.HwKeyButton.draw_text.color_hover = #xffffff
|
|
mod.widgets.HwKeyButton.draw_text.color_down = #xff4fd0
|
|
mod.widgets.HwKeyText.draw_text.color = #xc8faff
|
|
mod.widgets.HwKeyText.draw_text.color_hover = #xffffff
|
|
mod.widgets.HwKeyText.draw_text.color_down = #xff4fd0
|
|
|
|
// ---- lights: slanted cyan bars ----
|
|
mod.widgets.HwDash.radius = 1
|
|
mod.widgets.HwDash.emissive = vec4(0.08, 0.94, 1.0, 9.0)
|
|
mod.widgets.HwDash.draw_bg.glow_ink = vec4(0.10, 0.95, 1.0, 1.0)
|
|
mod.widgets.HwDash.draw_bg.ground = #x0b0d12
|
|
mod.widgets.HwDash.draw_bg.light_ink = vec4(0.25, 0.35, 0.40, 1.0)
|
|
mod.widgets.HwDash.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwDash.draw_bg.spill = vec2(0.4, 0.3)
|
|
mod.widgets.HwDash.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
if self.disc > 0.5 {
|
|
return length(p - c) - min(h.x, h.y)
|
|
}
|
|
let s = p - c
|
|
let sk = vec2(s.x + s.y * 0.9, s.y)
|
|
let q = abs(sk) - h + vec2(2.0, 0.0)
|
|
return length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
}
|
|
mod.widgets.HwLed.emissive = vec4(1.0, 0.12, 0.72, 3.5)
|
|
mod.widgets.HwLed.draw_bg.glow_ink = vec4(1.0, 0.14, 0.74, 1.0)
|
|
|
|
// ---- knob: a knurled black skirt, a foil cap, a magenta pointer, a cyan ring ----
|
|
mod.widgets.HwKnobFace.draw_bg.ground = #x16181d
|
|
mod.widgets.HwKnobFace.draw_bg.light_ink = vec4(0.85, 0.95, 1.0, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.knob = vec4(1.0, 0.64, 40.0, 0.55)
|
|
mod.widgets.HwKnobFace.draw_bg.cap_ink = vec4(0.20, 0.215, 0.25, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.ptr_ink = vec4(1.0, 0.16, 0.74, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.ring = vec4(21.0, 1.30, 2.0, 2.35619)
|
|
mod.widgets.HwKnobFace.draw_bg.led_off = vec4(0.06, 0.10, 0.12, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.glow_ink = vec4(0.10, 0.95, 1.0, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.shadow = vec4(0.9, 10.0, 1.0, 0.8)
|
|
mod.widgets.HwKnobFace.draw_bg.spill = vec2(0.9, 0.5)
|
|
mod.widgets.HwKnobFace.emissive = vec4(0.08, 0.94, 1.0, 0.8)
|
|
mod.widgets.HwKnobFace.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let lum = dot(base, vec3(0.3, 0.59, 0.11))
|
|
if lum < 0.15 {
|
|
return base
|
|
}
|
|
// The cap: foil rings, colours turning with the angle.
|
|
let c = self.rect_size * 0.5
|
|
let q = p - c
|
|
let a = atan2(q.y, q.x)
|
|
let rq = length(q)
|
|
let t = a * 0.3183 + rq * 0.02
|
|
let film = vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5) * cos(vec3(6.2832, 6.2832, 6.2832) * (vec3(t, t, t) + vec3(0.0, 0.33, 0.67)))
|
|
let spun = 0.85 + 0.15 * sin(rq * 2.4)
|
|
return mix(base * spun, film * 0.55, 0.35)
|
|
}
|
|
|
|
// ---- meter: two wedge ladders of slanted cells, cyan to magenta to yellow ----
|
|
mod.widgets.HwMeterFace.radius = 8
|
|
mod.widgets.HwMeterFace.draw_bg.ground = #x06070a
|
|
mod.widgets.HwMeterFace.draw_bg.light_ink = vec4(0.6, 0.85, 1.0, 1.0)
|
|
mod.widgets.HwMeterFace.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwMeterFace.draw_bg.meter = vec4(0.0, 22.0, 1.0, 0.8)
|
|
mod.widgets.HwMeterFace.draw_bg.glow_ink = vec4(0.08, 0.94, 1.0, 1.0)
|
|
mod.widgets.HwMeterFace.draw_bg.hot_ink = vec4(1.0, 0.12, 0.72, 1.0)
|
|
mod.widgets.HwMeterFace.draw_bg.led_off = vec4(0.05, 0.10, 0.13, 1.0)
|
|
mod.widgets.HwMeterFace.emissive = vec4(0.08, 0.94, 1.0, 0.45)
|
|
mod.widgets.HwMeterFace.draw_bg.spill = vec2(0.25, 0.4)
|
|
mod.widgets.HwMeterFace.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let box = length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
let k = mix(2.5, 9.0, step(0.0, s.x * s.y))
|
|
return max(box, (q.x + q.y + min(k, min(h.x, h.y))) * 0.7071)
|
|
}
|
|
mod.widgets.HwMeterFace.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
var o = self.layer(self.surface(p, self.ground.xyz))
|
|
let a = vec2(12.0, 7.0)
|
|
let b = self.rect_size - vec2(10.0, 7.0)
|
|
let size = max(b - a, vec2(1.0, 1.0))
|
|
let n = max(self.meter.y, 2.0)
|
|
let cw = size.x / n
|
|
let lh = size.y * 0.5 - 2.0
|
|
var add = vec3(0.0, 0.0, 0.0)
|
|
var cover = 0.0
|
|
var cell_col = vec3(0.0, 0.0, 0.0)
|
|
let fl_l = 0.0
|
|
let bottom_l = a.y + lh + fl_l * (lh + 4.0)
|
|
let lv_l = mix(self.level.x, self.level.y, fl_l)
|
|
let yb_l = bottom_l - p.y
|
|
let xs_l = p.x - a.x - yb_l * 0.45
|
|
let seg_l = floor(xs_l / cw)
|
|
let fx_l = fract(xs_l / cw)
|
|
let tt_l = (seg_l + 0.5) / n
|
|
let hf_l = mix(0.35, 1.0, tt_l)
|
|
let e_l = px / cw
|
|
let cx_l = smoothstep(0.10 - e_l, 0.10 + e_l, fx_l) * (1.0 - smoothstep(0.78 - e_l, 0.78 + e_l, fx_l))
|
|
let cy_l = smoothstep(-px, px, yb_l) * (1.0 - smoothstep(lh * hf_l - px, lh * hf_l + px, yb_l))
|
|
let valid_l = step(0.0, seg_l) * step(seg_l, n - 1.0)
|
|
let m_l = cx_l * cy_l * valid_l
|
|
let on_l = step(tt_l, lv_l)
|
|
var lit_l = mix(self.glow_ink.xyz, self.hot_ink.xyz, smoothstep(0.45, 0.80, tt_l))
|
|
lit_l = mix(lit_l, vec3(1.0, 0.86, 0.10), smoothstep(0.84, 0.95, tt_l))
|
|
// Off cells: dim outlines only, a HUD's ghost of the scale.
|
|
let ol_l = (1.0 - cx_l * cy_l * (smoothstep(0.16, 0.2, fx_l) * (1.0 - smoothstep(0.68, 0.72, fx_l)) * smoothstep(1.0, 1.6, yb_l) * (1.0 - smoothstep(lh * hf_l - 1.6, lh * hf_l - 1.0, yb_l)))) * m_l
|
|
let col_l = mix(lit_l * 0.16 * ol_l, lit_l * (1.0 + 0.25 * smoothstep(0.1, 0.0, fx_l)), on_l)
|
|
cell_col = cell_col + col_l * m_l
|
|
cover = max(cover, m_l * max(on_l, ol_l))
|
|
// A glow under the lit_l cells.
|
|
add = add + lit_l * on_l * valid_l * exp(-abs(yb_l - lh * hf_l * 0.5) / (lh * 0.8)) * 0.06
|
|
// Baseline tick_l under each lane.
|
|
let tick_l = (1.0 - smoothstep(0.3, 0.9, abs(yb_l + 1.6))) * step(0.0, p.x - a.x) * step(p.x, b.x) * step(0.5, fract((p.x - a.x) / (cw * 2.0)))
|
|
add = add + self.glow_ink.xyz * tick_l * 0.30
|
|
let fl_r = 1.0
|
|
let bottom_r = a.y + lh + fl_r * (lh + 4.0)
|
|
let lv_r = mix(self.level.x, self.level.y, fl_r)
|
|
let yb_r = bottom_r - p.y
|
|
let xs_r = p.x - a.x - yb_r * 0.45
|
|
let seg_r = floor(xs_r / cw)
|
|
let fx_r = fract(xs_r / cw)
|
|
let tt_r = (seg_r + 0.5) / n
|
|
let hf_r = mix(0.35, 1.0, tt_r)
|
|
let e_r = px / cw
|
|
let cx_r = smoothstep(0.10 - e_r, 0.10 + e_r, fx_r) * (1.0 - smoothstep(0.78 - e_r, 0.78 + e_r, fx_r))
|
|
let cy_r = smoothstep(-px, px, yb_r) * (1.0 - smoothstep(lh * hf_r - px, lh * hf_r + px, yb_r))
|
|
let valid_r = step(0.0, seg_r) * step(seg_r, n - 1.0)
|
|
let m_r = cx_r * cy_r * valid_r
|
|
let on_r = step(tt_r, lv_r)
|
|
var lit_r = mix(self.glow_ink.xyz, self.hot_ink.xyz, smoothstep(0.45, 0.80, tt_r))
|
|
lit_r = mix(lit_r, vec3(1.0, 0.86, 0.10), smoothstep(0.84, 0.95, tt_r))
|
|
// Off cells: dim outlines only, a HUD's ghost of the scale.
|
|
let ol_r = (1.0 - cx_r * cy_r * (smoothstep(0.16, 0.2, fx_r) * (1.0 - smoothstep(0.68, 0.72, fx_r)) * smoothstep(1.0, 1.6, yb_r) * (1.0 - smoothstep(lh * hf_r - 1.6, lh * hf_r - 1.0, yb_r)))) * m_r
|
|
let col_r = mix(lit_r * 0.16 * ol_r, lit_r * (1.0 + 0.25 * smoothstep(0.1, 0.0, fx_r)), on_r)
|
|
cell_col = cell_col + col_r * m_r
|
|
cover = max(cover, m_r * max(on_r, ol_r))
|
|
// A glow under the lit_r cells.
|
|
add = add + lit_r * on_r * valid_r * exp(-abs(yb_r - lh * hf_r * 0.5) / (lh * 0.8)) * 0.06
|
|
// Baseline tick_r under each lane.
|
|
let tick_r = (1.0 - smoothstep(0.3, 0.9, abs(yb_r + 1.6))) * step(0.0, p.x - a.x) * step(p.x, b.x) * step(0.5, fract((p.x - a.x) / (cw * 2.0)))
|
|
add = add + self.glow_ink.xyz * tick_r * 0.30
|
|
// Scanlines over the cells.
|
|
let sl = 0.82 + 0.18 * (0.5 + 0.5 * sin(p.y * 3.14159 * self.draw_pass.dpi_factor))
|
|
let inner = step(0.0, -self.sd(p) - 1.0)
|
|
let face = mix(o.xyz, cell_col * sl, cover) + add
|
|
o = vec4(mix(o.xyz, face, inner * o.w), o.w)
|
|
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
|
|
}
|
|
|
|
// ---- the spectrum: segmented, chroma-fringed bars on a HUD grid ----
|
|
mod.widgets.HwSpectrum.light = 9.0
|
|
mod.widgets.HwSpectrum.draw_label.text_style = theme.font_code{font_size: 7.5}
|
|
// Parts by `self.part` (1 well, 2 rule, 3 slot, 4 bar, 5 peak, 6 midline).
|
|
mod.widgets.HwSpectrum.draw_round.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let sz = self.rect_size
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
if self.part > 0.5 && self.part < 1.5 {
|
|
// The well: black, a fine cyan grid.
|
|
let f = fract(p / vec2(20.0, 20.0))
|
|
let g = max(1.0 - smoothstep(0.0, 0.03, f.x), 1.0 - smoothstep(0.0, 0.03, f.y))
|
|
let col = vec3(0.015, 0.02, 0.03) + vec3(0.08, 0.94, 1.0) * g * 0.05
|
|
return vec4(col, 1.0)
|
|
}
|
|
if (self.part > 1.5 && self.part < 2.5) || (self.part > 5.5 && self.part < 6.5) {
|
|
// Level rules: dashed cyan.
|
|
let a = step(0.5, fract(p.x / 6.0)) * 0.22
|
|
return vec4(vec3(0.08, 0.94, 1.0) * a, a)
|
|
}
|
|
if self.part > 2.5 && self.part < 3.5 {
|
|
// The empty slot: ghost cells.
|
|
let cell = step(1.0, fract((sz.y - p.y) / 4.0) * 4.0)
|
|
let a = 0.07 * cell
|
|
return vec4(vec3(0.08, 0.94, 1.0) * a, a)
|
|
}
|
|
if self.part > 4.5 && self.part < 5.5 {
|
|
// The peak mark: hot magenta.
|
|
return vec4(1.0, 0.25, 0.80, 1.0)
|
|
}
|
|
// A lit bar: stacked cells, cyan at the floor to magenta to yellow at
|
|
// the top of the scale, a magenta fringe on its left and cyan on its right.
|
|
let yb = sz.y - p.y
|
|
let cell = smoothstep(0.9, 1.0 + px, fract(yb / 4.0) * 4.0)
|
|
let t = clamp(yb / 150.0, 0.0, 1.0)
|
|
var col = mix(vec3(0.06, 0.90, 1.0), vec3(1.0, 0.14, 0.72), smoothstep(0.22, 0.55, t))
|
|
col = mix(col, vec3(1.0, 0.88, 0.14), smoothstep(0.68, 0.85, t))
|
|
let lx = 1.0 - smoothstep(0.0, 1.0, p.x)
|
|
let rx = smoothstep(sz.x - 1.0, sz.x, p.x)
|
|
col = mix(col, vec3(1.0, 0.1, 0.6), lx * 0.8)
|
|
col = mix(col, vec3(0.7, 1.0, 1.0), rx * 0.8)
|
|
let top = 1.0 - smoothstep(0.0, 3.0, p.y)
|
|
col = col + vec3(0.5, 0.5, 0.5) * top
|
|
return vec4(col * cell, cell)
|
|
}
|
|
// The waveform: a white-hot trace with a magenta ghost above-left and a
|
|
// cyan one below-right.
|
|
mod.widgets.HwSpectrum.draw_line.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let a = self.seg_a
|
|
let b = self.seg_b
|
|
let ba = b - a
|
|
let bb = max(dot(ba, ba), 0.0001)
|
|
let pa = p - a
|
|
let d = length(pa - ba * clamp(dot(pa, ba) / bb, 0.0, 1.0))
|
|
let pm = p - a + vec2(1.4, 1.0)
|
|
let dm = length(pm - ba * clamp(dot(pm, ba) / bb, 0.0, 1.0))
|
|
let pc = p - a - vec2(1.4, 1.0)
|
|
let dc = length(pc - ba * clamp(dot(pc, ba) / bb, 0.0, 1.0))
|
|
let core = 1.0 - smoothstep(0.2, 0.9, d)
|
|
let gm = (1.0 - smoothstep(0.3, 1.1, dm)) * 0.75
|
|
let gc = (1.0 - smoothstep(0.3, 1.1, dc)) * 0.75
|
|
let rgb = vec3(1.0, 0.14, 0.72) * gm + vec3(0.08, 0.94, 1.0) * gc + vec3(0.9, 1.0, 1.0) * core
|
|
let al = clamp(max(core, max(gm, gc)), 0.0, 1.0)
|
|
return vec4(rgb * min(al, 1.0), al * 0.9)
|
|
}
|
|
|
|
// ---- MilkDrop's light on the wet metal ----
|
|
mod.widgets.HwMilk.light = 3.2
|
|
mod.widgets.HwMilk.light_knee = 1.0
|
|
|
|
// ---- type: cyan HUD print, white titles ----
|
|
mod.widgets.HwCaption.draw_text.color = #x14f0ff
|
|
mod.widgets.HwCaption.draw_text.text_style = theme.font_bold{font_size: 8.0}
|
|
mod.widgets.HwTitle.draw_text.color = #xf2fbff
|
|
mod.widgets.HwText.draw_text.color = #x9fb4c8
|
|
mod.widgets.HwPanelTitle.draw_text.color = #xf2fbff
|
|
mod.widgets.HwPanelText.draw_text.color = #x7f97ab
|
|
mod.widgets.HwNavButton.draw_text.color = #xc8e8f5
|
|
mod.widgets.HwNavButton.draw_text.color_hover = #xffffff
|
|
mod.widgets.HwNavButton.draw_bg.plate = vec4(0.08, 0.94, 1.0, 0.04)
|
|
mod.widgets.HwNavButton.draw_bg.plate_hover = vec4(1.0, 0.12, 0.72, 0.14)
|
|
mod.widgets.HwNavButton.draw_bg.rim = vec4(0.08, 0.94, 1.0, 0.18)
|
|
mod.widgets.HwDisplayText.draw_text.color = #x14f0ff
|
|
mod.widgets.HwDisplayText.draw_text.text_style = theme.font_code{font_size: 10.0}
|
|
|
|
// Small displays: the progress strip, the equalizer. Black, a dot matrix.
|
|
mod.widgets.HwDisplay.radius = 10
|
|
mod.widgets.HwDisplay.draw_bg.ground = #x05060a
|
|
mod.widgets.HwDisplay.draw_bg.light_ink = vec4(0.6, 0.85, 1.0, 1.0)
|
|
mod.widgets.HwDisplay.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwDisplay.draw_bg.inner = vec4(1.0, 10.0, 0.0, 0.6)
|
|
mod.widgets.HwDisplay.draw_bg.spill = vec2(0.8, 0.4)
|
|
mod.widgets.HwDisplay.draw_bg.sd = fn(p: vec2) -> float {
|
|
let c = self.rect_size * 0.5
|
|
let h = max(c - vec2(self.inset, self.inset), vec2(0.5, 0.5))
|
|
let s = p - c
|
|
let q = abs(s) - h
|
|
let box = length(max(q, vec2(0.0, 0.0))) + min(max(q.x, q.y), 0.0)
|
|
let k = mix(self.radius * 0.3, self.radius, step(0.0, s.x * s.y))
|
|
return max(box, (q.x + q.y + min(k, min(h.x, h.y))) * 0.7071)
|
|
}
|
|
mod.widgets.HwDisplay.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let f = fract(p / vec2(3.0, 3.0)) - vec2(0.5, 0.5)
|
|
let dotm = 1.0 - smoothstep(0.18, 0.32, length(f))
|
|
return base + vec3(0.0, 0.035, 0.045) * dotm
|
|
}
|
|
|
|
// Choosers and fields: black glass, cyan rim, magenta arrow.
|
|
mod.widgets.HwDropDown.draw_bg.well = vec4(0.02, 0.025, 0.035, 1.0)
|
|
mod.widgets.HwDropDown.draw_bg.rim = vec4(0.08, 0.94, 1.0, 0.45)
|
|
mod.widgets.HwDropDown.draw_bg.arrow = vec4(1.0, 0.16, 0.74, 1.0)
|
|
mod.widgets.HwDropDown.draw_text.color = #xc8faff
|
|
mod.widgets.HwDropDown.draw_text.color_hover = #xffffff
|
|
mod.widgets.HwTextInput.draw_bg.well = vec4(0.02, 0.025, 0.035, 1.0)
|
|
mod.widgets.HwTextInput.draw_bg.rim = vec4(0.08, 0.94, 1.0, 0.45)
|
|
mod.widgets.HwTextInput.draw_text.color = #xe6fbff
|
|
|
|
// The switches: a black slot, a magenta cap with a cyan light.
|
|
mod.widgets.HwSegmented.draw_bg.well = vec4(0.02, 0.025, 0.035, 1.0)
|
|
mod.widgets.HwSegmented.draw_bg.rim = vec4(0.08, 0.94, 1.0, 0.40)
|
|
mod.widgets.HwSegmented.draw_pill.cap = vec4(1.0, 0.12, 0.72, 0.30)
|
|
mod.widgets.HwSegmented.draw_pill.glow = vec4(0.10, 0.95, 1.0, 1.0)
|
|
mod.widgets.HwSegmented.draw_text.color = #x7f97ab
|
|
mod.widgets.HwSegmented.draw_text_selected.color = #xffffff
|
|
|
|
// Chamfered fields: the same cut as the plates, a magenta tick at the left.
|
|
mod.widgets.HwDropDown.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let sz = self.rect_size
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
let s = p - sz * 0.5
|
|
let q = abs(s) - (sz * 0.5 - vec2(0.5, 0.5))
|
|
let k = mix(2.5, 8.0, step(0.0, s.x * s.y))
|
|
let d = max(max(q.x, q.y), (q.x + q.y + k) * 0.7071)
|
|
let cov = 1.0 - smoothstep(-px, px, d)
|
|
let top = 1.0 - smoothstep(0.0, 6.0, p.y) * 0.5
|
|
var col = self.well.xyz * top
|
|
let rim = 1.0 - smoothstep(0.3, 1.0, abs(d + 0.6))
|
|
col = mix(col, self.rim.xyz, rim * self.rim.w)
|
|
let x = sz.x - 13.0
|
|
let y = sz.y * 0.5
|
|
let a1 = vec2(x - 3.5, y - 1.8)
|
|
let b1 = vec2(x, y + 1.8)
|
|
let a2 = vec2(x + 3.5, y - 1.8)
|
|
let pa = p - a1
|
|
let ba = b1 - a1
|
|
let d1 = length(pa - ba * clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0))
|
|
let pb = p - a2
|
|
let bb = b1 - a2
|
|
let d2 = length(pb - bb * clamp(dot(pb, bb) / dot(bb, bb), 0.0, 1.0))
|
|
let ar = 1.0 - smoothstep(0.35, 0.35 + px * 1.5, min(d1, d2))
|
|
col = mix(col, self.arrow.xyz, ar * self.arrow.w)
|
|
return vec4(col * cov, cov * self.well.w)
|
|
}
|
|
mod.widgets.HwTextInput.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let sz = self.rect_size
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
let s = p - sz * 0.5
|
|
let q = abs(s) - (sz * 0.5 - vec2(0.5, 0.5))
|
|
let k = mix(2.5, 9.0, step(0.0, s.x * s.y))
|
|
let d = max(max(q.x, q.y), (q.x + q.y + k) * 0.7071)
|
|
let cov = 1.0 - smoothstep(-px, px, d)
|
|
let top = 1.0 - smoothstep(0.0, 7.0, p.y) * 0.5
|
|
var col = self.well.xyz * top
|
|
let rim = 1.0 - smoothstep(0.3, 1.0, abs(d + 0.6))
|
|
col = mix(col, self.rim.xyz, rim * self.rim.w)
|
|
return vec4(col * cov, cov * self.well.w)
|
|
}
|
|
mod.widgets.HwSegmented.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let sz = self.rect_size
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
let s = p - sz * 0.5
|
|
let q = abs(s) - (sz * 0.5 - vec2(0.5, 0.5))
|
|
let k = mix(2.5, 9.0, step(0.0, s.x * s.y))
|
|
let d = max(max(q.x, q.y), (q.x + q.y + k) * 0.7071)
|
|
let cov = 1.0 - smoothstep(-px, px, d)
|
|
let top = 1.0 - smoothstep(0.0, 7.0, p.y) * 0.5
|
|
var col = self.well.xyz * top
|
|
let rim = 1.0 - smoothstep(0.3, 1.0, abs(d + 0.6))
|
|
col = mix(col, self.rim.xyz, rim * self.rim.w)
|
|
return vec4(col * cov, cov * self.well.w)
|
|
}
|
|
mod.widgets.HwSegmented.draw_pill.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
let sz = self.rect_size
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
let s = p - sz * 0.5
|
|
let q = abs(s) - (sz * 0.5 - vec2(2.5, 2.5))
|
|
let k = mix(2.0, 7.0, step(0.0, s.x * s.y))
|
|
let d = max(max(q.x, q.y), (q.x + q.y + k) * 0.7071)
|
|
let cov = 1.0 - smoothstep(-px, px, d)
|
|
let shade = mix(1.25, 0.75, self.pos.y)
|
|
let rim = 1.0 - smoothstep(0.3, 1.0, abs(d + 0.6))
|
|
var col = self.cap.xyz * shade * 0.8
|
|
col = mix(col, self.cap.xyz * 1.2, rim)
|
|
let dash = (1.0 - smoothstep(0.0, 1.2, abs(p.y - (sz.y - 5.0)))) * step(8.0, p.x) * step(p.x, sz.x - 8.0)
|
|
let a = cov * clamp(self.cap.w * 1.6 + rim * 0.6, 0.0, 1.0)
|
|
return vec4(col * a, a) * (1.0 - dash) + vec4(self.glow.xyz * dash, dash)
|
|
}
|
|
mod.widgets.HwMenuLayer.draw_bg.border_color = vec4(0.08, 0.94, 1.0, 0.5)
|
|
|
|
mod.widgets.HwArtBlank.draw_bg.vinyl = vec4(0.03, 0.035, 0.045, 1.0)
|
|
mod.widgets.HwArtBlank.draw_bg.label_ink = vec4(1.0, 0.12, 0.72, 1.0)
|
|
|
|
mod.widgets.HwSplitter.draw_bg.groove = vec4(0.0, 0.0, 0.0, 0.5)
|
|
mod.widgets.HwSplitter.draw_bg.glint = vec4(0.08, 0.94, 1.0, 0.35)
|
|
true
|
|
|
|
// ---- EQ (HwEqGraph: the graphic equalizer's era look, STYLE_GUIDE "Graphic EQ") ----
|
|
mod.widgets.HwEqGraph.draw_fader.fader = vec4(3.0, 0.52, 8.0, 3.0)
|
|
mod.widgets.HwEqGraph.draw_fader.track_ink = vec4(0.10, 0.05, 0.14, 1.0)
|
|
mod.widgets.HwEqGraph.draw_fader.glow_ink = vec4(1.0, 0.18, 0.66, 1.0)
|
|
mod.widgets.HwEqGraph.draw_curve.curve = vec4(0.0, 1.8, 11.0, 0.10)
|
|
mod.widgets.HwEqGraph.draw_grid.grid = vec4(0.0, 0.12, 0.32, 0.0)
|
|
mod.widgets.HwEqGraph.draw_grid.grid_ink = vec4(0.08, 0.94, 1.0, 0.8)
|
|
mod.widgets.HwEqGraph.draw_spectrum.spectrum = vec4(0.20, 0.0, 0.35, 0.0)
|
|
mod.widgets.HwEqGraph.light = 1.6
|
|
true
|