;;; bad-grid --- sdl2 renderer -*- lexical-binding: t -*- ;;; Commentary: ;;; Code: (require 'cl-lib) (cl-pushnew "." load-path :test #'string=) (require 'luki-lisp) (-> 'bad-ecs) ;; +----------------+ ;; | dynamic module | ;; +----------------+ (let ((dm (@f "bad-sdl%s" module-file-suffix))) (load dm nil t) (declare-function sdl_draw_init dm) (declare-function sdl_draw_quit dm) (declare-function sdl_draw_frame dm) (declare-function sdl_draw_grid_init dm) (declare-function sdl_draw_grid_toggle dm)) ;; +------+ ;; | grid | ;; +------+ (defvar ecs-grid nil) (defvar ecs-grid-h nil) (defvar ecs-grid-w nil) (defun ecs-grid-init () (setf ecs-grid-w 109) (setf ecs-grid-h 31) (setf ecs-grid (make-vector ecs-grid-h nil)) (cl-loop for i from 0 to ecs-grid-h for line-str = (format "line %04d " i) for len = (- ecs-grid-w (--- line-str)) for fin = " 0101" for len-fin = (--- fin) for str = (concat line-str (make-string (- len len-fin 1) ?-) fin) for row across-ref ecs-grid do (setf row str))) (cl-defmethod ecs-grid-set ((row integer) (col integer) (val integer)) (aset (aref ecs-grid row) col val)) (defun bad-grid-string () (mapconcat #'concat ecs-grid "\n")) (cl-defmethod ecs-grid-clear (&optional (chr 32)) (cl-loop for row being the elements of ecs-grid using (index i) do (cl-loop for _ being the elements of-ref row using (index j) do (aset (aref ecs-grid i) j chr)))) (defun bad-fps () (sdl_draw_init) (ecs-grid-init) (sdl_draw_grid_toggle) (cl-loop with hz = (bad-hz) with fps = 60 with delta = (// hz fps) with frames = 8092 with slp = 0 with ahead = 0 with done = 0 with beg = (bad-ticks) with stops = (number-sequence (+ beg delta) (+ beg (* frames delta)) delta) with prestr = (make-string 20 32) for ft from 0 for draw = (z (m ft 4)) for next in stops for ver-msg = (@f "%sGNU Emacs %s | debian %s | SDL 3.3.7 | OpenGL 4.6" prestr emacs-version system-type) for set-to-msg = (@f "%sfps (set to) %d" prestr fps) for frames-msg = (@f "%sframe %d of %d (%d%%)" prestr done frames (* 100 (// done frames))) for actual-fps-msg = (@f "%sfps (actual) %.1f" prestr (// (* done hz) (- (bad-ticks) beg))) for ahead-msg = (@f "%stotal sleep: %.1f s -> %.5f s/frame" prestr ahead (// ahead done)) do (when draw (mapc (L (i) (aset ecs-grid i " ")) '(15 17 18 19))) (mapc (L (i) (aset ecs-grid i " ")) '(20 16 14 13 12)) (aset ecs-grid 13 ver-msg) (when draw (aset ecs-grid 15 frames-msg) (aset ecs-grid 17 set-to-msg) (aset ecs-grid 18 actual-fps-msg) (aset ecs-grid 19 ahead-msg)) (sdl_draw_frame) (++ done) (setf slp (// (- next (bad-ticks)) hz)) (++ ahead slp) (sleep-for slp) finally (sdl_draw_quit))) (<- 'bad-grid) ;;; bad-grid.el ends here