;; because the multiplication of matricies require a ton of commands we make a macro! :D
;; the macro requires the nr of columns and the number of rows and the current position of both column and row
(define-macro (f32-mat*-elem columns rows column-pos row-pos first-vector second-vector)
(let ((result '()))
(let loop ((i 0))
(set! result (cons `(##fl* (##f32vector-ref ,first-vector ,(fx+ row-pos i))
(##f32vector-ref ,second-vector ,(fx+ column-pos (* i columns)))
) result))
(if (not (eq? i rows)) (loop (+ i 1)))
)
(set! result (reverse result))
`(##fl+ ,@result)
))
;; multiplies two matricites of the dimetions 4x4 into one
(define (f32mat4* first-vector second-vector)
(f32vector ;;-still
(f32-mat*-elem 4 4 0 0 first-vector second-vector) (f32-mat*-elem 4 4 1 0 first-vector second-vector) (f32-mat*-elem 4 4 2 0 first-vector second-vector) (f32-mat*-elem 4 4 3 0 first-vector second-vector)
(f32-mat*-elem 4 4 0 1 first-vector second-vector) (f32-mat*-elem 4 4 1 1 first-vector second-vector) (f32-mat*-elem 4 4 2 1 first-vector second-vector) (f32-mat*-elem 4 4 3 1 first-vector second-vector)
(f32-mat*-elem 4 4 0 2 first-vector second-vector) (f32-mat*-elem 4 4 1 2 first-vector second-vector) (f32-mat*-elem 4 4 2 2 first-vector second-vector) (f32-mat*-elem 4 4 3 2 first-vector second-vector)
(f32-mat*-elem 4 4 0 3 first-vector second-vector) (f32-mat*-elem 4 4 1 3 first-vector second-vector) (f32-mat*-elem 4 4 2 3 first-vector second-vector) (f32-mat*-elem 4 4 3 3 first-vector second-vector)
))
(define x (f32vector 1. 2. 3. 4. 1. 2. 3. 4. 1. 2. 3. 4. 1. 2. 3. 4.))
(define y (f32vector 1. 2. 3. 4. 1. 2. 3. 4. 1. 2. 3. 4. 1. 2. 3. 4.))
(time (let loop ((i 1000)) (f32mat4* x y) (if (not (eq? i 0)) (loop (- i 1)))))
####################### CODE END ####################################