diff --git a/drawing.lisp b/drawing.lisp index 4a151db..d52a692 100644 --- a/drawing.lisp +++ b/drawing.lisp @@ -86,3 +86,39 @@ (sdl2:destroy-renderer renderer) (sdl2:destroy-window window) (sdl2:quit))) + +(define-transform project-to-screen (screen-height) + :x-transform (round x) + :y-transform (round (- screen-height y))) + +(defmethod display-frame ((ctx graphics-context) drawing) + (with-slots (renderer width height) ctx + (sdl2:set-render-draw-color renderer 255 255 255 255) + (sdl2:render-clear renderer) + (sdl2:set-render-draw-color renderer 0 0 0 255) + (draw renderer + (project-to-screen height + (translate (/ width 2) (/ height 2) drawing))) + (sdl2:render-present renderer))) + +(defun draw (renderer drawing) + (defun draw-line (line) + (let ((points (line-points line))) + (sdl2:render-draw-line renderer + (aref points 0) (aref points 1) + (aref points 2) (aref points 3)))) + (defun draw-polygon (polygon) + (let* ((points (polygon-points polygon)) + (point-count (/ (length points) 2))) + (dotimes (i point-count) + (let* ((start (* i 2)) + (end (if (= i (1- point-count)) 0 (+ start 2)))) + (sdl2:render-draw-line renderer + (aref points start) + (aref points (1+ start)) + (aref points end) + (aref points (1+ end))))))) + (dolist (primitive drawing) + (typecase primitive + (line (draw-line primitive)) + (polygon (draw-polygon primitive)))))