luv

Workshop wiki

luvcraft-metabar.lisp

mcclim/luvcraft-metabar.lisp

system luvcraft/mcclim · 29 definitions · on GitHub

Luvcraft adapter for the shared retained-GPU metabar instrument.

in-package#:mcluv

--------------------------------------------------------------------- Luvcraft's existing knob and action vocabulary.

defmethodmetabar-controls-for
declare
ignoresession
defmethodmetabar-control-label
declare
ignoresession
luvcraft:knob-labelknob
defmethodmetabar-control-update-policy
declare
ignoresession

A shader source literal should rebuild once at release, not once per pointer-motion frame. Plain live values remain continuous.

if:commit-on-release:continuous
defmethodperform-metabar-control-set-fraction
let*
minimum
luvcraft:knob-minimumknob
maximum
luvcraft:knob-maximumknob
step
luvcraft:knob-stepknob
raw
+minimum
*fraction
-maximumminimum
quantized
*step
roundrawstep
defmethodmetabar-action-label
declare
ignoresession
luvcraft:action-labelaction

--------------------------------------------------------------------- Luvcraft overlay lifecycle.

defclassluvcraft-metabar-overlay
slide:initform0d0:accessormetabar-slide:documentation"0 off the left edge, 1 fully open; eased."
open-p:initformt:accessormetabar-open-p
last-time:initformnil:accessormetabar-last-time
defmethodluvcraft:luvcraft-overlay-stage
declare
ignoreoverlay
:hud
defunluvcraft-metabar-frame
overlay
widget-overlay-frameoverlay
defunluvcraft-metabar-viewport-extent
session
let
canvas
luvcraft:luvcraft-session-canvassession
list
luv:canvas-widthcanvas
luv:canvas-heightcanvas
luv:zdefmethod
sessionpasssurface-texture
declare
ignorepass
when
plusp
metabar-slideoverlay
overlay
luv:zdefmethod

Application operations and value observation occur at the session's frame boundary, never in input dispatch or McCLIM repaint.

let

Author and publish the retained semantic revision before a game render pass opens. Overlay encoding below only replays its prepared commands.

let*
now
or
luvcraft::luvcraft-session-last-frame-timesession
0d0
last
metabar-last-timeoverlay
seconds
iflast
min0.1d0
max0d0
-nowlast
0d0
target
if
metabar-open-poverlay
1d00d0
slide
metabar-slideoverlay
step
*6d0seconds
setf
metabar-last-timeoverlay
now
metabar-slideoverlay
cond
>targetslide
mintarget
+slidestep
<targetslide
maxtarget
-slidestep
tslide
when
and
not
metabar-open-poverlay
zerop
metabar-slideoverlay
overlay
defunclose-luvcraft-metabar
overlay

Slide overlay away and restore world focus immediately.

check-typeoverlayluvcraft-metabar-overlay
let
session
widget-overlay-sessionoverlay
setf
metabar-open-poverlay
nil
when
eqoverlay
luvcraft:luvcraft-session-modal-focussession
nil
defmethodluvcraft:handle-luvcraft-overlay-event
declare
ignorecanvas
let*
uv
luvcraft-widget-texture-coordinateoverlay
luv:canvas-pointer-event-xevent
luv:canvas-pointer-event-yevent

A release clears a commit-style drag even if it landed outside.

cond
uv
when
and
eq:left
luv:canvas-pointer-event-buttonevent
t
and
eqoverlay
luvcraft:luvcraft-session-modal-focussession

Let the same click reach the world after dismissing the drawer.

nil
tnil
defunfind-luvcraft-metabar
session
find-if
lambda
overlay
luvcraft:luvcraft-session-overlayssession
defunopen-luvcraft-metabar
session&key
title"luvcraft metabar"

Create, attach, slide in, and focus session's shared metabar.

let
overlaynil
transferred-pnil
completed-pnil
unwind-protect
progn
setfframe
make-embedded-metabarsession
luvcraft:luvcraft-session-canvassession
luvcraft:luvcraft-session-contextsession
luvcraft:luvcraft-session-devicesession
:titletitle
let
setfoverlay
make-instance'luvcraft-metabar-overlay:sessionsession:frameframe:mirrormirror
mirror-compositormirror
overlay
setftransferred-pt
setfcompleted-pt
overlay
unlesscompleted-p
cond
andoverlay
memberoverlay
luvcraft:luvcraft-session-overlayssession
:test#'eq
ignore-errors
andoverlay
nottransferred-p
andframe
nottransferred-p
defmethodluvcraft:toggle-luvcraft-metabar
alexandria:if-let
overlay
if
metabar-open-poverlay
t