a5b56cd9bbcf

vec-set!
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sat, 20 Aug 2016 12:17:19 +0000
parents ae02fff6fa65
children 94393b5cd67e
branches/tags (none)
files src/vectors.lisp

Changes

--- a/src/vectors.lisp	Thu Aug 18 22:15:06 2016 +0000
+++ b/src/vectors.lisp	Sat Aug 20 12:17:19 2016 +0000
@@ -73,9 +73,13 @@
 
 (defmacro defvec2ops (vec-type element-type)
   (let ((add (symbolize vec-type '-add))
+        (add* (symbolize vec-type '-add*))
         (add! (symbolize vec-type '-add!))
+        (add*! (symbolize vec-type '-add*!))
         (sub (symbolize vec-type '-sub))
+        (sub* (symbolize vec-type '-sub*))
         (sub! (symbolize vec-type '-sub!))
+        (sub*! (symbolize vec-type '-sub*!))
         (mul (symbolize vec-type '-mul))
         (mul! (symbolize vec-type '-mul!))
         (div (symbolize vec-type '-div))
@@ -85,7 +89,8 @@
         (magnitude (symbolize vec-type '-magnitude))
         (length (symbolize vec-type '-length))
         (angle (symbolize vec-type '-angle))
-        (direction (symbolize vec-type '-direction)))
+        (direction (symbolize vec-type '-direction))
+        (set! (symbolize vec-type '-set!)))
     `(progn
       (declaim
         (ftype (function (,element-type ,element-type)
@@ -100,6 +105,10 @@
                          (values ,vec-type &optional))
                ,add ,sub ,add! ,sub!)
 
+        (ftype (function (,vec-type ,element-type ,element-type)
+                         (values ,vec-type &optional))
+               ,add* ,add*! ,sub* ,sub*! ,set!)
+
         (ftype (function (,vec-type ,element-type)
                          (values ,vec-type &optional))
                ,mul ,div ,mul! ,div!)
@@ -113,6 +122,11 @@
       (with-fns
         ,vec-type ,element-type
 
+        (defun ,set! (v x y)
+          (setf (vec-x v) x
+                (vec-y v) y)
+          v)
+
         (defun ,magdir (magnitude direction)
           ;; todo figure this out for integer vectors
           (vec
@@ -127,29 +141,44 @@
                  (= (vec-y v1) (vec-y v2)))))
 
         (defun ,add (v1 v2)
-          (vec
-            (wrap (+ (vec-x v1) (vec-x v2)))
-            (wrap (+ (vec-y v1) (vec-y v2)))))
+          (vec (wrap (+ (vec-x v1) (vec-x v2)))
+               (wrap (+ (vec-y v1) (vec-y v2)))))
+
+        (defun ,add* (v x y)
+          (vec (wrap (+ (vec-x v) x))
+               (wrap (+ (vec-y v) y))))
 
         (defun ,add! (v1 v2)
           (setf (vec-x v1) (wrap (+ (vec-x v1) (vec-x v2)))
                 (vec-y v1) (wrap (+ (vec-y v1) (vec-y v2))))
           v1)
 
+        (defun ,add*! (v x y)
+          (setf (vec-x v) (wrap (+ (vec-x v) x))
+                (vec-y v) (wrap (+ (vec-y v) y)))
+          v)
+
         (defun ,sub (v1 v2)
-          (vec
-            (wrap (- (vec-x v1) (vec-x v2)))
-            (wrap (- (vec-y v1) (vec-y v2)))))
+          (vec (wrap (- (vec-x v1) (vec-x v2)))
+               (wrap (- (vec-y v1) (vec-y v2)))))
+
+        (defun ,sub* (v x y)
+          (vec (wrap (- (vec-x v) x))
+               (wrap (- (vec-y v) y))))
 
         (defun ,sub! (v1 v2)
           (setf (vec-x v1) (wrap (- (vec-x v1) (vec-x v2)))
                 (vec-y v1) (wrap (- (vec-y v1) (vec-y v2))))
           v1)
 
+        (defun ,sub*! (v x y)
+          (setf (vec-x v) (wrap (- (vec-x v) x))
+                (vec-y v) (wrap (- (vec-y v) y)))
+          v)
+
         (defun ,mul (v scalar)
-          (vec
-            (wrap (* (vec-x v) scalar))
-            (wrap (* (vec-y v) scalar))))
+          (vec (wrap (* (vec-x v) scalar))
+               (wrap (* (vec-y v) scalar))))
 
         (defun ,mul! (v scalar)
           (setf (vec-x v) (wrap (* (vec-x v) scalar))
@@ -157,9 +186,8 @@
           v)
 
         (defun ,div (v scalar)
-          (vec
-            (wrap (// (vec-x v) scalar))
-            (wrap (// (vec-y v) scalar))))
+          (vec (wrap (// (vec-x v) scalar))
+               (wrap (// (vec-y v) scalar))))
 
         (defun ,div! (v scalar)
           (setf (vec-x v) (wrap (// (vec-x v) scalar))
@@ -179,9 +207,14 @@
 (defvec2ops vec2d double-float)
 (defvec2ops vec2i fixnum)
 
-; (declaim (optimize (speed 3) (safety 1) (debug 0)))
+(declaim (optimize (speed 3) (safety 1) (debug 0)))
 ; vec2i-eql
 ; vec2f-add
+; vec2f-add*
+; vec2f-add!
+; vec2f-add*!
+; vec2f-set!
+; vec2f-sub*!
 ; vec2f-add!
 ; vec2f-sub!
 ; vec2f-mul!