(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "22-Apr-87 09:55:51" {ERIS}<LISPCORE>LIBRARY>MATMULT.;24 29646 changes to%: (FUNCTIONS %%MATMULT-N33) previous date%: "15-Apr-87 16:49:42" {ERIS}<LISPCORE>LIBRARY>MATMULT.;23) (* " Copyright (c) 1985, 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT MATMULTCOMS) (RPAQQ MATMULTCOMS ( (* ;;; "User entry points") (DECLARE%: DONTCOPY DOEVAL@COMPILE (FILES FLOAT-ARRAY-SUPPORT)) (FUNCTIONS %%MATMULT-N33 %%MATMULT-N44 DEGREES-TO-RADIANS IDENTITY-3-BY-3 IDENTITY-4-BY-4 MAKE-HOMOGENEOUS-3-BY-3 MAKE-HOMOGENEOUS-3-VECTOR MAKE-HOMOGENEOUS-4-BY-4 MAKE-HOMOGENEOUS-4-VECTOR MAKE-HOMOGENEOUS-N-BY-3 MAKE-HOMOGENEOUS-N-BY-4 MATMULT-133 MATMULT-144 MATMULT-331 MATMULT-333 MATMULT-441 MATMULT-444 MATMULT-N33 MATMULT-N44 PERSPECTIVE-4-BY-4 PROJECT-AND-FIX-3-VECTOR PROJECT-AND-FIX-4-VECTOR PROJECT-AND-FIX-N-BY-3 PROJECT-AND-FIX-N-BY-4 ROTATE-3-BY-3 ROTATE-4-BY-4-ABOUT-X ROTATE-4-BY-4-ABOUT-Y ROTATE-4-BY-4-ABOUT-Z SCALE-3-BY-3 SCALE-4-BY-4 TRANSLATE-3-BY-3 TRANSLATE-4-BY-4) (* ;;; "Compiler options") (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T)) (PROP FILETYPE MATMULT))) (* ;;; "User entry points") (DECLARE%: DONTCOPY DOEVAL@COMPILE (FILESLOAD FLOAT-ARRAY-SUPPORT) ) (DEFMACRO %%MATMULT-N33 (N A-BASE B-BASE RESULT-BASE) `(CL:DO ((I 0 (CL:1+ I)) (SOURCE-BASE ,A-BASE (\ADDBASE SOURCE-BASE 6)) (DEST-BASE ,RESULT-BASE (\ADDBASE DEST-BASE 6)) (MATRIX-BASE ,B-BASE)) ((EQ I ,N)) (%%MATMULT-133 SOURCE-BASE MATRIX-BASE DEST-BASE))) (DEFMACRO %%MATMULT-N44 (N A-BASE B-BASE RESULT-BASE) `(CL:DO ((I 0 (CL:1+ I)) (SOURCE-BASE ,A-BASE (\ADDBASE SOURCE-BASE 8)) (DEST-BASE ,RESULT-BASE (\ADDBASE DEST-BASE 8)) (MATRIX-BASE ,B-BASE)) ((EQ I ,N)) (%%MATMULT-144 SOURCE-BASE MATRIX-BASE DEST-BASE))) (CL:DEFUN DEGREES-TO-RADIANS (DEGREES) (CL:* (FLOAT DEGREES) (CONSTANT (/ CL:PI 180.0)))) (CL:DEFUN IDENTITY-3-BY-3 (&OPTIONAL RESULT) (LET [(MATRIX (%%INSURE-ARRAY RESULT (3 3] (FILL-ARRAY MATRIX 0.0) (CL:DOTIMES (I 3) (ASET 1.0 MATRIX I I)) MATRIX)) (CL:DEFUN IDENTITY-4-BY-4 (&OPTIONAL RESULT) (LET [(MATRIX (%%INSURE-ARRAY RESULT (4 4] (FILL-ARRAY MATRIX 0.0) (CL:DOTIMES (I 4) (ASET 1.0 MATRIX I I)) MATRIX)) (CL:DEFUN MAKE-HOMOGENEOUS-3-BY-3 (&KEY A00 A01 A10 A11 A20 A21) (LET [(MATRIX (CL:MAKE-ARRAY '(3 3) :ELEMENT-TYPE 'CL:SINGLE-FLOAT] (CL:IF A00 (ASET (FLOAT A00) MATRIX 0 0)) (CL:IF A01 (ASET (FLOAT A01) MATRIX 0 1)) (CL:IF A10 (ASET (FLOAT A10) MATRIX 1 0)) (CL:IF A11 (ASET (FLOAT A11) MATRIX 1 1)) (CL:IF A20 (ASET (FLOAT A20) MATRIX 2 0)) (CL:IF A21 (ASET (FLOAT A21) MATRIX 2 1)) (ASET 1.0 MATRIX 2 2) MATRIX)) (CL:DEFUN MAKE-HOMOGENEOUS-3-VECTOR (&OPTIONAL X Y) (LET [(V (MAKE-VECTOR 3 :ELEMENT-TYPE 'CL:SINGLE-FLOAT] (CL:IF X (ASET (FLOAT X) V 0)) (CL:IF Y (ASET (FLOAT Y) V 1)) (ASET 1.0 V 2) V)) (CL:DEFUN MAKE-HOMOGENEOUS-4-BY-4 (&KEY A00 A01 A02 A03 A10 A11 A12 A13 A20 A21 A22 A23 A30 A31 A32) (LET [(MATRIX (CL:MAKE-ARRAY '(4 4) :ELEMENT-TYPE 'CL:SINGLE-FLOAT] (CL:IF A00 (ASET (FLOAT A00) MATRIX 0 0)) (CL:IF A01 (ASET (FLOAT A01) MATRIX 0 1)) (CL:IF A02 (ASET (FLOAT A02) MATRIX 0 2)) (CL:IF A03 (ASET (FLOAT A03) MATRIX 0 3)) (CL:IF A10 (ASET (FLOAT A10) MATRIX 1 0)) (CL:IF A11 (ASET (FLOAT A11) MATRIX 1 1)) (CL:IF A12 (ASET (FLOAT A12) MATRIX 1 2)) (CL:IF A13 (ASET (FLOAT A13) MATRIX 1 3)) (CL:IF A20 (ASET (FLOAT A20) MATRIX 2 0)) (CL:IF A21 (ASET (FLOAT A21) MATRIX 2 1)) (CL:IF A22 (ASET (FLOAT A22) MATRIX 2 2)) (CL:IF A23 (ASET (FLOAT A23) MATRIX 2 3)) (CL:IF A30 (ASET (FLOAT A30) MATRIX 3 0)) (CL:IF A31 (ASET (FLOAT A31) MATRIX 3 1)) (CL:IF A32 (ASET (FLOAT A32) MATRIX 3 2)) (ASET 1.0 MATRIX 3 3) MATRIX)) (CL:DEFUN MAKE-HOMOGENEOUS-4-VECTOR (&OPTIONAL X Y Z) (LET [(V (MAKE-VECTOR 4 :ELEMENT-TYPE 'CL:SINGLE-FLOAT] (CL:IF X (ASET (FLOAT X) V 0)) (CL:IF Y (ASET (FLOAT Y) V 1)) (CL:IF Z (ASET (FLOAT Z) V 2)) (ASET 1.0 V 3) V)) (CL:DEFUN MAKE-HOMOGENEOUS-N-BY-3 (N &KEY INITIAL-ELEMENT) (LET [(MATRIX (CL:MAKE-ARRAY (LIST N 3) :ELEMENT-TYPE 'CL:SINGLE-FLOAT] (CL:IF INITIAL-ELEMENT (FILL-ARRAY MATRIX (FLOAT INITIAL-ELEMENT) )) (CL:DOTIMES (I N) (ASET 1.0 MATRIX I 2)) MATRIX)) (CL:DEFUN MAKE-HOMOGENEOUS-N-BY-4 (N &KEY INITIAL-ELEMENT) (LET [(MATRIX (CL:MAKE-ARRAY (LIST N 4) :ELEMENT-TYPE 'CL:SINGLE-FLOAT] (CL:IF INITIAL-ELEMENT (FILL-ARRAY MATRIX (FLOAT INITIAL-ELEMENT) )) (CL:DOTIMES (I N) (ASET 1.0 MATRIX I 3)) MATRIX)) (CL:DEFUN MATMULT-133 (VECTOR MATRIX &OPTIONAL RESULT) (%%TEST-ARRAY VECTOR (3)) (%%TEST-ARRAY MATRIX (3 3)) (SETQ RESULT (%%INSURE-ARRAY RESULT (3))) (CL:IF (EQ VECTOR RESULT) (CL:ERROR "Results undefined if VECTOR reused" )) (%%MATMULT-133 (%%GET-FLOAT-ARRAY-BASE VECTOR) (%%GET-FLOAT-ARRAY-BASE MATRIX) (%%GET-FLOAT-ARRAY-BASE RESULT)) RESULT) (CL:DEFUN MATMULT-144 (VECTOR MATRIX &OPTIONAL RESULT) (%%TEST-ARRAY VECTOR (4)) (%%TEST-ARRAY MATRIX (4 4)) (SETQ RESULT (%%INSURE-ARRAY RESULT (4))) (CL:IF (EQ VECTOR RESULT) (CL:ERROR "Results undefined if VECTOR reused" )) (%%MATMULT-144 (%%GET-FLOAT-ARRAY-BASE VECTOR) (%%GET-FLOAT-ARRAY-BASE MATRIX) (%%GET-FLOAT-ARRAY-BASE RESULT)) RESULT) (CL:DEFUN MATMULT-331 (MATRIX VECTOR &OPTIONAL RESULT) (%%TEST-ARRAY MATRIX (3 3)) (%%TEST-ARRAY VECTOR (3)) (SETQ RESULT (%%INSURE-ARRAY RESULT (3))) (CL:IF (EQ MATRIX RESULT) (CL:ERROR "Results undefined if MATRIX reused" )) (%%MATMULT-331 (%%GET-FLOAT-ARRAY-BASE MATRIX) (%%GET-FLOAT-ARRAY-BASE VECTOR) (%%GET-FLOAT-ARRAY-BASE RESULT)) RESULT) (CL:DEFUN MATMULT-333 (MATRIX-1 MATRIX-2 &OPTIONAL RESULT) (%%TEST-ARRAY MATRIX-1 (3 3)) (%%TEST-ARRAY MATRIX-2 (3 3)) (SETQ RESULT (%%INSURE-ARRAY RESULT (3 3))) (CL:IF (EQ MATRIX-1 RESULT) (CL:ERROR "Results undefined if MATRIX-1 reused" )) (%%MATMULT-333 (%%GET-FLOAT-ARRAY-BASE MATRIX-1) (%%GET-FLOAT-ARRAY-BASE MATRIX-2) (%%GET-FLOAT-ARRAY-BASE RESULT)) RESULT) (CL:DEFUN MATMULT-441 (MATRIX VECTOR &OPTIONAL RESULT) (%%TEST-ARRAY MATRIX (4 4)) (%%TEST-ARRAY VECTOR (4)) (SETQ RESULT (%%INSURE-ARRAY RESULT (4))) (CL:IF (EQ MATRIX RESULT) (CL:ERROR "Results undefined if MATRIX reused" )) (%%MATMULT-441 (%%GET-FLOAT-ARRAY-BASE MATRIX) (%%GET-FLOAT-ARRAY-BASE VECTOR) (%%GET-FLOAT-ARRAY-BASE RESULT)) RESULT) (CL:DEFUN MATMULT-444 (MATRIX-1 MATRIX-2 &OPTIONAL RESULT) (%%TEST-ARRAY MATRIX-1 (4 4)) (%%TEST-ARRAY MATRIX-2 (4 4)) (SETQ RESULT (%%INSURE-ARRAY RESULT (4 4))) (CL:IF (EQ MATRIX-1 RESULT) (CL:ERROR "Results undefined if MATRIX-1 reused" )) (%%MATMULT-444 (%%GET-FLOAT-ARRAY-BASE MATRIX-1) (%%GET-FLOAT-ARRAY-BASE MATRIX-2) (%%GET-FLOAT-ARRAY-BASE RESULT)) RESULT) (CL:DEFUN MATMULT-N33 (MATRIX-1 MATRIX-2 &OPTIONAL RESULT) (%%TEST-ARRAY MATRIX-1 (CL:* 3)) (%%TEST-ARRAY MATRIX-2 (3 3)) (SETQ RESULT (%%INSURE-ARRAY RESULT (CL:* 3) (CL:ARRAY-DIMENSIONS MATRIX-1))) (CL:IF (EQ MATRIX-1 RESULT) (CL:ERROR "Results undefined if MATRIX-1 reused" )) (LET ((N (CL:ARRAY-DIMENSION MATRIX-1 0))) (CL:IF (NOT (EQ N (CL:ARRAY-DIMENSION RESULT 0))) (CL:ERROR "Dimensional mismatch") ) (%%MATMULT-N33 N ( %%GET-FLOAT-ARRAY-BASE MATRIX-1) (%%GET-FLOAT-ARRAY-BASE MATRIX-2) (%%GET-FLOAT-ARRAY-BASE RESULT )) RESULT)) (CL:DEFUN MATMULT-N44 (MATRIX-1 MATRIX-2 &OPTIONAL RESULT) (%%TEST-ARRAY MATRIX-1 (CL:* 4)) (%%TEST-ARRAY MATRIX-2 (4 4)) (SETQ RESULT (%%INSURE-ARRAY RESULT (CL:* 4) (CL:ARRAY-DIMENSIONS MATRIX-1))) (CL:IF (EQ MATRIX-1 RESULT) (CL:ERROR "Results undefined if MATRIX-1 reused" )) (LET ((N (CL:ARRAY-DIMENSION MATRIX-1 0))) (CL:IF (NOT (EQ N (CL:ARRAY-DIMENSION RESULT 0))) (CL:ERROR "Dimensional mismatch") ) (%%MATMULT-N44 N ( %%GET-FLOAT-ARRAY-BASE MATRIX-1) (%%GET-FLOAT-ARRAY-BASE MATRIX-2) (%%GET-FLOAT-ARRAY-BASE RESULT )) RESULT)) (CL:DEFUN PERSPECTIVE-4-BY-4 (PX PY PZ &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-4-BY-4 RESULT))) (ASET (FLOAT PX) MATRIX 0 3) (ASET (FLOAT PY) MATRIX 1 3) (ASET (FLOAT PZ) MATRIX 2 3) MATRIX)) (CL:DEFUN PROJECT-AND-FIX-3-VECTOR (3-VECTOR &OPTIONAL 2-VECTOR) (%%TEST-ARRAY 3-VECTOR (3)) (COND [(NULL 2-VECTOR) (SETQ 2-VECTOR (CL:MAKE-ARRAY '(2] ([NOT (TYPEP 2-VECTOR '(CL:ARRAY CL:* (2] (CL:ERROR "Not a 2 vector: ~s" 2-VECTOR))) (LET ((3-VECTOR-BASE (%%GET-FLOAT-ARRAY-BASE 3-VECTOR))) (CL:DOTIMES (J 2) (ASET (UFIX (\GETBASEFLOATP 3-VECTOR-BASE (LLSH J 1))) 2-VECTOR J)) 2-VECTOR)) (CL:DEFUN PROJECT-AND-FIX-4-VECTOR (4-VECTOR &OPTIONAL 2-VECTOR) (%%TEST-ARRAY 4-VECTOR (4)) (COND [(NULL 2-VECTOR) (SETQ 2-VECTOR (CL:MAKE-ARRAY '(2] ([NOT (TYPEP 2-VECTOR '(CL:ARRAY CL:* (2] (CL:ERROR "Not a 2 vector: ~s" 2-VECTOR))) (LET* ((4-VECTOR-BASE (%%GET-FLOAT-ARRAY-BASE 4-VECTOR)) (DIVISOR (\GETBASEFLOATP 4-VECTOR-BASE 6))) (DECLARE (TYPE FLOATP DIVISOR)) (CL:IF (UFEQP DIVISOR 1.0) (CL:DOTIMES (J 2) (ASET (UFIX (\GETBASEFLOATP 4-VECTOR-BASE (LLSH J 1))) 2-VECTOR J)) (CL:DOTIMES (J 2) (ASET (UFIX (FQUOTIENT (\GETBASEFLOATP 4-VECTOR-BASE (LLSH J 1)) DIVISOR)) 2-VECTOR J))) 2-VECTOR)) (CL:DEFUN PROJECT-AND-FIX-N-BY-3 (N-3-MATRIX &OPTIONAL N-2-MATRIX) (%%TEST-ARRAY N-3-MATRIX (CL:* 3)) (COND [(NULL N-2-MATRIX) (SETQ N-2-MATRIX (CL:MAKE-ARRAY (LIST (CL:ARRAY-DIMENSION N-3-MATRIX 0) 2] ([NOT (TYPEP N-2-MATRIX '(CL:ARRAY CL:* (CL:* 2] (CL:ERROR "Not an N by 2 array: ~s" N-2-MATRIX))) (LET ((N (CL:ARRAY-DIMENSION N-3-MATRIX 0))) (CL:IF (NOT (EQ N (CL:ARRAY-DIMENSION N-2-MATRIX 0))) (CL:ERROR "Dimensional mismatch")) (CL:DO ((I 0 (CL:1+ I)) (N-3-BASE (%%GET-FLOAT-ARRAY-BASE N-3-MATRIX) (\ADDBASE N-3-BASE 6))) ((EQ I N)) (CL:DOTIMES (J 2) (ASET (UFIX (\GETBASEFLOATP N-3-BASE (LLSH J 1))) N-2-MATRIX I J))) N-2-MATRIX)) (CL:DEFUN PROJECT-AND-FIX-N-BY-4 (N-4-MATRIX &OPTIONAL N-2-MATRIX) (%%TEST-ARRAY N-4-MATRIX (CL:* 4)) (COND [(NULL N-2-MATRIX) (SETQ N-2-MATRIX (CL:MAKE-ARRAY (LIST (CL:ARRAY-DIMENSION N-4-MATRIX 0) 2] ([NOT (TYPEP N-2-MATRIX '(CL:ARRAY CL:* (CL:* 2] (CL:ERROR "Not an N by 2 array: ~s" N-2-MATRIX))) (LET ((N (CL:ARRAY-DIMENSION N-4-MATRIX 0))) (CL:IF (NOT (EQ N (CL:ARRAY-DIMENSION N-2-MATRIX 0))) (CL:ERROR "Dimensional mismatch")) [CL:DO ((I 0 (CL:1+ I)) (N-4-BASE (%%GET-FLOAT-ARRAY-BASE N-4-MATRIX) (\ADDBASE N-4-BASE 8))) ((EQ I N)) (LET ((DIVISOR (\GETBASEFLOATP N-4-BASE 6))) (DECLARE (TYPE FLOATP DIVISOR)) (CL:IF (UFEQP DIVISOR 1.0) (CL:DOTIMES (J 2) (ASET (UFIX (\GETBASEFLOATP N-4-BASE (LLSH J 1))) N-2-MATRIX I J)) (CL:DOTIMES (J 2) (ASET (UFIX (FQUOTIENT (\GETBASEFLOATP N-4-BASE (LLSH J 1)) DIVISOR)) N-2-MATRIX I J] N-2-MATRIX)) (CL:DEFUN ROTATE-3-BY-3 (RADIANS &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-3-BY-3 RESULT)) (COSPHI (CL:COS RADIANS)) (SINPHI (CL:SIN RADIANS))) (ASET COSPHI MATRIX 0 0) (ASET (- SINPHI) MATRIX 0 1) (ASET SINPHI MATRIX 1 0) (ASET COSPHI MATRIX 1 1) MATRIX)) (CL:DEFUN ROTATE-4-BY-4-ABOUT-X (RADIANS &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-4-BY-4 RESULT)) (COSPHI (CL:COS RADIANS)) (SINPHI (CL:SIN RADIANS))) (ASET COSPHI MATRIX 1 1) (ASET (- SINPHI) MATRIX 1 2) (ASET SINPHI MATRIX 2 1) (ASET COSPHI MATRIX 2 2) MATRIX)) (CL:DEFUN ROTATE-4-BY-4-ABOUT-Y (RADIANS &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-4-BY-4 RESULT)) (COSPHI (CL:COS RADIANS)) (SINPHI (CL:SIN RADIANS))) (ASET COSPHI MATRIX 0 0) (ASET (- SINPHI) MATRIX 2 0) (ASET SINPHI MATRIX 0 2) (ASET COSPHI MATRIX 2 2) MATRIX)) (CL:DEFUN ROTATE-4-BY-4-ABOUT-Z (RADIANS &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-4-BY-4 RESULT)) (COSPHI (CL:COS RADIANS)) (SINPHI (CL:SIN RADIANS))) (ASET COSPHI MATRIX 0 0) (ASET (- SINPHI) MATRIX 0 1) (ASET SINPHI MATRIX 1 0) (ASET COSPHI MATRIX 1 1) MATRIX)) (CL:DEFUN SCALE-3-BY-3 (SX SY &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-3-BY-3 RESULT))) (ASET (FLOAT SX) MATRIX 0 0) (ASET (FLOAT SY) MATRIX 1 1) MATRIX)) (CL:DEFUN SCALE-4-BY-4 (SX SY SZ &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-4-BY-4 RESULT))) (ASET (FLOAT SX) MATRIX 0 0) (ASET (FLOAT SY) MATRIX 1 1) (ASET (FLOAT SZ) MATRIX 2 2) MATRIX)) (CL:DEFUN TRANSLATE-3-BY-3 (TX TY &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-3-BY-3 RESULT))) (ASET (FLOAT TX) MATRIX 2 0) (ASET (FLOAT TY) MATRIX 2 1) MATRIX)) (CL:DEFUN TRANSLATE-4-BY-4 (TX TY TZ &OPTIONAL RESULT) (LET ((MATRIX (IDENTITY-4-BY-4 RESULT))) (ASET (FLOAT TX) MATRIX 3 0) (ASET (FLOAT TY) MATRIX 3 1) (ASET (FLOAT TZ) MATRIX 3 2) MATRIX)) (* ;;; "Compiler options") (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (DECLARE%: DOEVAL@COMPILE DONTCOPY (LOCALVARS . T) ) ) (PUTPROPS MATMULT FILETYPE CL:COMPILE-FILE) (PUTPROPS MATMULT COPYRIGHT ("Xerox Corporation" 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL))) STOP