-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.lisp
93 lines (68 loc) · 2.01 KB
/
utils.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
(in-package #:game2)
;;;;;;;;;;;;;;;;;;;;;;;;
;; CONVINIENCE MACROS ;;
;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro increase (field value)
"operates on vectors"
`(setf ,field
(add ,field ,value)))
(defmacro decrease (field value)
"operates on vectors"
`(setf ,field
(subt ,field ,value)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 2D DISTANCE INTERFACE ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defgeneric distance (a b)
(:documentation "distance between 2 vectors"))
(defmethod distance ((a vec2) (b vec2))
(sqrt (+ (expt (- (x a) (x b)) 2)
(expt (- (y a) (y b)) 2))))
;;;;;;;;;;;;;;;;;;;;;;;
;; INVERSE INTERFACE ;;
;;;;;;;;;;;;;;;;;;;;;;;
(defgeneric inverse (obj))
(defmethod inverse ((vec vec2))
(vec2 (- (x vec))
(- (y vec))))
;;;;;;;;;;;;;
;; PALETTE ;;
;;;;;;;;;;;;;
(defparameter *palette* (alexandria:plist-hash-table (list :black (vec4 0 0 0 1)
:white (vec4 1 1 1 1)
:grey (vec4 0.75 0.75 0.75 0.75)
:pink (vec4 1 0 1 1)
:maroon (vec4 0.5 0 0 0.7)
:red (vec4 1 0 0 1)
:aqua (vec4 0 1 1 1)))
"color palette")
(defun color (key)
(gethash key *palette*))
;;;;;;;;;;;;;
;; COUNTER ;;
;;;;;;;;;;;;;
(defgeneric counter-tick (arg))
(defgeneric counter-elapsed-p (arg))
(defgeneric counter-reset (counter &optional remains))
(defclass counter ()
((initial :initarg :initial
:accessor initial
:initform 0)
(delta :initform 1
:initarg :delta)
(remains :accessor remains)))
(defmethod initialize-instance :after ((counter counter) &rest initargs)
(declare (ignore initargs))
(with-slots (initial remains) counter
(setf remains initial)))
(defmethod counter-tick ((counter counter))
(with-slots (remains delta) counter
(decf remains delta)))
(defmethod counter-elapsed-p ((counter counter))
(with-slots (remains) counter
(<= remains 0)))
(defmethod counter-reset ((counter counter) &optional init)
(with-slots (remains initial) counter
(if init
(setf (remains counter) init)
(setf (remains counter) (initial counter)))))