Перевожу один свой проект на SDL2, раньше использовал SDL. Была такая логика - главное окно делилось на несколько зон, в каждой из которых рисовался свой surface. Приведу код:
(loop with plot-n = 3 with plot-h = (round (/ height plot-n))
for i from 0 below plot-n
for name in (list
"Температура охлаждающей жидкости (°С)"
"Положение дроссельной заслонки (%)"
"Скорость вращения двигателя на холостом ходу (об/мин)")
for s = (sdl:create-surface width plot-h)
do (progn
(sdl:fill-surface sdl:*white* :surface s)
(draw-plot name s)
(sdl:draw-surface-at s
(point :x 0 :y (* i (/ height plot-n)))
:surface sdl:*default-surface*))))
В SDL2 всё по-другому и у меня не получается увязать вместе render и surface, да и, скорее всего, неправильный подход я пытаюсь использовать. Пробовал по-разному, к примеру так -
(let* ((s (sdl2:create-rgb-surface 100 100 1))
(r (sdl2:create-software-renderer s)))
(sdl2:set-render-draw-color r 0 0 255 255)
(sdl2:render-draw-line r 0 0 100 100)
(sdl2:render-copy render (sdl2:create-texture-from-surface r s)
:source-rect (make-rect 0 0 100 100)
:dest-rect (make-rect 10 10 110 110)))
Доки почитал, но что-то не разобрался. Спасибо.
РЕШЕНИЕ:
(defun start-plot ()
(sdl2:make-this-thread-main
(lambda ()
(sdl2:with-init (:everything)
(sdl2:with-window (win :title "prostolog" :w *width* :h *height*)
(sdl2:with-renderer (render win)
(sdl2:with-gl-context (gl-context win)
(init-scene)
(sdl2:with-event-loop (:method :poll)
(:keyup
(:keysym keysym)
(when
(sdl2:scancode= (sdl2:scancode-value keysym) :scancode-escape)
(sdl2:push-event :quit)))
(:idle
()
(let ((foreground-textures '()))
(dotimes (i 30)
;; texture
(let ((texture
(sdl2:create-texture render 373694468 :target 100 50)))
;; clear texture background
(sdl2:set-render-target render texture)
(sdl2:set-render-draw-color render 200 200 200 255)
(sdl2:render-clear render)
;; drawing at texture
(sdl2:set-render-draw-color render 0 0 0 255)
(sdl2:render-draw-line render 0 0 100 50)
(sdl2:render-draw-line render 100 0 0 50)
;; return render
(sdl2:set-render-target render nil)
(push texture foreground-textures))
;; anouther texture
(let ((texture
(sdl2:create-texture render 373694468 :target 200 30)))
;; clear texture background
(sdl2:set-render-target render texture)
(sdl2:set-render-draw-color render 100 100 100 255)
(sdl2:render-clear render)
;; drawing at texture
(sdl2:set-render-draw-color render 255 0 0 255)
(sdl2:render-draw-line render 0 0 200 30)
(sdl2:render-draw-line render 0 30 200 0)
;; return render
(sdl2:set-render-target render nil)
(push texture foreground-textures)))
;; draw window background graphics
(sdl2:set-render-draw-color render 255 255 255 255)
(sdl2:render-clear render)
(sdl2:set-render-draw-color render 255 0 0 255)
(sdl2:render-draw-line render 0 0 *width* *height*)
(sdl2:set-render-draw-color render 0 0 255 50)
(sdl2:render-draw-line render *width* 0 0 *height*)
;; draw textures at window surface
(loop for ft in foreground-textures
for w = (texture-width ft) for h = (texture-height ft)
with offset = 0
while (< (+ offset h) *height*)
do
(progn
(sdl2:render-copy
render ft
:dest-rect (sdl2:make-rect
(- (/ *width* 2) (/ w 2))
offset w h))
(incf offset h))))
;; present all stuff at window surface
(sdl2:render-present render))
(:quit () t)))))))))