package Ġme . anno . utils . types Ċ Ċ import Ġme . anno . math s . Math s . sq Ċ import Ġme . anno . utils . pool ing . J om l Pools Ċ import Ġorg . j om l .* Ċ import Ġkotlin . math . sqrt Ċ Ċ object ĠMat rices Ġ{ ĊĊĠĠĠ Ġfun ĠMatrix 4 f . is Identity (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproperties (). and ( Matrix 4 f . PROPERTY _ IDENTITY . toInt ()) Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 f . is Identity (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproperties (). and ( Matrix 4 x 3 f . PROPERTY _ IDENTITY . toInt ()) Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . clone () Ġ= ĠMatrix 4 f ( this ) ĊĊĠĠĠ Ġfun ĠMatrix 4 f . skew ( v : ĠVector 2 fc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmul 3 x 3 ( // Ġworks ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 f , Ġv . y (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . x (), Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 0 f , Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . skew ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmul 3 x 3 ( // Ġworks ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 f , Ġy , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 0 f , Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 d . skew ( x : ĠDouble , Ġy : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmul 3 x 3 ( // Ġworks ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 , Ġy , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx , Ġ 1 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠMatrix 4 f . un project Inv Ray 2 ( ĊĠĠĠĠĠĠĠ Ġmouse X : ĠFloat , ĊĠĠĠĠĠĠĠ ĠmouseY : ĠFloat , ĊĠĠĠĠĠĠĠ Ġwindow X : ĠFloat , Ġwindow Y : ĠFloat , ĊĠĠĠĠĠĠĠ Ġwindow W : ĠFloat , Ġwindow H : ĠFloat , ĊĠĠĠĠĠĠĠ Ġ// Ġorigin Dest : ĠVector 3 f , ĊĠĠĠĠĠĠĠ Ġdst : ĠVector 3 f Ġ= ĠVector 3 f () ĊĠĠĠ Ġ): ĠVector 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn dc X Ġ= Ġ( mouse X Ġ- Ġwindow X ) Ġ/ Ġwindow W Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġn dc Y Ġ= Ġ( mouse Y Ġ- Ġwindow Y ) Ġ/ Ġwindow H Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġpx Ġ= Ġthis . m 0 0 () Ġ* Ġn dc X Ġ+ Ġthis . m 1 0 () Ġ* Ġn dc Y Ġ+ Ġthis . m 3 0 () ĊĠĠĠĠĠĠĠ Ġval Ġpy Ġ= Ġthis . m 0 1 () Ġ* Ġn dc X Ġ+ Ġthis . m 1 1 () Ġ* Ġn dc Y Ġ+ Ġthis . m 3 1 () ĊĠĠĠĠĠĠĠ Ġval Ġpz Ġ= Ġthis . m 0 2 () Ġ* Ġn dc X Ġ+ Ġthis . m 1 2 () Ġ* Ġn dc Y Ġ+ Ġthis . m 3 2 () ĊĠĠĠĠĠĠĠ Ġval Ġpw Ġ= Ġthis . m 0 3 () Ġ* Ġn dc X Ġ+ Ġthis . m 1 3 () Ġ* Ġn dc Y Ġ+ Ġthis . m 3 3 () ĊĠĠĠĠĠĠĠ Ġval Ġpw 1 Ġ= Ġpw Ġ- Ġthis . m 2 3 () ĊĠĠĠĠĠĠĠ Ġval Ġinv Near W Ġ= Ġ 1 . 0 f Ġ/ Ġpw 1 ĊĠĠĠĠĠĠĠ Ġval Ġnear X Ġ= Ġ( px Ġ- Ġthis . m 2 0 ()) Ġ* Ġinv Near W ĊĠĠĠĠĠĠĠ Ġval Ġnear Y Ġ= Ġ( py Ġ- Ġthis . m 2 1 ()) Ġ* Ġinv Near W ĊĠĠĠĠĠĠĠ Ġval Ġnear Z Ġ= Ġ( pz Ġ- Ġthis . m 2 2 ()) Ġ* Ġinv Near W ĊĠĠĠĠĠĠĠ Ġval Ġinv W 0 Ġ= Ġ 1 . 0 f Ġ/ Ġpw ĊĠĠĠĠĠĠĠ Ġval Ġx 0 Ġ= Ġpx Ġ* Ġinv W 0 ĊĠĠĠĠĠĠĠ Ġval Ġy 0 Ġ= Ġpy Ġ* Ġinv W 0 ĊĠĠĠĠĠĠĠ Ġval Ġz 0 Ġ= Ġpz Ġ* Ġinv W 0 ĊĠĠĠĠĠĠĠ Ġ/* origin Dest . x Ġ= Ġnear X ĊĠĠĠĠĠĠĠ Ġorigin Dest . y Ġ= Ġnear Y ĊĠĠĠĠĠĠĠ Ġorigin Dest . z Ġ= Ġnear Z */ ĊĠĠĠĠĠĠĠ Ġdst . x Ġ= Ġx 0 Ġ- Ġnear X ĊĠĠĠĠĠĠĠ Ġdst . y Ġ= Ġy 0 Ġ- Ġnear Y ĊĠĠĠĠĠĠĠ Ġdst . z Ġ= Ġz 0 Ġ- Ġnear Z ĊĠĠĠĠĠĠĠ Ġreturn Ġdst ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . distance Squared ( center : ĠVector 3 d ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġcenter . x Ġ- Ġm 3 0 () ĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġcenter . y Ġ- Ġm 3 1 () ĊĠĠĠĠĠĠĠ Ġval Ġdz Ġ= Ġcenter . z Ġ- Ġm 3 2 () ĊĠĠĠĠĠĠĠ Ġreturn Ġdx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy Ġ+ Ġdz Ġ* Ġdz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . rotate 2 ( q : ĠQuaternion d ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrotate ( J om l Pools . quat 4 f . borrow (). set ( q )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . get Scale Length Squared (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Scale ( J om l Pools . vec 3 d . borrow ()). length Squared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 f . get Scale Length (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Scale ( J om l Pools . vec 3 f . borrow ()). length () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . get Scale Length (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Scale ( J om l Pools . vec 3 d . borrow ()). length () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 f . set 2 ( src : ĠMatrix 4 x 3 d ): ĠMatrix 4 x 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . m 0 0 (). toFloat (), Ġsrc . m 0 1 (). toFloat (), Ġsrc . m 0 2 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . m 1 0 (). toFloat (), Ġsrc . m 1 1 (). toFloat (), Ġsrc . m 1 2 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . m 2 0 (). toFloat (), Ġsrc . m 2 1 (). toFloat (), Ġsrc . m 2 2 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . m 3 0 (). toFloat (), Ġsrc . m 3 1 (). toFloat (), Ġsrc . m 3 2 (). toFloat () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 f . get Scale 2 ( dst : ĠVector 3 d ): ĠVector 3 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdst . set ( get Scale ( J om l Pools . vec 3 f . borrow ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . get Scale 2 ( dst : ĠVector 3 d Ġ= ĠVector 3 d ()): ĠVector 3 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdst . set ( get Scale ( J om l Pools . vec 3 f . borrow ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . get Translation 2 ( dst : ĠVector 3 d Ġ= ĠVector 3 d ()): ĠVector 3 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdst . set ( m 3 0 (). toDouble (), Ġm 3 1 (). toDouble (), Ġm 3 2 (). toDouble ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . set 2 ( other : ĠMatrix 4 x 3 d ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 0 0 (). toFloat (), Ġother . m 0 1 (). toFloat (), Ġother . m 0 2 (). toFloat (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 1 0 (). toFloat (), Ġother . m 1 1 (). toFloat (), Ġother . m 1 2 (). toFloat (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 2 0 (). toFloat (), Ġother . m 2 1 (). toFloat (), Ġother . m 2 2 (). toFloat (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 3 0 (). toFloat (), Ġother . m 3 1 (). toFloat (), Ġother . m 3 2 (). toFloat (), Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . mul 2 ( other : ĠMatrix 4 x 3 d ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmul ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 0 0 (). toFloat (), Ġother . m 0 1 (). toFloat (), Ġother . m 0 2 (). toFloat (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 1 0 (). toFloat (), Ġother . m 1 1 (). toFloat (), Ġother . m 1 2 (). toFloat (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 2 0 (). toFloat (), Ġother . m 2 1 (). toFloat (), Ġother . m 2 2 (). toFloat (), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 3 0 (). toFloat (), Ġother . m 3 1 (). toFloat (), Ġother . m 3 2 (). toFloat (), Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . mul 2 ( other : ĠMatrix 4 d ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmul ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 0 0 (). toFloat (), Ġother . m 0 1 (). toFloat (), Ġother . m 0 2 (). toFloat (), Ġother . m 0 3 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 1 0 (). toFloat (), Ġother . m 1 1 (). toFloat (), Ġother . m 1 2 (). toFloat (), Ġother . m 1 3 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 2 0 (). toFloat (), Ġother . m 2 1 (). toFloat (), Ġother . m 2 2 (). toFloat (), Ġother . m 2 3 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 3 0 (). toFloat (), Ġother . m 3 1 (). toFloat (), Ġother . m 3 2 (). toFloat (), Ġother . m 3 3 (). toFloat () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 d . mirror ( p : ĠVector 3 d , Ġnormal : ĠVector 3 d ): ĠMatrix 4 d Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnx Ġ= Ġnormal . x ĊĠĠĠĠĠĠĠ Ġval Ġny Ġ= Ġnormal . y ĊĠĠĠĠĠĠĠ Ġval Ġnz Ġ= Ġnormal . z ĊĠĠĠĠĠĠĠ Ġval Ġxx Ġ= Ġ- 2 f Ġ* Ġnx Ġ* Ġnx ĊĠĠĠĠĠĠĠ Ġval Ġxy Ġ= Ġ- 2 f Ġ* Ġnx Ġ* Ġny ĊĠĠĠĠĠĠĠ Ġval Ġx z Ġ= Ġ- 2 f Ġ* Ġnx Ġ* Ġnz ĊĠĠĠĠĠĠĠ Ġval Ġyy Ġ= Ġ- 2 f Ġ* Ġny Ġ* Ġny ĊĠĠĠĠĠĠĠ Ġval Ġy z Ġ= Ġ- 2 f Ġ* Ġny Ġ* Ġnz ĊĠĠĠĠĠĠĠ Ġval Ġzz Ġ= Ġ- 2 f Ġ* Ġnz Ġ* Ġnz ĊĠĠĠĠĠĠĠ Ġtranslate ( p ) ĊĠĠĠĠĠĠĠ Ġmul ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 Ġ+ Ġxx , Ġxy , Ġx z , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxy , Ġ 1 . 0 Ġ+ Ġyy , Ġy z , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx z , Ġy z , Ġ 1 . 0 Ġ+ Ġzz , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtranslate (- p . x , Ġ- p . y , Ġ- p . z ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 3 d . mul 2 ( other : ĠMatrix 4 d ): ĠMatrix 3 d Ġ{ ĊĠĠĠĠĠĠĠ Ġmul ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix 3 d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 0 0 (), Ġother . m 0 1 (), Ġother . m 0 2 (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 1 0 (), Ġother . m 1 1 (), Ġother . m 1 2 (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . m 2 0 (), Ġother . m 2 1 (), Ġother . m 2 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . distance Squared ( other : ĠMatrix 4 x 3 d ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsq ( m 3 0 () Ġ- Ġother . m 3 0 (), Ġm 3 1 () Ġ- Ġother . m 3 1 (), Ġm 3 2 () Ġ- Ġother . m 3 2 ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . distance Squared ( other : ĠMatrix 4 x 3 f ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsq ( m 3 0 () Ġ- Ġother . m 3 0 (), Ġm 3 1 () Ġ- Ġother . m 3 1 (), Ġm 3 2 () Ġ- Ġother . m 3 2 ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . distance ( other : ĠMatrix 4 x 3 d ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( distance Squared ( other )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 d . distance ( other : ĠMatrix 4 x 3 f ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( distance Squared ( other )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 x 3 f . sample Distance Squared ( other : ĠMatrix 4 x 3 f ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcompare Ġa Ġfew Ġsample Ġpoints Ġin Ġevery Ġdirection Ġto Ġalso Ġdetect Ġrotation Ġissues ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġmy Ġcase , Ġthe Ġmatrices Ġwere Ġidentical ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform Position ( Vector 3 f ()). distance Squared ( other . transform Position ( Vector 3 f ())) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Position ( Vector 3 f ( 1 f , Ġ 0 f , Ġ 0 f )). distance Squared ( other . transform Position ( Vector 3 f ( 1 f , Ġ 0 f , Ġ 0 f ))) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Position ( Vector 3 f ( 0 f , Ġ 1 f , Ġ 0 f )). distance Squared ( other . transform Position ( Vector 3 f ( 0 f , Ġ 1 f , Ġ 0 f ))) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Position ( Vector 3 f ( 0 f , Ġ 0 f , Ġ 1 f )). distance Squared ( other . transform Position ( Vector 3 f ( 0 f , Ġ 0 f , Ġ 1 f ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMatrix 4 f . sample Distance Squared ( other : ĠMatrix 4 f ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcompare Ġa Ġfew Ġsample Ġpoints Ġin Ġevery Ġdirection Ġto Ġalso Ġdetect Ġrotation Ġissues ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġmy Ġcase , Ġthe Ġmatrices Ġwere Ġidentical ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform Position ( Vector 3 f ()). distance Squared ( other . transform Position ( Vector 3 f ())) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Position ( Vector 3 f ( 1 f , Ġ 0 f , Ġ 0 f )). distance Squared ( other . transform Position ( Vector 3 f ( 1 f , Ġ 0 f , Ġ 0 f ))) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Position ( Vector 3 f ( 0 f , Ġ 1 f , Ġ 0 f )). distance Squared ( other . transform Position ( Vector 3 f ( 0 f , Ġ 1 f , Ġ 0 f ))) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Position ( Vector 3 f ( 0 f , Ġ 0 f , Ġ 1 f )). distance Squared ( other . transform Position ( Vector 3 f ( 0 f , Ġ 0 f , Ġ 1 f ))) ĊĠĠĠ Ġ} Ċ Ċ }