;;-*-Lisp-*- (in-package goal) ;; name: matrix-h.gc ;; name in dgo: matrix-h ;; dgos: GAME, ENGINE ;; A 4x4 matrix, stored in row-major order (deftype matrix (structure) ((vector vector 4 :inline :offset-assert 0) (quad uint128 4 :offset 0) (data float 16 :offset 0) ;; moved so the decompiler looks at vector first. ) :method-count-assert 10 :size-assert #x40 :flag-assert #xa00000040 (:methods (transform-vectors! (_type_ (inline-array vector) (inline-array vector) int) none 9) ) ) ;; A 3x3 matrix, stored in row-major order. ;; NOTE: the rows each have an extra 4-bytes of padding ;; so this is really a 3x4 matrix. (deftype matrix3 (structure) ((data float 12 :offset-assert 0) (vector vector 3 :inline :offset 0) (quad uint128 3 :offset 0) ) :method-count-assert 9 :size-assert #x30 :flag-assert #x900000030 ) ;; guess on signs here (deftype matrix4h (structure) ((data int16 16 :offset-assert 0) (vector4h vector4h 4 :inline :offset 0) (long int64 4 :offset 0) ) :method-count-assert 9 :size-assert #x20 :flag-assert #x900000020 ) (defun matrix-copy! ((dst matrix) (src matrix)) "Copy src to dst" (let ((v1-0 (-> src vector 0 quad)) (a2-0 (-> src vector 1 quad)) (a3-0 (-> src vector 2 quad)) (a1-1 (-> src vector 3 quad)) ) (set! (-> dst vector 0 quad) v1-0) (set! (-> dst vector 1 quad) a2-0) (set! (-> dst vector 2 quad) a3-0) (set! (-> dst vector 3 quad) a1-1) ) dst ) (defmacro new-stack-matrix0 () "Get a new matrix on the stack that's set to zero." `(let ((mat (new 'stack-no-clear 'matrix))) (set! (-> mat quad 0) (the-as uint128 0)) (set! (-> mat quad 1) (the-as uint128 0)) (set! (-> mat quad 2) (the-as uint128 0)) (set! (-> mat quad 3) (the-as uint128 0)) mat ) )