OSDN Git Service

graphics: sdl2:rects freed after use
authorGiulio De Stasio <giuliodestasio98@gmail.com>
Tue, 17 Jan 2023 12:57:21 +0000 (13:57 +0100)
committerGiulio De Stasio <giuliodestasio98@gmail.com>
Tue, 17 Jan 2023 12:57:21 +0000 (13:57 +0100)
graphics/render.lisp
graphics/text-rendering.lisp
graphics/view.lisp
layers/screens.lisp

index dcd34f4..503a99b 100644 (file)
@@ -68,6 +68,7 @@ to render locally use sdl2:set-render-target before calling this macro."
            :do (when (displayp entity)
                  (sdl2:render-copy ,renderer (texture entity)
                                    :source-rect (screen-source entity)
-                                   :dest-rect (screen-destination entity ,plane))))))
+                                   :dest-rect (screen-destination entity ,plane))
+                 ))))
 
 ;; NOTE: test if it is necessary to create render-plane-without-contents
index 399175e..6d03125 100644 (file)
   `(let ((value-indexes (tr-parse-string ,value)))
      (loop :for character :in value-indexes
            :for character-position :from 0 :to (length value-indexes)
-           :do (sdl2:render-copy ,renderer *tr-texture*
-                                 :source-rect (sdl2:make-rect (* character 60) 0 60 130)
-                                 :dest-rect (sdl2:make-rect (+ ,x (* character-position ,width)) ,y ,width ,height)))))
+           :do (let ((source-rectangle (sdl2:make-rect (* character 60) 0 60 130))
+                     (destination-rectangle (sdl2:make-rect (+ ,x (* character-position ,width)) ,y ,width ,height)))
+                 (sdl2:render-copy ,renderer *tr-texture*
+                                   :source-rect source-rectangle
+                                   :dest-rect destination-rectangle)
+                 (sdl2:free-rect source-rectangle)
+                 (sdl2:free-rect destination-rectangle)))))
index 4303e4a..49650be 100644 (file)
@@ -46,7 +46,7 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo
   (sdl2:with-init (:video)
     (with-playground (window *renderer* :title title)
       (setf *tr-texture* (let* ((font (sdl2-ttf:open-font "media/IBMPlex.ttf" 100)) ;; FIXME: this crashes the program under windows, throws error on linux but works anyway
-                                (font-surface (sdl2-ttf:render-text-solid font *tr-string* 0 0 0 0))
+                                (font-surface (sdl2-ttf:render-utf8-solid font *tr-string* 0 0 0 0))
                                 (font-texture (sdl2:create-texture-from-surface *renderer* font-surface)))
                            (sdl2:free-surface font-surface)
                            font-texture))
@@ -58,8 +58,7 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo
                                                     2 (width +plane+) (height +plane+))))
         (sdl2:with-event-loop (:method :poll)
           (:quit () t)
-          (:keydown (:keysym keysym)
-                    (declare (ignore keysym))
+          (:keydown ()
                     ;; FIXME: incorporate into input.lisp. check for input every now and then outside keydown
                     (when (sdl2:keyboard-state-p :scancode-up) (setf (cdr *viewpoint-offset*) (+ (cdr *viewpoint-offset*) 10)))
                     (when (sdl2:keyboard-state-p :scancode-down) (setf (cdr *viewpoint-offset*) (+ (cdr *viewpoint-offset*) -10)))
@@ -68,7 +67,7 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo
                     (when (sdl2:keyboard-state-p :scancode-p) (setf *viewpoint-zoom* (+ *viewpoint-zoom* 0.2))) ; FIXME: find the scancode for the plus sign
                     (when (sdl2:keyboard-state-p :scancode-m) (setf *viewpoint-zoom* (+ *viewpoint-zoom* -0.2)))
                     )
-          (:mousebuttondown (:x x :y y :state state)
+          (:mousebuttondown ()
                             (setf *is-mouse-hold* t)
                             )
           (:mousebuttonup ()
@@ -99,7 +98,6 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo
                  (multiple-value-bind (x y) (sdl2:mouse-state)
                    (setf *mouse-position* (cons x y)))
                  ;; mouse-holding-event
-                 ;; FIXME: absolutely horrible. to be moved inside input.lisp for better functionalities
                  (when *is-mouse-hold*
                    (loop :for action :in (mouse-actions *mouse-keybinds*)
                          :do (when action (eval (car action))) ; FIXME: replace eval with a more safer DSL eval
@@ -113,37 +111,36 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo
                  (sdl2:render-clear *renderer*)
 
                  ;; local viewpoint
+                 ;; NOTE: generalize
                  (sdl2:set-render-target *renderer* viewpoint-texture)
                  (sdl2:render-clear *renderer*)
                  (render-plane-and-contents *renderer* +plane+)
-                 ;; NOTE: grid-render supports multiple colors for grids
-                 (grid-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*)
-                     (floor (* (width +plane+) *viewpoint-zoom*))
-                     (floor (* (height +plane+) *viewpoint-zoom*)))
-                 (indexes-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*)
-                     (floor (* (width +plane+) *viewpoint-zoom*))
-                     (floor (* (height +plane+) *viewpoint-zoom*)))
+                 (when *is-grid*
+                   (grid-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*)
+                       (floor (* (width +plane+) *viewpoint-zoom*))
+                       (floor (* (height +plane+) *viewpoint-zoom*))))
+                 (when *is-indexes*
+                   (indexes-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*)
+                       (floor (* (width +plane+) *viewpoint-zoom*))
+                       (floor (* (height +plane+) *viewpoint-zoom*))))
+                 (sdl2:set-render-draw-color *renderer* 0 255 0 155)
+                 (sdl2:set-render-draw-color *renderer* 0 0 0 255)
                  (sdl2:set-render-target *renderer* window-texture)
-                 (sdl2:render-copy *renderer* viewpoint-texture
-                                   :source-rect nil
-                                   :dest-rect (sdl2:make-rect (car *viewpoint-offset*)
-                                                              (cdr *viewpoint-offset*)
-                                                              (floor (* (width +plane+) *viewpoint-zoom*)) ; NOTE: hardcoded to +plane+, change to dynamic
-                                                              (floor (* (height +plane+) *viewpoint-zoom*)))
-                                   )
-                 ;; Grid creation
-                 ;; NOTE: grid creation should be done before, so to render on global, but it should be limited with actual viewpoint restrictions
-                 ;; to reduce cycles
-                 ;; (when *is-grid*
-                 ;;   (grid-render *renderer* +plane+))
-                 ;; Indexes creation
-                 ;; (when *is-indexes*
-                 ;;   (indexes-render *renderer* +plane+))
+                 (let ((viewpoint-rectangle (sdl2:make-rect (car *viewpoint-offset*)
+                                                            (cdr *viewpoint-offset*)
+                                                            (floor (* (width +plane+) *viewpoint-zoom*)) ; NOTE: hardcoded +plane+ usage
+                                                            (floor (* (height +plane+) *viewpoint-zoom*)))))
+                   (sdl2:render-copy *renderer* viewpoint-texture
+                                     :source-rect nil
+                                     :dest-rect viewpoint-rectangle)
+                   (sdl2:free-rect viewpoint-rectangle))
+
                  ;; pointer section
                  (when *pointer*
                    (sdl2:set-render-draw-color *renderer* 128 250 33 255)
                    (let ((select-rectangle (screen-destination (nth *pointer* (entities-list +plane+)) +plane+)))
-                     (sdl2:render-draw-rect *renderer* select-rectangle))
+                     (sdl2:render-draw-rect *renderer* select-rectangle)
+                     (sdl2:free-rect select-rectangle))
                    )
                  ;; entries generation
                  ;; (loop :for entry :in (reverse *entries-list*)
index 6129bf4..c2ccb27 100644 (file)
@@ -59,6 +59,12 @@ where the screen should be displayed"))
    (path :accessor image-path
          :initarg :image
          :initform (merge-pathnames parameters:*rulp-share* "test.png"))
+   (s-rect :initform nil
+           :documentation "this value contains the source rectangle to be used, don't
+interact directly with this but use screen-source instead")
+   (d-rect :initform nil
+           :documentation "this value contains the destination rectangle to be used, don't
+interact directly with this but use screen-destination instead")
    ))
 
 ;; Real space is the pixel grid of the screen, a position of (6 . 7) means
@@ -100,9 +106,28 @@ where the screen should be displayed"))
   "return the source rectangle, the portion of texture to display (standard all)"
   nil)
 
+;; FIXME: save and use the make-rect. destroy and create a new one when
+;; info don't match
+;; (defmethod screen-destination ((s screen) (p t))
+;;   "Without a plane of reference screens are printed full size offset of x and y
+;; pixels from the upper left angle of the window"
+;;   (let ((rect (slot-value s 'd-rect)))
+;;     (if (and
+;;          rect
+;;          (equal (x s) (sdl2:rect-x rect))
+;;          (equal (y s) (sdl2:rect-y rect))
+;;          (equal (width s) (sdl2:rect-width rect))
+;;          (equal (height s) (sdl2:rect-height rect)))
+;;         (rect)
+;;         (progn (sdl2:free-rect (slot-value s 'd-rect))
+;;                (sdl2:make-rect (x s) (y s) (width s) (height s)))
+;;         ))
+;;   )
+
+;; FIXME: find a way to store rectangles to later use
 (defmethod screen-destination ((s screen) (p t))
-  "Without a plane of reference screens are printed full size offset of x and y
-pixels from the upper left angle of the window"
+  "without a plane of reference, a screen is just printed full size from the
+top left of the window"
   (sdl2:make-rect (x s) (y s) (width s) (height s))
   )