( -------------------------------------------------
( FILE:         VECTORS.RPL
( DESCRIPTION:  Definitions for Vector Operations
( PLATFORM: 	WINDOWS
( VERSION:      2.4
( DATE:	        5-Feb-93
( -------------------------------------------------

?& VECTORS.RPL NOT ?IF
17 CONSTANT VECTORS.RPL

8 CONSTANT FSIZE 
4 CONSTANT ISIZE

( alloc 3 x FTYPE and leave the address on the stack )

: VVARIABLE
    <BUILDS FSIZE 3 * ALLOT DOES>
;

( store a vector in VVARIABLE )

: VSTORE
    DUP FSIZE 2 * + ROT SWAP FSTORE
    DUP FSIZE + ROT SWAP FSTORE
    FSTORE
;

( fetch a vector from VVARIABLE )

: VFETCH 
    DUP FFETCH
    OVER FSIZE + FFETCH
    ROT FSIZE 2 * + FFETCH
;

( add two vectors )

: VADD
    4 ROLL F+ SWAP
    4 ROLL F+ ROT
    4 ROLL F+ SWAP ROT
;

( subtract two vectors )

: VSUB 
    4 ROLL SWAP F- SWAP
    4 ROLL SWAP F- ROT
    4 ROLL SWAP F- SWAP ROT
;

( multiply vector by scalar )

: VMUL 
    DUP 5 ROLL F* SWAP
    DUP 5 ROLL F* SWAP
    4 ROLL F*
;

( Dot product )

: VDOT 
    4 ROLL F* SWAP
    4 ROLL F* ROT
    4 ROLL F* SWAP ROT
;


( Cross product )

: VCROSS 
    5 ROLL DUP 3 ROLL DUP 3 ROLL F*
    6 ROLL DUP 7 ROLL DUP 3 ROLL F*
    8 ROLL DUP 9 ROLL DUP 3 ROLL F*

    6 ROLL 3 ROLL F*
    3 ROLL 7 ROLL F*
    7 ROLL 6 ROLL F*

    VSUB
;


( print vector )

: V.
    3 ROLL  F.
    2 ROLL  F.
    F.
;

( define vector constant )

: VCONSTANT
    <BUILDS ROT F, SWAP F, F, DOES> VFETCH
;

( length of the vector )

: VLEN 
    DUP F* ROT DUP F* ROT DUP F* F+ F+ SQRT
;

( Duplicate vector )

: VDUP 
    3 ROLL DUP 4 ROLL DUP 5 ROLL DUP 6 ROLL 5 ROLL 4 ROLL
;

( normalize vector )

: VNORM 
   VDUP DUP F* ROT DUP F* ROT DUP F* F+ F+ SQRT
   DUP 0 F> IF
      1.0 SWAP F/ VMUL
   ELSE
      1.0 0 0
   ENDIF
;

( discard vector )

: VDROP 
    DROP DROP DROP
;

( some useful constants )

1.0 0.0 0.0    VCONSTANT vX
0.0 1.0 0.0    VCONSTANT vY
0.0 0.0 1.0    VCONSTANT vZ

: V@ VFETCH ;
: V! VSTORE ;

?ENDIF ( VECTORS.RPL )
