luv

Workshop wiki

analytic.lisp

hal/shader/analytic.lisp

system luv · 5 definitions · on GitHub

Small analytic GUI primitives evaluated directly in the fragment shader.

in-package#:luv.analytic
defconstant+analytic-coverage-epsilon+
/1.065536.0

Negative values are inside. RADIUS is clamped to the shape's shorter half-extent, so rectangles, roundrects, capsules, and circles share one definition.

arith-lisp:define-lisp-arithmetic-functionroundrect-signed-distance
x
y
half-width
half-height
radius
let*
safe-radius
min
maxradius0.0
minhalf-widthhalf-height
qx
-
-half-widthsafe-radius
qy
-
-half-heightsafe-radius
outside-x
maxqx0.0
outside-y
maxqy0.0
outside
sqrt
+
*outside-xoutside-x
*outside-youtside-y
inside
min
maxqxqy
0.0
-
+outsideinside
safe-radius
shader:define-shader-functionroundrect-coverage
coordinatehalf-size-radius
"Evaluate an analytic roundrect and turn its screen gradient into coverage."
let*
distance
roundrect-signed-distance
shader:swizzlecoordinate:x
shader:swizzlecoordinate:y
shader:swizzlehalf-size-radius:x
shader:swizzlehalf-size-radius:y
shader:swizzlehalf-size-radius:z
pixel-span
max
sqrt
+
*distance-dxdistance-dx
*distance-dydistance-dy
+analytic-coverage-epsilon+
shader:clamp
-0.5
/distancepixel-span
0.01.0
shader:define-shaderroundrect-vertex-specification
:stage:vertex:inputs
position:vec3:location0
local-coordinate:vec3:location1
half-size-radius:vec3:location2
color:vec3:location3
:outputs
clip-position:vec4:built-in:position
render-coordinate:vec2:location0
render-half-size-radius:vec3:location1
render-color:vec4:location2
let*
shader:set-outputclip-position
shader:set-outputrender-coordinate
shader:swizzlelocal-coordinate:xy
shader:set-outputrender-half-size-radiushalf-size-radius
shader:set-outputrender-color
shader:vec4
*coloralpha
alpha
shader:define-shaderroundrect-fragment-specification
:stage:fragment:inputs
render-coordinate:vec2:location0
half-size-radius:vec3:location1
color:vec4:location2
:outputs
color-output:vec4:location0
let*
coverage
roundrect-coveragerender-coordinatehalf-size-radius
shader:set-outputcolor-output
*colorcoverage