(car adj-size)
(cdr adj-size)
)))
+
+(defmethod rectangle ((object entity) (grid squaregrid))
+ (let ((adj-coos (spr (span grid) (coordinates object)))
+ (adj-size (spr (span grid) (size object))))
+ (rulp.render:rectangle
+ (car adj-coos)
+ (cdr adj-coos)
+ (car adj-size)
+ (cdr adj-size)
+ )))
(defpackage :rulp.geometry
(:use :cl :rulp.layers)
- (:export grid-closure squaregrid span))
+ (:export grid-closure squaregrid span
+ to-grid from-grid rectangle))
"given coordinates and a list of entities return the position in the list of the selected
entity or nil if noone is selected"
(declare (ignore previous viewpoint)) ; mouse-previous is not used in this function
- (let ((mouse-point (sdl2:make-rect (floor (/ (- (car coordinates) (car *viewpoint-offset*)) *viewpoint-zoom*))
- (floor (/ (- (cdr coordinates) (cdr *viewpoint-offset*)) *viewpoint-zoom*)) 10 10)))
+ (let ((grid (plane-grid *plane*))
+ (mouse-point (cons (floor (/ (- (car coordinates) (car *viewpoint-offset*)) *viewpoint-zoom*))
+ (floor (/ (- (cdr coordinates) (cdr *viewpoint-offset*)) *viewpoint-zoom*)))))
+ ;; FIXME: the this calculation should be made elsewhere
(setf *pointer* nil)
- (loop :for obj :in *entities-list*
- :for obj-nth :from 0 :to (length *entities-list*)
+ (loop :for obj :in (entities-list *plane*)
+ :for obj-nth :from 0 :to (length (entities-list *plane*))
:do
- (multiple-value-bind (c s) (grid-layout (x obj) (y obj) :size (size obj))
- (when (sdl2:has-intersect mouse-point
- (arrange-rect (car c) (cdr c) s s))
- (setf *pointer* obj-nth))))
- ))
+ (let ((obj-position-to-grid (to-grid grid (coordinates obj)))
+ (obj-size-to-grid (to-grid grid (size obj))))
+ (when (rulp.render:intersect-point
+ (car obj-position-to-grid)
+ (cdr obj-position-to-grid)
+ (car obj-size-to-grid)
+ (cdr obj-size-to-grid)
+ (car mouse-point)
+ (cdr mouse-point))
+ (setf *pointer* obj-nth)
+ )))))
(defun move-entity (coordinates previous viewpoint)
"with right button it move the entity around the plane"
(declare (ignore previous viewpoint))
(when (numberp *pointer*)
- (let* ((x-offset (floor (/ (+ (x *plane*) (car *viewpoint-offset*)) *viewpoint-zoom*)))
- (y-offset (floor (/ (+ (y *plane*) (cdr *viewpoint-offset*)) *viewpoint-zoom*)))
- (i-x (floor (/ (- (car coordinates) x-offset) *plane-grid*)))
- (i-y (floor (/ (- (cdr coordinates) y-offset) *plane-grid*)))
- (object (nth *pointer* *entities-list*)))
- ;; (setf (coordinate object) (cons i-x i-y))
- (setf (coordinate (nth *pointer* *entities-list*)) (cons i-x i-y))
- ;; (setf (x object) i-x)
- ;; (setf (y object) i-y)
+ (let* ((offset (cons (floor (/ (car *viewpoint-offset*) *viewpoint-zoom*))
+ (floor (/ (cdr *viewpoint-offset*) *viewpoint-zoom*))))
+ ;; FIXME: create a solution for viewpoints
+ (offset-coordinates (cons (- (car coordinates) (car offset))
+ (- (cdr coordinates) (cdr offset))))
+ (discrete-coordinates (from-grid (plane-grid *plane*) offset-coordinates)))
+ (setf (coordinates (nth *pointer* (entities-list *plane*))) discrete-coordinates)
)))
(defun summon-entry (coordinates contents &key (title ""))
)
`(defun ,chain-name ()
,@body))
+
+
+(defchain render-plane-and-entities :viewpoint
+;; "using *plane* and *entities-list* the macro display on the current rendering texture
+;; the plane 'as is' and the entities with the grid-layout function"
+ (when *plane*
+ ;; NOTE: add error for non-screen planes
+ (display *plane* t)
+ (loop :for entity :in (entities-list *plane*)
+ :do
+ (when (displayp entity)
+ (display entity (plane-grid *plane*))
+ ))) ; FIXME: create a grid-layout function
+ )
;; BUG: when the system loads it doesn't fill the variable
;; *execute-in-viewpoint* therefore this function is never executed
-(defchain render-plane-and-entities :viewpoint
-;; "using *plane* and *entities-list* the macro display on the current rendering texture
-;; the plane 'as is' and the entities with the grid-layout function"
- (when *plane*
- ;; NOTE: add error for non-screen planes
- (display *plane* t)
- (loop :for entity :in (entities-list *plane*)
- :do
- (when (displayp entity)
- (display entity (plane-grid *plane*))
- ))) ; FIXME: create a grid-layout function
- )
(:quit () t)
(: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-left) (setf (car *viewpoint-offset*) (+ (car *viewpoint-offset*) 10)))
- ;; (when (sdl2:keyboard-state-p :scancode-right) (setf (car *viewpoint-offset*) (+ (car *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)))
+ (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-left) (setf (car *viewpoint-offset*) (+ (car *viewpoint-offset*) 10)))
+ (when (sdl2:keyboard-state-p :scancode-right) (setf (car *viewpoint-offset*) (+ (car *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 ()
(setf *is-mouse-hold* t)
;; of calling the second element of the keybind list it calls
;; the third element. If there is something there it would
;; execute a special function for when the mouse is released.
- ;; (mouse-event *mouse-position*)
+ (mouse-event *mouse-position*)
)
(:mousebuttonup ()
;; what about functions that require a single press? just create
;; pointer section
(when *pointer* ;; NOTE: to test this out
(sdl2:set-render-draw-color rulp.render:*renderer* 128 250 33 255)
- (multiple-value-bind (coordinates size) (grid-layout (car (coordinate (nth *pointer* (entities-list *plane*))))
- (cdr (coordinate (nth *pointer* (entities-list *plane*))))
- :size (car (size (nth *pointer* (entities-list *plane*)))))
- ;; FIXME: bodged the size here, check this piece and repair
- (let ((select-rectangle (sdl2:make-rect (car coordinates) (cdr coordinates) size size)))
- (sdl2:render-draw-rect rulp.render:*renderer* select-rectangle)
- (sdl2:free-rect select-rectangle)))
+ (let* ((object (nth *pointer* (entities-list *plane*)))
+ (grid (plane-grid *plane*))
+ (obj-position (to-grid grid (coordinates object)))
+ (obj-size (to-grid grid (size object))))
+ (rulp.render:render-square (car obj-position)
+ (cdr obj-position)
+ (car obj-size)
+ (cdr obj-size)))
(sdl2:set-render-draw-color rulp.render:*renderer* 0 0 0 255)
))
nil))
(defmethod w ((obj entity))
- (size obj)
+ (slot-value obj 'size)
)
(defmethod h ((obj entity))
- (size obj)
+ (slot-value obj 'size)
)
(defmethod size ((obj entity))
render-line render-text render-texture
load-texture texture-width texture-height
intersect-point intersect-square destroy-texture
- make-rectangle))
-
+ make-rectangle rectangle render-square))