The trio the author decided on 2026-09-20 is now all built: def is CL's defparameter — its initialiser runs on every daemon re-run, unguarded, so an edited initialiser repaints the same storage on C-c C-c plus re-run — defonce (Clojure's name for CL's defvar, per the author) initialises once behind the .init~once. flag, and defconst stays the image. One parse arm reads both forms; the difference is Ast.reinit, carried to Tast.global's grerun. Emit.startup_plan gives a def no guard flag, and Check.check_global lifts every def initialiser — zero and literal included — into global/<n>, so the host's startup reaches it through the function cell and a re-evaluated def swaps it (Session's def_inits; Emit.redefinition declares the cell for a non-sibling target). The old defvar spelling is refused with the rename and both compiling spellings, and every program, test, doc and editor list is swept — except sand.flan, the author's live WIP, whose seven defvar lines are flagged in FIX.org and keep its three dependent tests red on this branch.
71 lines
3.0 KiB
Plaintext
71 lines
3.0 KiB
Plaintext
;;;; raylib [core] example - scissor test
|
|
;;;;
|
|
;;;; examples/core/core_scissor_test.c. Needed begin-scissor-mode and
|
|
;;;; end-scissor-mode, now hand-written in vendor/raylib/raylib.flan: they are
|
|
;;;; a begin/end pair inside a frame, which is the class docs/PORTING.md §1 says
|
|
;;;; belongs in the hand-written half and not in the importer's. get-mouse-x
|
|
;;;; and get-mouse-y come from the generated half — their Flan face is the C
|
|
;;;; one, two plain i32s, and there is nothing for a hand-written line to say
|
|
;;;; about them that the header does not already say.
|
|
;;;;
|
|
;;;; The scissor rectangle is a Rectangle of floats in the C and stays one
|
|
;;;; here, even though every use of it casts back to i32, because the one call
|
|
;;;; that takes it whole — draw-rectangle-lines-ex — wants a Rectangle. That
|
|
;;;; is also why the mouse is read through get-mouse-x/get-mouse-y rather than
|
|
;;;; get-mouse-position: the C does the arithmetic in floats from integer
|
|
;;;; readings, and doing it the other way round would round differently on the
|
|
;;;; odd pixel.
|
|
;;;;
|
|
;;;; What this example is really a test of, and what no headless case could
|
|
;;;; be: raylib's scissor rectangle is in screen pixels with y growing DOWN,
|
|
;;;; and the GL call underneath measures from the bottom. raylib flips it. If
|
|
;;;; the binding or the flip were wrong the clip would appear mirrored about
|
|
;;;; the middle of the window — a perfectly plausible picture, in the wrong
|
|
;;;; place — so the only check is the outline drawn around it afterwards
|
|
;;;; landing on the revealed patch.
|
|
|
|
(import rl "vendor:raylib")
|
|
|
|
(defconst screen-width 800)
|
|
(defconst screen-height 450)
|
|
|
|
(defonce scissor rl/Rectangle)
|
|
(defonce scissor-mode bool)
|
|
|
|
(defn main [] ()
|
|
(rl/init-window screen-width screen-height
|
|
"raylib [core] example - scissor test")
|
|
(defer (rl/close-window))
|
|
|
|
(set scissor (rl/Rectangle {.x 0.0 .y 0.0 .width 300.0 .height 300.0}))
|
|
(set scissor-mode true)
|
|
|
|
(rl/set-target-fps 60)
|
|
|
|
(until (rl/window-should-close?)
|
|
;; Update
|
|
(when (rl/key-pressed? :key-s) (set scissor-mode (not scissor-mode)))
|
|
|
|
;; Centre the scissor area on the mouse.
|
|
(set (.x scissor) (- (f32 (rl/get-mouse-x)) (/ (.width scissor) 2.0)))
|
|
(set (.y scissor) (- (f32 (rl/get-mouse-y)) (/ (.height scissor) 2.0)))
|
|
|
|
;; Draw
|
|
(rl/with-drawing
|
|
(rl/clear-background rl/raywhite)
|
|
|
|
(when scissor-mode
|
|
(rl/begin-scissor-mode (i32 (.x scissor)) (i32 (.y scissor))
|
|
(i32 (.width scissor)) (i32 (.height scissor))))
|
|
|
|
;; A full-screen rectangle and a line of text. Only the part inside the
|
|
;; scissor rectangle reaches the framebuffer, which is the whole example.
|
|
(rl/draw-rectangle 0 0 (rl/get-screen-width) (rl/get-screen-height) rl/red)
|
|
(rl/draw-text "Move the mouse around to reveal this text!" 190 200 20
|
|
rl/lightgray)
|
|
|
|
(when scissor-mode (rl/end-scissor-mode))
|
|
|
|
(rl/draw-rectangle-lines-ex scissor 1.0 rl/black)
|
|
(rl/draw-text "Press S to toggle scissor test" 10 10 20 rl/black))))
|