makepad/apps/amp/resources/styles/lcd.splash
Admin 922a61736d apps: Code, Translator, Weather, Amp and the rest
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>
2026-10-13 12:26:21 +02:00

739 lines
36 KiB
Text

// title: 90s LCD
// order: 40
// 90s LCD — a 1990s portable: a silver-grey moulded plastic body with
// small rubbery keys, printed icons and tiny printed labels, and every
// readout a reflective grey-green STN liquid-crystal panel. Crisp black
// segments sit over their faint unlit ghosts (88:88 behind every number,
// every bar faintly there), 7-segment digits, dot-matrix rows, a segmented
// bar spectrum and bar-graph meters, and a blue-green EL backlight glowing
// round the glass. The picture itself is a small colour LCD inset.
use mod.prelude.widgets_internal.*
// ---- palette: STN grey-green glass, black segments, blue ink ----
mod.widgets.hw_palette.screen_bg = #x9dac92
mod.widgets.hw_palette.screen_text = #x141b16
mod.widgets.hw_palette.screen_muted = #x2f3d34
mod.widgets.hw_palette.accent = #x1d3470
mod.widgets.hw_palette.panel_text = #x141b16
mod.widgets.hw_palette.panel_muted = #x4f5e4a
mod.widgets.hw_palette.menu_bg = #x9dac92
mod.widgets.hw_palette.spill_color = #x62f0cf
mod.widgets.hw_palette.spill_mono = 0.55
mod.widgets.hw_palette.spill_knee = 1.1
mod.widgets.hw_palette.spill_dark = 0.7
mod.widgets.hw_palette.caption_bg = #xaeb2b6
mod.widgets.hw_palette.caption_text = #x2a2d31
mod.widgets.hw_palette.legend_on = #x1d3470
mod.widgets.hw_palette.legend_off = #x3a3e44
mod.widgets.hw_palette.caps = 1
// The picture as a passive-matrix colour LCD: a washed-out four-stop map.
mod.widgets.hw_palette.map0 = #x141d2a
mod.widgets.hw_palette.map1 = #x2a7680
mod.widgets.hw_palette.map2 = #xa9c48c
mod.widgets.hw_palette.map3 = #xf0e6c0
mod.widgets.hw_palette.map_strength = 0.8
mod.widgets.hw_palette.map_default = 1
// ---- the body: silver-grey moulded plastic ----
mod.widgets.Window.pass.clear_color = #x8c9197
mod.widgets.HwChassis.draw_bg.ground = #x8e939a
mod.widgets.HwChassis.draw_bg.light_ink = vec4(1.0, 1.0, 1.0, 1.0)
mod.widgets.HwChassis.draw_bg.shadow_ink = vec4(0.30, 0.32, 0.34, 1.0)
mod.widgets.HwChassis.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwChassis.draw_bg.spill = vec2(2.6, 0.6)
mod.widgets.HwChassis.draw_bg.vignette = vec4(0.5, 0.25, 0.22, 1.02)
mod.widgets.HwChassis.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
let w = self.world.xy
// Metallic-flake plastic: a fine sparkle in a satin moulding.
var col = base * (1.0 + (self.hw_noise(w * 0.05) - 0.5) * 0.03)
let fl = self.hw_hash(floor(w * 1.6))
col = col + vec3(0.07, 0.07, 0.075) * step(0.965, fl) - vec3(0.025, 0.025, 0.025) * step(fl, 0.04)
// Moulded ribbing: fine horizontal grip lines in a band along the foot.
let rib = step(0.5, fract(w.y / 3.0))
col = col * (1.0 - rib * 0.035 * smoothstep(0.0, 20.0, w.y - self.world.y + p.y - (self.rect_size.y - 36.0)))
return col
}
// ---- raised plates: the lighter silver lid mouldings, printed labels ----
mod.widgets.HwPlate.radius = 12
mod.widgets.HwPlate.depth = 2.4
mod.widgets.HwPlate.draw_bg.ground = #xc9cdd1
mod.widgets.HwPlate.draw_bg.light_ink = vec4(1.0, 1.0, 1.0, 1.0)
mod.widgets.HwPlate.draw_bg.shadow_ink = vec4(0.28, 0.30, 0.32, 1.0)
mod.widgets.HwPlate.draw_bg.relief = vec4(4.0, 0.95, 2.2, 0.25)
mod.widgets.HwPlate.draw_bg.finish = vec4(0.5, 0.35, 0.25, 0.7)
mod.widgets.HwPlate.draw_bg.tune = vec4(0.10, 0.25, 1.1, 3.0)
mod.widgets.HwPlate.draw_bg.shadow = vec4(0.45, 8.0, 1.0, 0.5)
mod.widgets.HwPlate.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwPlate.draw_bg.spill = vec2(3.0, 0.55)
mod.widgets.HwPlate.draw_bg.sheen = vec4(0.05, 0.25, 0.3, 0.4)
mod.widgets.HwPlate.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
let w = self.world.xy
var col = base * (1.0 + (self.hw_noise(w * 0.05) - 0.5) * 0.025)
let fl = self.hw_hash(floor(w * 1.6))
col = col + vec3(0.06, 0.06, 0.065) * step(0.97, fl)
// A printed pinstripe 6 pt in, in the body's blue ink.
let lo = vec2(self.inset, self.inset)
let q = p - lo
let sz = self.rect_size - lo * 2.0
let e = min(min(q.x, q.y), min(sz.x - q.x, sz.y - q.y))
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
let pin = 1.0 - smoothstep(0.3, 0.3 + px, abs(e - 6.0))
col = mix(col, vec3(0.26, 0.34, 0.52), pin * 0.55)
// The wings carry the model's tricolour flash along the foot: three
// hairlines, teal, magenta and blue, stepping in like a 90s decal.
if self.plate_id > 0.5 && self.plate_id < 2.5 {
let fy = sz.y - q.y
let x0 = 14.0
let l1 = (1.0 - smoothstep(0.35, 0.35 + px, abs(fy - 6.0))) * step(x0, q.x) * step(q.x, sz.x * 0.62)
let l2 = (1.0 - smoothstep(0.35, 0.35 + px, abs(fy - 8.6))) * step(x0 + 8.0, q.x) * step(q.x, sz.x * 0.62 + 8.0)
let l3 = (1.0 - smoothstep(0.35, 0.35 + px, abs(fy - 11.2))) * step(x0 + 16.0, q.x) * step(q.x, sz.x * 0.62 + 16.0)
col = mix(col, vec3(0.16, 0.66, 0.60), l1 * 0.9)
col = mix(col, vec3(0.72, 0.22, 0.52), l2 * 0.9)
col = mix(col, vec3(0.20, 0.30, 0.62), l3 * 0.9)
}
return col
}
// ---- recessed panels: the lists behind reflective STN glass ----
mod.widgets.HwPanel.radius = 6
mod.widgets.HwPanel.depth = -2.5
mod.widgets.HwPanel.draw_bg.ground = #x9dac92
mod.widgets.HwPanel.draw_bg.light_ink = vec4(0.95, 1.0, 0.95, 1.0)
mod.widgets.HwPanel.draw_bg.shadow_ink = vec4(0.10, 0.14, 0.10, 1.0)
mod.widgets.HwPanel.draw_bg.inner = vec4(0.85, 8.0, 0.0, 0.3)
mod.widgets.HwPanel.draw_bg.tune = vec4(0.06, 0.2, 1.0, 3.0)
mod.widgets.HwPanel.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwPanel.draw_bg.spill = vec2(1.4, 0.5)
mod.widgets.HwPanel.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
// The reflector: a faint grain behind the glass, a gradient where
// the polariser catches the room light, and the ghost dot matrix.
let w = self.world.xy
var col = base * (1.0 + (self.hw_hash(floor(w * 1.3)) - 0.5) * 0.03)
col = col * (1.04 - 0.08 * self.pos.y)
let g = fract(w / 3.0)
let dotm = step(0.2, g.x) * step(g.x, 0.85) * step(0.2, g.y) * step(g.y, 0.85)
col = col * (1.0 - dotm * 0.035)
// A glare band where the polariser catches the room, top left.
let gl = self.pos.x * 0.6 + self.pos.y
col = col + vec3(0.05, 0.055, 0.05) * (1.0 - smoothstep(0.0, 0.35, gl))
// The printed mask's border, a dark hairline 5 pt in from the frame.
let lo = vec2(self.inset, self.inset)
let q = p - lo
let sz = self.rect_size - lo * 2.0
let e = min(min(q.x, q.y), min(sz.x - q.x, sz.y - q.y))
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
col = mix(col, vec3(0.20, 0.25, 0.20), (1.0 - smoothstep(0.35, 0.35 + px, abs(e - 5.0))) * 0.45)
return col
}
// ---- the screen's surround: a dark grey moulded frame, EL glow at the glass ----
mod.widgets.HwBezel.radius = 10
mod.widgets.HwBezel.depth = -3.5
mod.widgets.HwBezel.draw_bg.ground = #x3a3e44
mod.widgets.HwBezel.draw_bg.light_ink = vec4(0.85, 0.88, 0.9, 1.0)
mod.widgets.HwBezel.draw_bg.shadow_ink = vec4(0.02, 0.02, 0.03, 1.0)
mod.widgets.HwBezel.draw_bg.inner = vec4(0.9, 10.0, 0.0, 0.5)
mod.widgets.HwBezel.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwBezel.draw_bg.spill = vec2(1.6, 0.5)
mod.widgets.HwBezel.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
let w = self.world.xy
var col = base * (1.0 + (self.hw_hash(floor(w * 1.6)) - 0.5) * 0.05)
let lo = vec2(self.inset, self.inset)
let q = p - lo
let sz = self.rect_size - lo * 2.0
let e = min(min(q.x, q.y), min(sz.x - q.x, sz.y - q.y))
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
// A printed silver line round the window.
col = mix(col, vec3(0.70, 0.73, 0.76), (1.0 - smoothstep(0.3, 0.3 + px, abs(e - 4.0))) * 0.7)
// The EL backlight leaking out round the glass.
col = col + vec3(0.30, 0.85, 0.72) * exp(-max(e - 8.0, 0.0) / 5.0) * smoothstep(5.0, 9.0, e) * 0.35
return col
}
// ---- the glass over the picture: a colour LCD's pixel grid ----
mod.widgets.HwGlass.draw_bg.glass = vec4(0.0, 0.08, 0.35, 0.0)
mod.widgets.HwGlass.draw_bg.radius = 4.0
mod.widgets.HwGlass.draw_bg.pixel = fn() {
let p = self.pos * self.rect_size
let c = self.rect_size * 0.5
let d = Material.sd_box(p, c, c, self.radius)
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
let cov = 1.0 - smoothstep(-px, px, d)
let edge = smoothstep(-28.0, 0.0, d) * self.glass.z
let dark = clamp(edge, 0.0, 1.0)
// The polariser's cool reflection across the top, a hard glint line.
let rl = smoothstep(0.55, 0.0, self.pos.y + (self.pos.x - 0.5) * 0.3) * self.glass.y + (1.0 - smoothstep(0.0, 0.006, abs(self.pos.y - 0.06 + (self.pos.x - 0.5) * 0.04))) * 0.05
let tint = vec3(0.80, 0.92, 0.88)
return vec4(tint * rl, rl) * cov + vec4(0.0, 0.0, 0.0, dark * cov) * (1.0 - rl)
}
// ---- keys: small rubbery buttons in grey silicone, printed icons ----
mod.widgets.HwKey.radius = 11
mod.widgets.HwKey.depth = 2.6
mod.widgets.HwKey.press = -2.2
mod.widgets.HwKey.inset = 8
mod.widgets.HwKey.draw_bg.ground = #x8a8f95
mod.widgets.HwKey.draw_bg.light_ink = vec4(0.92, 0.94, 0.96, 1.0)
mod.widgets.HwKey.draw_bg.shadow_ink = vec4(0.26, 0.28, 0.31, 1.0)
mod.widgets.HwKey.draw_bg.relief = vec4(4.5, 1.0, 2.0, 0.08)
mod.widgets.HwKey.draw_bg.finish = vec4(0.6, 0.15, 0.10, 1.0)
mod.widgets.HwKey.draw_bg.tune = vec4(0.10, 0.0, 1.0, 3.0)
mod.widgets.HwKey.draw_bg.shadow = vec4(0.45, 6.0, 1.0, 0.5)
mod.widgets.HwKey.draw_bg.inner = vec4(0.72, 9.0, 0.0, 0.0)
mod.widgets.HwKey.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwKey.draw_bg.spill = vec2(2.4, 0.5)
mod.widgets.HwKey.emissive = vec4(0.38, 0.94, 0.81, 0.3)
mod.widgets.HwKey.draw_bg.led = vec4(5.0, 5.0, 1.5, 0.0)
mod.widgets.HwKey.draw_bg.led_off = vec4(0.46, 0.49, 0.52, 1.0)
mod.widgets.HwKey.draw_bg.critical_ink = vec4(0.16, 0.30, 0.62, 1.0)
mod.widgets.HwKey.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
// Silicone rubber: a soft matte tooth.
let w = self.world.xy
return base * (1.0 + (self.hw_hash(floor(w * 2.2)) - 0.5) * 0.05)
}
mod.widgets.HwKey.draw_bg.key_face = fn(p: vec2, base: vec3) -> vec3 {
var c = self.surface(p, base)
// Play and PRESETS are moulded in the model's blue rubber.
c = mix(c, self.surface(p, self.critical_ink.xyz), self.critical * self.critical_ink.w)
// A soft pillow: lighter crown, darker toward the rim.
let u = (p - self.rect_size * 0.5) / max(self.rect_size * 0.5 - vec2(self.inset, self.inset), vec2(1.0, 1.0))
c = c * (1.06 - 0.12 * clamp(dot(u, u), 0.0, 1.0))
return c
}
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))
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 = #x1e2226
mod.widgets.HwKeyButton.draw_text.color_hover = #x0c0e10
mod.widgets.HwKeyButton.draw_text.color_down = #x1d3470
mod.widgets.HwKeyText.draw_text.color = #x1e2226
mod.widgets.HwKeyText.draw_text.color_hover = #x0c0e10
mod.widgets.HwKeyText.draw_text.color_down = #x1d3470
mod.widgets.HwKeyText.draw_text.text_style = theme.font_bold{font_size: 7.5}
// ---- indicators: a tiny LCD window, a black segment when on ----
mod.widgets.HwDash.radius = 2
mod.widgets.HwDash.depth = -0.6
mod.widgets.HwDash.emissive = vec4(0.38, 0.94, 0.81, 2.5)
mod.widgets.HwDash.draw_bg.ground = #x9dac92
mod.widgets.HwDash.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwDash.draw_bg.pixel = fn() {
let p = self.pos * self.rect_size
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
let lit = clamp(self.lit, 0.0, 1.0)
// The glass: grey-green, washed toward EL teal while on.
var g = mix(self.ground.xyz, vec3(0.50, 0.86, 0.76), lit * 0.55)
var o = self.layer(g)
// The segment: a pointed bar, a ghost when off.
let c = self.rect_size * 0.5
let q = abs(p - c)
let hw = c.x - self.inset - 3.0
let sd = max(q.x + q.y - hw, q.y - 1.6)
let m = 1.0 - smoothstep(-px, px, sd)
let segc = mix(vec3(0.52, 0.59, 0.49), vec3(0.06, 0.08, 0.07), lit)
o = vec4(mix(o.xyz, segc, m * o.w * mix(0.35, 1.0, lit)), o.w)
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
}
mod.widgets.HwLed.emissive = vec4(0.38, 0.94, 0.81, 2.0)
mod.widgets.HwLed.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
// ---- volume: a knurled silver thumbwheel inside an LCD arc bar-graph ----
mod.widgets.HwKnobFace.depth = 5.0
mod.widgets.HwKnobFace.draw_bg.ground = #xc3c7cb
mod.widgets.HwKnobFace.draw_bg.light_ink = vec4(1.0, 1.0, 1.0, 1.0)
mod.widgets.HwKnobFace.draw_bg.shadow_ink = vec4(0.20, 0.22, 0.24, 1.0)
mod.widgets.HwKnobFace.draw_bg.relief = vec4(3.0, 0.95, 2.0, 0.35)
mod.widgets.HwKnobFace.draw_bg.knob = vec4(1.0, 0.70, 60.0, 0.28)
mod.widgets.HwKnobFace.draw_bg.cap_ink = vec4(0.80, 0.82, 0.84, 1.0)
mod.widgets.HwKnobFace.draw_bg.ptr_ink = vec4(0.11, 0.20, 0.44, 1.0)
mod.widgets.HwKnobFace.draw_bg.ring = vec4(16.0, 1.34, 2.0, 2.35619)
mod.widgets.HwKnobFace.draw_bg.shadow = vec4(0.5, 7.0, 1.0, 0.55)
mod.widgets.HwKnobFace.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwKnobFace.draw_bg.spill = vec2(0.8, 0.4)
mod.widgets.HwKnobFace.emissive = vec4(0.38, 0.94, 0.81, 0.35)
mod.widgets.HwKnobFace.draw_bg.pixel = fn() {
let p = self.pos * self.rect_size
let c = self.rect_size * 0.5
let q = p - c
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
let r = min(c.x, c.y) - self.inset
var o = self.layer(self.surface(p, self.ground.xyz))
let rq = length(q)
let ang = atan2(q.x, -q.y)
let inside = 1.0 - smoothstep(-px, px, rq - r)
var face = o.xyz
// The knurled skirt and a satin cap with a printed blue index.
let cr = r * self.knob.y
let skirt = smoothstep(cr - px, cr + px, rq) * inside
let ridge = 0.5 + 0.5 * cos(ang * self.knob.z)
face = face * (1.0 - skirt * ridge * self.knob.w)
let capm = 1.0 - smoothstep(cr - px, cr + px, rq)
let lt = normalize(self.light.xy + vec2(0.000001, 0.000001))
let spun = 0.5 + 0.5 * sin(rq * 2.4)
let aniso = 0.5 + 0.5 * cos((ang - atan2(lt.x, -lt.y)) * 2.0)
let capcol = self.cap_ink.xyz * (0.94 + 0.05 * spun) + vec3(0.12, 0.12, 0.12) * aniso
face = mix(face, capcol, capm)
let spin = (self.value * 2.0 - 1.0) * self.ring.w
let dir = vec2(sin(spin), -cos(spin))
let t = clamp(dot(q, dir), cr * 0.45, cr * 0.88)
let pd = length(q - dir * t) - 1.4
face = mix(face, self.ptr_ink.xyz, (1.0 - smoothstep(-px, px, pd)) * capm)
o = vec4(face * inside, inside) + o * (1.0 - inside)
// The LCD ring: a recessed grey-green annulus of wedge segments.
let r0 = r * 1.12
let r1 = r * 1.42
let ring_m = smoothstep(r0 - px, r0 + px, rq) * (1.0 - smoothstep(r1 - px, r1 + px, rq))
let lcd = vec3(0.62, 0.68, 0.57) * (1.0 + 0.06 * (-q.y / max(r1, 1.0)))
let inner_sh = (1.0 - smoothstep(0.0, 3.0, rq - r0)) * 0.25 + (1.0 - smoothstep(0.0, 2.0, r1 - rq)) * 0.10
var ring = lcd * (1.0 - inner_sh)
let n = self.ring.x
let a0 = -self.ring.w
let stepa = (self.ring.w * 2.0) / n
let fi = floor((ang - a0) / stepa)
let fa = (ang - a0) / stepa - fi
let inseg = step(0.0, fi) * step(fi, n - 1.0) * step(0.14, fa) * step(fa, 0.86)
let rs0 = r0 + 3.0
let rs1 = mix(r0 + 6.0, r1 - 2.5, (fi + 1.0) / n)
let radial = smoothstep(rs0 - px, rs0 + px, rq) * (1.0 - smoothstep(rs1 - px, rs1 + px, rq))
let seg = inseg * radial
let on = step((fi + 0.5) / n, self.value + 0.001)
let segc = mix(vec3(0.54, 0.60, 0.50), vec3(0.07, 0.09, 0.08), on)
ring = mix(ring, segc, seg * mix(0.5, 1.0, on))
o = vec4(mix(o.xyz, ring, ring_m), max(o.w, ring_m))
// A dark frame lip round the LCD ring.
let lip = (1.0 - smoothstep(0.0, 1.2, abs(rq - r1 - 0.6))) * 0.8 + (1.0 - smoothstep(0.0, 1.0, abs(rq - r0))) * 0.5
o = vec4(mix(o.xyz, vec3(0.20, 0.22, 0.24), lip), max(o.w, lip))
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
}
// ---- level meter: an LCD bar graph with ghost bars and printed scale ----
mod.widgets.HwMeterFace.radius = 4
mod.widgets.HwMeterFace.depth = -2.0
mod.widgets.HwMeterFace.draw_bg.ground = #x3a3e44
mod.widgets.HwMeterFace.draw_bg.light_ink = vec4(0.85, 0.88, 0.9, 1.0)
mod.widgets.HwMeterFace.draw_bg.shadow_ink = vec4(0.02, 0.02, 0.03, 1.0)
mod.widgets.HwMeterFace.draw_bg.inner = vec4(0.8, 6.0, 0.0, 0.0)
mod.widgets.HwMeterFace.draw_bg.meter = vec4(0.0, 20.0, 1.0, 0.8)
mod.widgets.HwMeterFace.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwMeterFace.draw_bg.spill = vec2(0.6, 0.3)
mod.widgets.HwMeterFace.emissive = vec4(0.38, 0.94, 0.81, 0.6)
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))
// The glass, 4 pt in from the frame.
let a = vec2(4.0, 4.0)
let b = self.rect_size - a
let win = Material.sd_box(p, self.rect_size * 0.5, (b - a) * 0.5, 2.0)
let inside = 1.0 - smoothstep(-px, px, win)
let u = (p - a) / max(b - a, vec2(1.0, 1.0))
// EL backlight: bright teal in the middle, following the level.
let el = clamp(max(self.level.x, self.level.y) * 1.4, 0.0, 1.0)
var g = mix(vec3(0.60, 0.67, 0.56), vec3(0.46, 0.86, 0.76), el * 0.65)
g = g * (1.03 - 0.10 * u.y)
g = g * (1.0 - (1.0 - smoothstep(0.0, 4.0, -win)) * 0.22)
// Two bar rows: L on top, R below, from x = 18 pt.
let x0 = a.x + 16.0
let x1 = b.x - 5.0
let n = self.meter.y
let rowh = (b.y - a.y - 14.0) * 0.5
let y0 = a.y + 3.0
let lane = clamp(floor((p.y - y0) / max(rowh, 1.0)), 0.0, 1.0)
let fy = (p.y - y0 - lane * rowh) / max(rowh, 1.0)
let t = (p.x - x0) / max(x1 - x0, 1.0)
let seg = floor(t * n)
let fx = fract(t * n)
let cell = step(0.18, fx) * step(fx, 0.82) * step(0.14, fy) * step(fy, 0.86) * step(0.0, seg) * step(seg, n - 1.0) * step(y0, p.y) * step(p.y, y0 + rowh * 2.0)
let lv = mix(self.level.x, self.level.y, lane)
let on = step((seg + 0.5) / n, lv)
let pk = step(abs(seg - floor(self.level.z * n - 0.5)), 0.5) * step(0.02, self.level.z)
let lit = max(on, pk)
// The last quarter's segments are taller, printed with an OVER band.
let segc = mix(vec3(0.52, 0.59, 0.49), vec3(0.06, 0.08, 0.07), lit)
g = mix(g, segc, cell * mix(0.45, 1.0, lit))
// L and R: tiny 3x5 dot-matrix letters.
let gx = floor((p.x - (a.x + 5.0)) / 1.6)
let inx = step(0.0, gx) * step(gx, 2.0)
let gy_l = floor((p.y - (y0 + rowh * 0.5 - 4.0)) / 1.6)
let gy_r = floor((p.y - (y0 + rowh * 1.5 - 4.0)) / 1.6)
let l_on = inx * step(0.0, gy_l) * step(gy_l, 4.0) * max(step(gx, 0.0), step(4.0, gy_l))
let c0 = step(gx, 0.0)
let c1 = step(abs(gx - 1.0), 0.0)
let c2 = step(2.0, gx)
let even = step(abs(gy_r), 0.0) + step(abs(gy_r - 2.0), 0.0)
let r_on = inx * step(0.0, gy_r) * step(gy_r, 4.0) * clamp(c0 + c1 * even + c2 * (1.0 - even), 0.0, 1.0)
g = mix(g, vec3(0.08, 0.10, 0.09), clamp(l_on + r_on, 0.0, 1.0))
// The printed scale under the rows: a tick per 4 segments, OVER band.
let sy = y0 + rowh * 2.0 + 4.0
let tk = abs(fract(t * n / 4.0 + 0.5) - 0.5) * 4.0 / n * (x1 - x0)
let tick = (1.0 - smoothstep(0.3, 0.3 + px, tk)) * step(abs(p.y - sy), 2.0) * step(-0.01, t) * step(t, 1.01)
let over = step(0.75, t) * step(t, 1.0) * step(abs(p.y - sy), 1.0)
g = mix(g, vec3(0.10, 0.13, 0.11), tick * 0.8)
g = mix(g, vec3(0.12, 0.20, 0.44), over)
// The glass's glint.
g = g + vec3(1.0, 1.0, 1.0) * (1.0 - smoothstep(0.0, 0.25, u.y)) * 0.05
o = vec4(mix(o.xyz, g, inside), o.w)
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
}
// ---- small displays: progress strip and EQ, STN with EL edge ----
mod.widgets.HwDisplay.radius = 5
mod.widgets.HwDisplay.depth = -2.2
mod.widgets.HwDisplay.draw_bg.ground = #x9fae93
mod.widgets.HwDisplay.draw_bg.light_ink = vec4(0.95, 1.0, 0.95, 1.0)
mod.widgets.HwDisplay.draw_bg.shadow_ink = vec4(0.08, 0.10, 0.08, 1.0)
mod.widgets.HwDisplay.draw_bg.inner = vec4(0.8, 7.0, 0.0, 0.2)
mod.widgets.HwDisplay.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwDisplay.draw_bg.spill = vec2(1.2, 0.4)
mod.widgets.HwDisplay.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
let w = self.world.xy
var col = base * (1.04 - 0.09 * self.pos.y)
let g = fract(w / 2.5)
let dotm = step(0.2, g.x) * step(g.x, 0.85) * step(0.2, g.y) * step(g.y, 0.85)
col = col * (1.0 - dotm * 0.04)
return col
}
mod.widgets.HwDisplayText.draw_text.color = #x141b16
mod.widgets.HwDisplayText.draw_text.text_style = theme.font_code{font_size: 9.5}
mod.widgets.HwReadout.draw_text.color = #x0f1411
mod.widgets.HwReadout.draw_text.text_style = theme.font_code{font_size: 11.0}
// ---- the spectrum: an LCD bar graph, every segment's ghost showing ----
mod.widgets.HwSpectrum.light = 3.0
mod.widgets.HwSpectrum.light_low = vec4(0.30, 0.80, 0.70, 0.6)
mod.widgets.HwSpectrum.light_high = vec4(0.45, 1.0, 0.85, 1.4)
mod.widgets.HwSpectrum.wave_thickness = 1.4
mod.widgets.HwSpectrum.wave_fill = 0.0
mod.widgets.HwSpectrum.draw_round.pixel = fn() {
let p = self.pos * self.rect_size
let s = self.rect_size
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
let ink = vec3(0.035, 0.06, 0.06)
if self.part > 0.5 && self.part < 1.5 {
// The glass, EL backlit: blue-green, brightest in the middle where
// the panel sits over the lamp, falling off to the frame.
let sdf = Sdf2d.viewport(p)
sdf.box(0.0, 0.0, s.x, s.y, 4.0)
let w = self.rect_pos + p
let g = fract(w / 3.0)
let dotm = step(0.18, g.x) * step(g.x, 0.86) * step(0.18, g.y) * step(g.y, 0.86)
let v = (self.pos - vec2(0.5, 0.45)) * vec2(1.0, 1.6)
let lamp = 1.0 - clamp(dot(v, v), 0.0, 1.0)
var col = mix(vec3(0.33, 0.58, 0.53), vec3(0.58, 0.92, 0.80), lamp)
col = col * (1.0 - dotm * 0.045)
let e = min(min(p.x, p.y), min(s.x - p.x, s.y - p.y))
col = col * (1.0 - (1.0 - smoothstep(0.0, 14.0, e)) * 0.30)
sdf.fill(vec4(col, 1.0))
return sdf.result
}
if self.part > 1.5 && self.part < 2.5 {
// The baseline: a printed dotted rule.
let w = self.rect_pos.x + p.x
let dm = step(fract(w / 3.0), 0.5) * 0.6
return vec4(ink * dm, dm)
}
if self.part > 5.5 && self.part < 6.5 {
let w = self.rect_pos.x + p.x
let dm = step(fract(w / 6.0), 0.25) * 0.35
return vec4(ink * dm, dm)
}
if self.part > 6.5 {
return vec4(0.0, 0.0, 0.0, 0.0)
}
// Segments: 4 pt pitch, a 2.6 pt bar, a hair gap each side.
let pitch = 4.0
let fb = s.y - p.y
let fy = fract(fb / pitch)
let cx = abs(p.x - s.x * 0.5) - (s.x * 0.5 - 1.0)
let segm = step(0.14, fy) * step(fy, 0.78) * (1.0 - smoothstep(-px, px, cx))
if self.part > 2.5 && self.part < 3.5 {
// The unlit column: a printed amber filter over its top fifth,
// and every segment's ghost faintly there.
let t = fb / max(s.y, 1.0)
let hot = smoothstep(0.70, 0.72, t)
let fa = hot * 0.42 * (1.0 - smoothstep(-px, px, abs(p.x - s.x * 0.5) - s.x * 0.5 - 0.5))
let ga = segm * 0.24
let col = mix(vec3(0.95, 0.62, 0.20), ink, ga / max(ga + fa, 0.001))
let a = clamp(fa + ga, 0.0, 1.0)
return vec4(col * a, a)
}
if self.part > 4.5 && self.part < 5.5 {
// The held peak: one hollow segment.
let a = step(1.0, p.x) * step(p.x, s.x - 1.0) * 0.95
return vec4(ink * a, a)
}
// A lit segment, and its shadow on the reflector just below.
let fy2 = fract((fb + 1.2) / pitch)
let shm = step(0.14, fy2) * step(fy2, 0.78) * (1.0 - segm) * 0.22
let a = segm * 0.96 + shm
return vec4(ink * a, a)
}
mod.widgets.HwSpectrum.draw_line.pixel = fn() {
// The waveform on a 3 pt dot matrix: every pixel near the trace is on.
let p = self.pos * self.rect_size
let w = self.rect_pos + p
let cell = floor(w / 3.0)
let cc = (cell + vec2(0.5, 0.5)) * 3.0 - self.rect_pos
let a = self.seg_a
let b = self.seg_b
let pa = cc - a
let ba = b - a
let h = clamp(dot(pa, ba) / max(dot(ba, ba), 0.0001), 0.0, 1.0)
let d = length(pa - ba * h)
let on = step(d, 1.7)
let f = fract(w / 3.0)
let sq = step(0.12, f.x) * step(f.x, 0.88) * step(0.12, f.y) * step(f.y, 0.88)
let al = on * sq * 0.92
return vec4(vec3(0.035, 0.06, 0.06) * al, al)
}
mod.widgets.HwSpectrum.draw_label.text_style = theme.font_code{font_size: 7.5}
// ---- the picture: a colour LCD, lighting the body in EL teal ----
mod.widgets.HwMilk.light = 2.4
mod.widgets.HwMilk.light_knee = 0.95
// ---- the right wing's lower half: a car-stereo LCD, 7-segment digits ----
mod.widgets.HwOrnament.visible = true
mod.widgets.HwOrnamentFace.radius = 4
mod.widgets.HwOrnamentFace.depth = -2.0
mod.widgets.HwOrnamentFace.draw_bg.ground = #x3a3e44
mod.widgets.HwOrnamentFace.draw_bg.light_ink = vec4(0.85, 0.88, 0.9, 1.0)
mod.widgets.HwOrnamentFace.draw_bg.shadow_ink = vec4(0.02, 0.02, 0.03, 1.0)
mod.widgets.HwOrnamentFace.draw_bg.inner = vec4(0.8, 6.0, 0.0, 0.0)
mod.widgets.HwOrnamentFace.draw_bg.glow_ink = vec4(0.38, 0.94, 0.81, 1.0)
mod.widgets.HwOrnamentFace.emissive = vec4(0.38, 0.94, 0.81, 0.8)
mod.widgets.HwOrnamentFace.draw_bg.spill = vec2(0.6, 0.3)
// A 7-segment digit, 12 x 22 pt with a slant: x = the lit segments, y =
// every segment (the ghost). `code` bits: a b c d e f g.
mod.widgets.HwOrnamentFace.draw_bg.seg_h = fn(q: vec2, c: vec2) -> float {
let d = abs(q - c)
return max(d.x + d.y - 4.2, d.y - 1.2)
}
mod.widgets.HwOrnamentFace.draw_bg.seg_v = fn(q: vec2, c: vec2) -> float {
let d = abs(q - c)
return max(d.y + d.x - 4.4, d.x - 1.2)
}
mod.widgets.HwOrnamentFace.draw_bg.bit = fn(code: float, k: float) -> float {
return step(0.5, fract(floor(code / pow(2.0, k)) * 0.5))
}
mod.widgets.HwOrnamentFace.draw_bg.digit_code = fn(d: float) -> float {
var c = 63.0
c = mix(c, 6.0, step(0.5, d))
c = mix(c, 91.0, step(1.5, d))
c = mix(c, 79.0, step(2.5, d))
c = mix(c, 102.0, step(3.5, d))
c = mix(c, 109.0, step(4.5, d))
c = mix(c, 125.0, step(5.5, d))
c = mix(c, 7.0, step(6.5, d))
c = mix(c, 127.0, step(7.5, d))
c = mix(c, 111.0, step(8.5, d))
return c
}
mod.widgets.HwOrnamentFace.draw_bg.seg7 = fn(q0: vec2, code: float) -> vec2 {
let px = 0.6
let q = vec2(q0.x + (q0.y - 11.0) * 0.12, q0.y)
let da = self.seg_h(q, vec2(6.0, 1.3))
let db = self.seg_v(q, vec2(11.0, 6.1))
let dc = self.seg_v(q, vec2(11.0, 15.9))
let dd = self.seg_h(q, vec2(6.0, 20.7))
let de = self.seg_v(q, vec2(1.0, 15.9))
let df = self.seg_v(q, vec2(1.0, 6.1))
let dg = self.seg_h(q, vec2(6.0, 11.0))
let ma = 1.0 - smoothstep(-px, px, da)
let mb = 1.0 - smoothstep(-px, px, db)
let mc = 1.0 - smoothstep(-px, px, dc)
let md = 1.0 - smoothstep(-px, px, dd)
let m_e = 1.0 - smoothstep(-px, px, de)
let mf = 1.0 - smoothstep(-px, px, df)
let mg = 1.0 - smoothstep(-px, px, dg)
let m_all = max(max(max(ma, mb), max(mc, md)), max(max(m_e, mf), mg))
var on = ma * self.bit(code, 0.0)
on = max(on, mb * self.bit(code, 1.0))
on = max(on, mc * self.bit(code, 2.0))
on = max(on, md * self.bit(code, 3.0))
on = max(on, m_e * self.bit(code, 4.0))
on = max(on, mf * self.bit(code, 5.0))
on = max(on, mg * self.bit(code, 6.0))
return vec2(on, m_all)
}
// A 3 x 5 dot-matrix glyph: `code` = the rows top to bottom, 3 bits each
// (left bit first); `sz` = one dot's pitch.
mod.widgets.HwOrnamentFace.draw_bg.dm = fn(q: vec2, code: float, sz: float) -> float {
let c = floor(q / sz)
let f = fract(q / sz)
let inb = step(0.0, c.x) * step(c.x, 2.0) * step(0.0, c.y) * step(c.y, 4.0)
let k = (4.0 - c.y) * 3.0 + (2.0 - c.x)
let on = step(0.5, fract(floor(code / pow(2.0, k)) * 0.5))
return inb * on * step(0.1, f.x) * step(f.x, 0.9) * step(0.1, f.y) * step(f.y, 0.9)
}
mod.widgets.HwOrnamentFace.draw_bg.pixel = fn() {
let p = self.pos * self.rect_size
let s = 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(5.0, 5.0)
let b = s - a
let win = Material.sd_box(p, s * 0.5, (b - a) * 0.5, 3.0)
let inside = 1.0 - smoothstep(-px, px, win)
let u = (p - a) / max(b - a, vec2(1.0, 1.0))
let lv = clamp(self.level.w, 0.0, 1.0)
// EL backlit glass: teal, brighter with the music.
// The EL lamp is on while music plays; at rest the glass is reflective.
let lamp = clamp((self.level.x + self.level.y) * 8.0, 0.0, 1.0)
var g = mix(vec3(0.60, 0.67, 0.56), mix(vec3(0.56, 0.80, 0.72), vec3(0.50, 0.95, 0.82), lv), lamp)
g = g * (1.05 - 0.12 * u.y)
g = g * (1.0 - (1.0 - smoothstep(0.0, 6.0, -win)) * 0.25)
let ink = vec3(0.05, 0.08, 0.08)
let ghost = mix(vec3(0.50, 0.56, 0.47), vec3(0.40, 0.62, 0.56), lamp)
// Three big digits: the needle level as 0..99, then a unit.
let sc = clamp(min((b.x - a.x) / 70.0, (b.y - a.y) / 48.0), 0.8, 2.6)
let dw = 16.0 * sc
let o0 = vec2(s.x * 0.5 - dw * 1.5, a.y + 10.0)
let val = floor(lv * 99.0 + 0.5)
let d1 = floor(val / 10.0)
let d2 = val - d1 * 10.0
let g1 = self.seg7((p - o0 - vec2(dw, 0.0)) / sc, self.digit_code(d1))
let g2 = self.seg7((p - o0 - vec2(dw * 2.0, 0.0)) / sc, self.digit_code(d2))
// The first digit: only a minus sign, the "-dB".
let gm = self.seg7((p - o0) / sc, 64.0)
let ghost_m = max(max(gm.y, g1.y), g2.y)
let on_m = max(max(gm.x, g1.x), g2.x)
g = mix(g, ghost, ghost_m * 0.45)
// Each lit segment casts a faint shadow on the reflector behind.
let sh = self.seg7((p - o0 - vec2(dw, 0.0) - vec2(1.2, 1.2)) / sc, self.digit_code(d1)).x
let sh2 = self.seg7((p - o0 - vec2(dw * 2.0, 0.0) - vec2(1.2, 1.2)) / sc, self.digit_code(d2)).x
g = g * (1.0 - max(sh, sh2) * 0.12)
g = mix(g, ink, on_m)
// A segmented bar row under the digits: left and right.
let by = o0.y + 22.0 * sc + 8.0
let n = 24.0
let t = (p.x - (a.x + 8.0)) / max(b.x - a.x - 16.0, 1.0)
let seg = floor(t * n)
let fx = fract(t * n)
let inb = step(0.0, t) * step(t, 1.0) * step(0.2, fx) * step(fx, 0.8)
let rowl = step(by, p.y) * step(p.y, by + 4.0)
let rowr = step(by + 6.0, p.y) * step(p.y, by + 10.0)
let onl = step((seg + 0.5) / n, self.level.x)
let onr = step((seg + 0.5) / n, self.level.y)
g = mix(g, ghost, inb * (rowl + rowr) * 0.45)
g = mix(g, ink, inb * (rowl * onl + rowr * onr))
// "dB" in the dot matrix beside the digits.
let ds = 1.3 * sc
let dbx = o0 + vec2(dw * 3.0 + 3.0, 22.0 * sc - 5.0 * ds)
let dbm = max(self.dm(p - dbx, 5103.0, ds), self.dm(p - dbx - vec2(ds * 4.0, 0.0), 27566.0, ds))
let dbg = max(self.dm(p - dbx, 32767.0, ds), self.dm(p - dbx - vec2(ds * 4.0, 0.0), 32767.0, ds))
g = mix(g, ghost, dbg * 0.30)
g = mix(g, ink, dbm)
// Annunciators along the top: a disc that shows while music plays,
// ST for stereo, and a three-bar battery.
let ty = a.y + 7.0
let playing = step(0.001, self.level.x + self.level.y)
let cdc = vec2(a.x + 12.0, ty)
let cr = length(p - cdc)
let disc = (1.0 - smoothstep(4.0 - px, 4.0 + px, cr)) * smoothstep(1.2 - px, 1.2 + px, cr)
g = mix(g, ghost, disc * 0.45)
g = mix(g, ink, disc * playing)
let stx = vec2(a.x + 21.0, ty - 3.5)
let stm = max(self.dm(p - stx, 31183.0, 1.4), self.dm(p - stx - vec2(5.6, 0.0), 29842.0, 1.4))
g = mix(g, ghost, max(self.dm(p - stx, 32767.0, 1.4), self.dm(p - stx - vec2(5.6, 0.0), 32767.0, 1.4)) * 0.3)
g = mix(g, ink, stm * playing)
let bc = vec2(b.x - 16.0, ty)
let bq = abs(p - bc)
let shell = step(max(bq.x - 8.0, bq.y - 3.6), 0.0) * (1.0 - step(max(bq.x - 7.0, bq.y - 2.6), 0.0))
let nub = step(abs(p.x - (bc.x + 9.0)), 1.0) * step(abs(p.y - bc.y), 1.6)
let cellx = fract((p.x - (bc.x - 6.2)) / 4.3)
let cells = step(abs(p.x - bc.x), 6.2) * step(bq.y, 1.8) * step(cellx, 0.75)
g = mix(g, ink, clamp(shell + nub + cells, 0.0, 1.0))
g = g + vec3(1.0, 1.0, 1.0) * (1.0 - smoothstep(0.0, 0.2, u.y)) * 0.05
o = vec4(mix(o.xyz, g, inside), o.w)
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
}
// ---- printed type on the silver ----
mod.widgets.HwCaption.draw_text.color = #x2c3a5c
mod.widgets.HwCaption.draw_text.text_style = theme.font_bold{font_size: 7.5}
mod.widgets.HwTitle.draw_text.color = #x1a1d21
mod.widgets.HwTitle.draw_text.text_style = theme.font_bold{font_size: 13.0}
mod.widgets.HwText.draw_text.color = #x3a3e44
mod.widgets.HwPanelTitle.draw_text.color = #x141b16
mod.widgets.HwPanelText.draw_text.color = #x3f4d3b
mod.widgets.HwNavButton.draw_text.color = #x141b16
mod.widgets.HwNavButton.draw_text.color_hover = #x1d3470
mod.widgets.HwNavButton.draw_text.text_style = theme.font_code{font_size: 9.5}
mod.widgets.HwNavButton.draw_bg.plate = vec4(0.05, 0.08, 0.06, 0.06)
mod.widgets.HwNavButton.draw_bg.plate_hover = vec4(0.05, 0.08, 0.06, 0.14)
mod.widgets.HwNavButton.draw_bg.rim = vec4(0.05, 0.08, 0.06, 0.18)
// ---- switches and choosers: grey rubber slides, LCD wells ----
mod.widgets.HwSegmented.draw_bg.well = vec4(0.30, 0.32, 0.35, 1.0)
mod.widgets.HwSegmented.draw_bg.rim = vec4(0.0, 0.0, 0.0, 0.25)
mod.widgets.HwSegmented.draw_pill.cap = vec4(0.80, 0.82, 0.85, 0.85)
mod.widgets.HwSegmented.draw_pill.glow = vec4(0.16, 0.30, 0.62, 1.0)
mod.widgets.HwSegmented.draw_text.color = #xc8ccd0
mod.widgets.HwSegmented.draw_text_selected.color = #x141618
mod.widgets.HwDropDown.draw_bg.well = vec4(1.20, 1.32, 1.12, 1.0)
mod.widgets.HwDropDown.draw_bg.rim = vec4(0.1, 0.12, 0.14, 0.5)
mod.widgets.HwDropDown.draw_bg.arrow = vec4(0.08, 0.10, 0.09, 1.0)
mod.widgets.HwDropDown.draw_text.color = #x141b16
mod.widgets.HwDropDown.draw_text.color_hover = #x1d3470
mod.widgets.HwDropDown.draw_text.color_focus = #x1d3470
mod.widgets.HwDropDown.draw_text.color_down = #x1d3470
mod.widgets.HwTextInput.draw_bg.well = vec4(1.20, 1.32, 1.12, 1.0)
mod.widgets.HwTextInput.draw_bg.rim = vec4(0.1, 0.12, 0.14, 0.5)
mod.widgets.HwTextInput.draw_text.color = #x141b16
mod.widgets.HwTextInput.draw_text.color_hover = #x141b16
mod.widgets.HwTextInput.draw_text.color_focus = #x0a0e0b
mod.widgets.HwTextInput.draw_text.color_empty = #x55654f
mod.widgets.HwTextInput.draw_text.color_empty_hover = #x45553f
mod.widgets.HwTextInput.draw_text.color_empty_focus = #x45553f
mod.widgets.HwBrowserCheck.draw_text.color = #x141b16
mod.widgets.HwMenuLayer.draw_bg.color = #x9dac92
mod.widgets.HwMenuLayer.draw_bg.border_color = #x2a2d31
mod.widgets.HwSplitter.draw_bg.groove = vec4(0.0, 0.0, 0.0, 0.25)
mod.widgets.HwSplitter.draw_bg.glint = vec4(1.0, 1.0, 1.0, 0.5)
mod.widgets.HwArtBlank.draw_bg.vinyl = vec4(0.72, 0.74, 0.76, 1.0)
mod.widgets.HwArtBlank.draw_bg.label_ink = vec4(0.16, 0.30, 0.62, 1.0)
true
// ---- EQ (HwEqGraph: the graphic equalizer's era look, STYLE_GUIDE "Graphic EQ") ----
mod.widgets.HwEqGraph.draw_fader.fader = vec4(2.0, 0.54, 14.0, 4.0)
mod.widgets.HwEqGraph.draw_fader.cap_ink = vec4(0.30, 0.33, 0.31, 1.0)
mod.widgets.HwEqGraph.draw_fader.track_ink = vec4(0.20, 0.25, 0.21, 1.0)
mod.widgets.HwEqGraph.draw_fader.glow_ink = vec4(0.72, 0.82, 0.66, 1.0)
mod.widgets.HwEqGraph.draw_curve.curve = vec4(2.0, 1.0, 3.5, 0.10)
mod.widgets.HwEqGraph.draw_curve.curve_ink = vec4(0.72, 0.82, 0.66, 1.0)
mod.widgets.HwEqGraph.draw_grid.grid = vec4(1.0, 0.25, 0.35, 0.0)
mod.widgets.HwEqGraph.draw_grid.grid_ink = vec4(0.72, 0.82, 0.66, 1.0)
mod.widgets.HwEqGraph.draw_spectrum.spectrum = vec4(0.30, 2.0, 0.0, 0.0)
mod.widgets.HwEqGraph.draw_spectrum.spec_ink = vec4(0.62, 0.72, 0.58, 1.0)
mod.widgets.HwEqGraph.label_ink = vec4(0.72, 0.82, 0.66, 0.9)
mod.widgets.HwEqGraph.scale_ink = vec4(0.72, 0.82, 0.66, 0.9)
true
// ---- the meter's bar form: two LCD segment rows over their ghosts ----
mod.widgets.HwMeterBarFace.draw_bg.ground = #x9dac92
mod.widgets.HwMeterBarFace.draw_bg.pixel = fn() {
let p = self.pos * self.rect_size
var o = self.layer(self.surface(p, self.ground.xyz))
let pad = vec2(5.0, 3.0)
let w = max(self.rect_size.x - pad.x * 2.0, 1.0)
let h = max(self.rect_size.y - pad.y * 2.0, 1.0)
let u = (p.x - pad.x) / w
let v = (p.y - pad.y) / h
let n = max(floor(w / 5.0), 8.0)
let seg = floor(u * n)
let fx = fract(u * n)
let lane = step(0.5, v)
let fy = fract(v * 2.0)
let cell = step(0.18, fx) * step(fx, 0.82) * step(0.18, fy) * step(fy, 0.82) * step(0.0, u) * step(u, 1.0) * step(0.0, v) * step(v, 1.0)
let lv = mix(self.level.x, self.level.y, lane)
let on = step((seg + 0.5) / n, lv)
let segc = mix(vec3(0.52, 0.59, 0.49), vec3(0.06, 0.08, 0.07), on)
o = vec4(mix(o.xyz, segc, cell * mix(0.35, 1.0, on)), o.w)
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
}
true