summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chickadee/math/matrix.scm46
1 files changed, 41 insertions, 5 deletions
diff --git a/chickadee/math/matrix.scm b/chickadee/math/matrix.scm
index a04972f..c42629e 100644
--- a/chickadee/math/matrix.scm
+++ b/chickadee/math/matrix.scm
@@ -73,7 +73,10 @@
matrix4-2d-transform!
matrix4-transform-x
matrix4-transform-y
- matrix4-transform!
+ matrix4-transform-vec2!
+ matrix4-transform-vec3!
+ matrix4-transform-vec2
+ matrix4-transform-vec3
matrix4-x
matrix4-y
matrix4-z))
@@ -808,11 +811,44 @@ happens with respect to ORIGIN, a 2D vector."
(* y (matrix4-ref bv 1 1))
(matrix4-ref bv 3 1))))
-(define-inlinable (matrix4-transform! matrix v)
- (let ((x (vec2-x v))
+(define-inlinable (matrix4-transform-vec2! matrix v)
+ (let ((bv (matrix4-bv matrix))
+ (x (vec2-x v))
(y (vec2-y v)))
- (set-vec2-x! v (matrix4-transform-x matrix x y))
- (set-vec2-y! v (matrix4-transform-y matrix x y))))
+ (set-vec2-x! v (+ (* x (matrix4-ref bv 0 0))
+ (* y (matrix4-ref bv 1 0))
+ (matrix4-ref bv 3 0)))
+ (set-vec2-y! v (+ (* x (matrix4-ref bv 0 1))
+ (* y (matrix4-ref bv 1 1))
+ (matrix4-ref bv 3 1)))))
+
+(define-inlinable (matrix4-transform-vec3! matrix v)
+ (let ((bv (matrix4-bv matrix))
+ (x (vec3-x v))
+ (y (vec3-y v))
+ (z (vec3-z v)))
+ (set-vec3-x! v (+ (* x (matrix4-ref bv 0 0))
+ (* y (matrix4-ref bv 1 0))
+ (* z (matrix4-ref bv 2 0))
+ (matrix4-ref bv 3 0)))
+ (set-vec3-y! v (+ (* x (matrix4-ref bv 0 1))
+ (* y (matrix4-ref bv 1 1))
+ (* z (matrix4-ref bv 2 1))
+ (matrix4-ref bv 3 1)))
+ (set-vec3-z! v (+ (* x (matrix4-ref bv 0 2))
+ (* y (matrix4-ref bv 1 2))
+ (* z (matrix4-ref bv 2 2))
+ (matrix4-ref bv 3 2)))))
+
+(define-inlinable (matrix4-transform-vec2 matrix v)
+ (let ((new-v (vec2-copy v)))
+ (matrix4-transform-vec2! matrix new-v)
+ new-v))
+
+(define-inlinable (matrix4-transform-vec3 matrix v)
+ (let ((new-v (vec3-copy v)))
+ (matrix4-transform-vec3! matrix new-v)
+ new-v))
(define-inlinable (matrix4-x matrix)
(matrix4-ref (matrix4-bv matrix) 3 0))