`(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)))))
(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))
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)))
(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 ()
(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
(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*)
(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
"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))
)