;;;; 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) (defvar scissor rl/Rectangle) (defvar 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? :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))))