@ file : Jvm Name (" Math Common Kt ") Ċ Ċ package Ġm og ot . math ĊĊ Ċ import Ġkotlin . jvm . Jvm Name Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . math . sqrt Ċ Ċ interface ĠMatrix 4 fc Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ` (- 1 , Ġ- 1 , Ġ- 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġscreen Ġbottom Ġleft ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ NX NY NZ Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ`( 1 , Ġ- 1 , Ġ- 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġscreen Ġbottom Ġright ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ PX NY NZ Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ`( 1 , Ġ 1 , Ġ- 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġscreen Ġtop Ġright ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ PX PY NZ Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ` (- 1 , Ġ 1 , Ġ- 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġscreen Ġtop Ġleft ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ NX PY NZ Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ`( 1 , Ġ- 1 , Ġ 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġprojection Ġbottom Ġright ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ PX N YP Z Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ` (- 1 , Ġ- 1 , Ġ 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġprojection Ġbottom Ġleft ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ NX N YP Z Ġ= Ġ 5 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ` (- 1 , Ġ 1 , Ġ 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġprojection Ġtop Ġleft ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ NX PY P Z Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠArgument Ġto Ġthe Ġfirst Ġparameter Ġof Ġ[ fr ustum Corner ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentifying Ġthe Ġcorner Ġ`( 1 , Ġ 1 , Ġ 1 )` Ġwhen Ġusing Ġthe Ġidentity Ġmatrix . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġprojection Ġtop Ġright ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOR NER _ PX PY P Z Ġ= Ġ 7 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Translation ( dest : ĠVector 3 fm Ġ= ĠVector 3 f ()): ĠVector 3 fm Ġ{ ĊĠĠĠĠĠĠĠ Ġdest . x Ġ= Ġm 3 0 ĊĠĠĠĠĠĠĠ Ġdest . y Ġ= Ġm 3 1 ĊĠĠĠĠĠĠĠ Ġdest . z Ġ= Ġm 3 2 ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġm 0 0 : ĠFloat ĊĠĠĠ Ġval Ġm 0 1 : ĠFloat ĊĠĠĠ Ġval Ġm 0 2 : ĠFloat ĊĠĠĠ Ġval Ġm 0 3 : ĠFloat ĊĠĠĠ Ġval Ġm 1 0 : ĠFloat ĊĠĠĠ Ġval Ġm 1 1 : ĠFloat ĊĠĠĠ Ġval Ġm 1 2 : ĠFloat ĊĠĠĠ Ġval Ġm 1 3 : ĠFloat ĊĠĠĠ Ġval Ġm 2 0 : ĠFloat ĊĠĠĠ Ġval Ġm 2 1 : ĠFloat ĊĠĠĠ Ġval Ġm 2 2 : ĠFloat ĊĠĠĠ Ġval Ġm 2 3 : ĠFloat ĊĠĠĠ Ġval Ġm 3 0 : ĠFloat ĊĠĠĠ Ġval Ġm 3 1 : ĠFloat ĊĠĠĠ Ġval Ġm 3 2 : ĠFloat ĊĠĠĠ Ġval Ġm 3 3 : ĠFloat ĊĊĠĠĠ Ġval Ġproperties : ĠInt ĊĠĠĠ Ġfun Ġtranslate ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest . translation ( x , Ġy , Ġz ) ĊĊĠĠĠĠĠĠĠ Ġdest . set ( this ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 0 0 Ġ* Ġx Ġ+ Ġm 1 0 Ġ* Ġy Ġ+ Ġm 2 0 Ġ* Ġz Ġ+ Ġm 3 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 0 1 Ġ* Ġx Ġ+ Ġm 1 1 Ġ* Ġy Ġ+ Ġm 2 1 Ġ* Ġz Ġ+ Ġm 3 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 0 2 Ġ* Ġx Ġ+ Ġm 1 2 Ġ* Ġy Ġ+ Ġm 2 2 Ġ* Ġz Ġ+ Ġm 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 0 3 Ġ* Ġx Ġ+ Ġm 1 3 Ġ* Ġy Ġ+ Ġm 2 3 Ġ* Ġz Ġ+ Ġm 3 3 ) ĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate ( other : ĠQuaternion fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġdest . set ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest . rotate ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ( vector : ĠVector 3 fc , Ġdest : ĠMatrix 4 f ) Ġ= Ġtranslate ( vector . x , Ġvector . y , Ġvector . z , Ġdest ) ĊĠĠĠ Ġfun Ġscale ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . scaling ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( m 0 0 Ġ* Ġx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( m 0 1 Ġ* Ġx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( m 0 2 Ġ* Ġx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( m 0 3 Ġ* Ġx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( m 1 0 Ġ* Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( m 1 1 Ġ* Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( m 1 2 Ġ* Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( m 1 3 Ġ* Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 2 0 Ġ* Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 2 1 Ġ* Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 2 2 Ġ* Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( m 2 3 Ġ* Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 3 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 3 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Ġ= Ġkotlin . math . abs ( x ) Ġ== Ġ 1 . 0 f Ġ&& Ġkotlin . math . abs ( y ) Ġ== Ġ 1 . 0 f Ġ&& Ġkotlin . math . abs ( z ) Ġ== Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Ġif Ġ( one ) Ġ 0 Ġelse ĠPROPERTY _ OR THON ORMAL ). inv ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġperspective ( fo vy : ĠFloat , Ġaspect : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġz Zero ToOne : ĠBoolean , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġdest . set ( this ) ĊĠĠĠĠĠĠĠ Ġdest . perspective ( fo vy , Ġaspect , Ġz Near , Ġz Far , Ġz Zero ToOne , Ġdest ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġperspective ( fo vy : ĠFloat , Ġaspect : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperspective ( fo vy , Ġaspect , Ġz Near , Ġz Far , Ġfalse , Ġdest ); ĊĊĠĠĠ Ġfun ĠrotateZ ( ang : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsin : ĠFloat Ġ= Ġkotlin . math . sin ( ang ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos : ĠFloat Ġ= Ġcos From Sin ( sin , Ġang ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ== Ġ 0 ) Ġdest . identity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( cos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( sin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ(- sin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( cos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE Ġor ĠPROPERTY _ OR THON ORMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsin Ġ= Ġsin ( ang ) ĊĠĠĠĠĠĠĠ Ġval Ġcos Ġ= Ġcos From Sin ( sin , Ġang ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrotate Tow ards XY ( sin , Ġcos , Ġdest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate Tow ards XY ( dir X : ĠFloat , Ġdir Y : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ== Ġ 0 ) Ġdest . identity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( dir Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( dir X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ(- dir X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( dir Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE Ġor ĠPROPERTY _ OR THON ORMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 0 Ġ= Ġ- dir X ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 0 Ġ= Ġm 0 0 Ġ* Ġdir Y Ġ+ Ġm 1 0 Ġ* Ġdir X ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 1 Ġ= Ġm 0 1 Ġ* Ġdir Y Ġ+ Ġm 1 1 Ġ* Ġdir X ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 2 Ġ= Ġm 0 2 Ġ* Ġdir Y Ġ+ Ġm 1 2 Ġ* Ġdir X ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 3 Ġ= Ġm 0 3 Ġ* Ġdir Y Ġ+ Ġm 1 3 Ġ* Ġdir X ĊĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 1 0 Ġ+ Ġm 1 0 Ġ* Ġdir Y ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 1 0 Ġ+ Ġm 1 1 Ġ* Ġdir Y ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 1 0 Ġ+ Ġm 1 2 Ġ* Ġdir Y ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 1 0 Ġ+ Ġm 1 3 Ġ* Ġdir Y ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 2 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 2 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( m 2 3 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 3 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 3 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 3 3 ) ĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġor tho 2 D ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . set Or tho 2 D ( left , Ġright , Ġbottom , Ġtop ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġor tho 2 D Generic ( left , Ġright , Ġbottom , Ġtop , Ġdest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġor tho 3 D ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f { ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . set Or tho 3 D ( left , Ġright , Ġbottom , Ġtop , z Near , z Far ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġor tho 3 D Generic ( left , Ġright , Ġbottom , Ġtop , z Near , z Far , Ġdest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmul ( right : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest . set ( right ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right . properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest . set ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ TRANSL ATION Ġ!= Ġ 0 Ġ&& Ġright . properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmul Translation Affine ( right , Ġdest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 Ġ&& Ġright . properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmul Affine ( right , Ġdest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ PER S PECT IVE Ġ!= Ġ 0 Ġ&& Ġright . properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmul Perspective Affine ( right , Ġdest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right . properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmul Affine R ( right , Ġdest ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmul Generic ( right , Ġdest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinvert ( dest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest . identity () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( properties Ġand ĠPROPERTY _ TRANSL ATION Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvert Translation ( dest ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ OR THON ORMAL Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvert Or thon ormal ( dest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvert Affine ( dest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ PER S PECT IVE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvert Perspective ( dest ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinvert Generic ( dest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Scale ( dest : ĠVector 3 fm ): ĠVector 3 fm Ġ{ ĊĠĠĠĠĠĠĠ Ġdest . x Ġ= Ġsqrt ( m 0 0 Ġ* Ġm 0 0 Ġ+ Ġm 0 1 Ġ* Ġm 0 1 Ġ+ Ġ( m 0 2 Ġ* Ġm 0 2 )) ĊĠĠĠĠĠĠĠ Ġdest . y Ġ= Ġsqrt ( m 1 0 Ġ* Ġm 1 0 Ġ+ Ġm 1 1 Ġ* Ġm 1 1 Ġ+ Ġ( m 1 2 Ġ* Ġm 1 2 )) ĊĠĠĠĠĠĠĠ Ġdest . z Ġ= Ġsqrt ( m 2 0 Ġ* Ġm 2 0 Ġ+ Ġm 2 1 Ġ* Ġm 2 1 Ġ+ Ġ( m 2 2 Ġ* Ġm 2 2 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . invert Generic ( dest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġa Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġb Ġ= Ġm 0 0 Ġ* Ġm 1 2 Ġ- Ġm 0 2 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġc Ġ= Ġm 0 0 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġd Ġ= Ġm 0 1 Ġ* Ġm 1 2 Ġ- Ġm 0 2 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġe Ġ= Ġm 0 1 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġf Ġ= Ġm 0 2 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 2 ĊĠĠĠ Ġval Ġg Ġ= Ġm 2 0 Ġ* Ġm 3 1 Ġ- Ġm 2 1 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġh Ġ= Ġm 2 0 Ġ* Ġm 3 2 Ġ- Ġm 2 2 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġi Ġ= Ġm 2 0 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġj Ġ= Ġm 2 1 Ġ* Ġm 3 2 Ġ- Ġm 2 2 Ġ* Ġm 3 1 ĊĠĠĠ Ġval Ġk Ġ= Ġm 2 1 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 1 ĊĠĠĠ Ġval Ġl Ġ= Ġm 2 2 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 2 ĊĠĠĠ Ġvar Ġdet Ġ= Ġa Ġ* Ġl Ġ- Ġb Ġ* Ġk Ġ+ Ġc Ġ* Ġj Ġ+ Ġd Ġ* Ġi Ġ- Ġe Ġ* Ġh Ġ+ Ġf Ġ* Ġg ĊĠĠĠ Ġdet Ġ= Ġ 1 . 0 f Ġ/ Ġdet ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= ĠMath . f ma ( m 1 1 , Ġl , ĠMath . f ma (- m 1 2 , Ġk , Ġm 1 3 Ġ* Ġj )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= ĠMath . f ma (- m 0 1 , Ġl , ĠMath . f ma ( m 0 2 , Ġk , Ġ- m 0 3 Ġ* Ġj )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= ĠMath . f ma ( m 3 1 , Ġf , ĠMath . f ma (- m 3 2 , Ġe , Ġm 3 3 Ġ* Ġd )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 0 3 : ĠFloat Ġ= ĠMath . f ma (- m 2 1 , Ġf , ĠMath . f ma ( m 2 2 , Ġe , Ġ- m 2 3 Ġ* Ġd )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= ĠMath . f ma (- m 1 0 , Ġl , ĠMath . f ma ( m 1 2 , Ġi , Ġ- m 1 3 Ġ* Ġh )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= ĠMath . f ma ( m 0 0 , Ġl , ĠMath . f ma (- m 0 2 , Ġi , Ġm 0 3 Ġ* Ġh )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= ĠMath . f ma (- m 3 0 , Ġf , ĠMath . f ma ( m 3 2 , Ġc , Ġ- m 3 3 Ġ* Ġb )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 1 3 : ĠFloat Ġ= ĠMath . f ma ( m 2 0 , Ġf , ĠMath . f ma (- m 2 2 , Ġc , Ġm 2 3 Ġ* Ġb )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat Ġ= ĠMath . f ma ( m 1 0 , Ġk , ĠMath . f ma (- m 1 1 , Ġi , Ġm 1 3 Ġ* Ġg )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat Ġ= ĠMath . f ma (- m 0 0 , Ġk , ĠMath . f ma ( m 0 1 , Ġi , Ġ- m 0 3 Ġ* Ġg )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat Ġ= ĠMath . f ma ( m 3 0 , Ġe , ĠMath . f ma (- m 3 1 , Ġc , Ġm 3 3 Ġ* Ġa )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 2 3 : ĠFloat Ġ= ĠMath . f ma (- m 2 0 , Ġe , ĠMath . f ma ( m 2 1 , Ġc , Ġ- m 2 3 Ġ* Ġa )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= ĠMath . f ma (- m 1 0 , Ġj , ĠMath . f ma ( m 1 1 , Ġh , Ġ- m 1 2 Ġ* Ġg )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= ĠMath . f ma ( m 0 0 , Ġj , ĠMath . f ma (- m 0 1 , Ġh , Ġm 0 2 Ġ* Ġg )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= ĠMath . f ma (- m 3 0 , Ġd , ĠMath . f ma ( m 3 1 , Ġb , Ġ- m 3 2 Ġ* Ġa )) Ġ* Ġdet ĊĠĠĠ Ġval Ġnm 3 3 : ĠFloat Ġ= ĠMath . f ma ( m 2 0 , Ġd , ĠMath . f ma (- m 2 1 , Ġb , Ġm 2 2 Ġ* Ġa )) Ġ* Ġdet ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġnm 0 0 ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġnm 0 1 ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġnm 0 2 ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġnm 0 3 ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġnm 1 0 ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġnm 1 1 ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġnm 1 2 ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġnm 1 3 ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġnm 2 0 ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġnm 2 1 ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġnm 2 2 ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġnm 2 3 ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġnm 3 0 ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġnm 3 1 ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġnm 3 2 ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġnm 3 3 ĊĠĠĠ Ġdest . properties Ġ= Ġ 0 ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . invert Perspective ( dest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġa : ĠFloat Ġ= Ġ 1 . 0 f Ġ/ Ġ( m 0 0 Ġ* Ġm 1 1 ) ĊĠĠĠ Ġval Ġl : ĠFloat Ġ= Ġ- 1 . 0 f Ġ/ Ġ( m 2 3 Ġ* Ġm 3 2 ) ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġm 1 1 Ġ* Ġa ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġm 0 0 Ġ* Ġa ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ- m 2 3 Ġ* Ġl ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ 0 f ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ- m 3 2 Ġ* Ġl ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġm 2 2 Ġ* Ġl ĊĠĠĠ Ġdest . properties Ġ= Ġ( 0 ) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . invert Perspective View ( view : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġa : ĠFloat Ġ= Ġ 1 . 0 f Ġ/ Ġ( m 0 0 Ġ* Ġm 1 1 ) ĊĠĠĠ Ġval Ġl : ĠFloat Ġ= Ġ- 1 . 0 f Ġ/ Ġ( m 2 3 Ġ* Ġm 3 2 ) ĊĠĠĠ Ġval Ġpm 0 0 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġa ĊĠĠĠ Ġval Ġpm 1 1 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġa ĊĠĠĠ Ġval Ġpm 2 3 : ĠFloat Ġ= Ġ- m 2 3 Ġ* Ġl ĊĠĠĠ Ġval Ġpm 3 2 : ĠFloat Ġ= Ġ- m 3 2 Ġ* Ġl ĊĠĠĠ Ġval Ġpm 3 3 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġl ĊĠĠĠ Ġval Ġvm 3 0 : ĠFloat Ġ= Ġ- view . m 0 0 Ġ* Ġview . m 3 0 Ġ- Ġview . m 0 1 Ġ* Ġview . m 3 1 Ġ- Ġview . m 0 2 Ġ* Ġview . m 3 2 ĊĠĠĠ Ġval Ġvm 3 1 : ĠFloat Ġ= Ġ- view . m 1 0 Ġ* Ġview . m 3 0 Ġ- Ġview . m 1 1 Ġ* Ġview . m 3 1 Ġ- Ġview . m 1 2 Ġ* Ġview . m 3 2 ĊĠĠĠ Ġval Ġvm 3 2 : ĠFloat Ġ= Ġ- view . m 2 0 Ġ* Ġview . m 3 0 Ġ- Ġview . m 2 1 Ġ* Ġview . m 3 1 Ġ- Ġview . m 2 2 Ġ* Ġview . m 3 2 ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= Ġview . m 0 0 Ġ* Ġpm 0 0 ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= Ġview . m 1 0 Ġ* Ġpm 0 0 ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= Ġview . m 2 0 Ġ* Ġpm 0 0 ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= Ġview . m 0 1 Ġ* Ġpm 1 1 ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= Ġview . m 1 1 Ġ* Ġpm 1 1 ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= Ġview . m 2 1 Ġ* Ġpm 1 1 ĊĠĠĠ Ġval Ġnm 2 0 Ġ= Ġvm 3 0 Ġ* Ġpm 2 3 ĊĠĠĠ Ġval Ġnm 2 1 Ġ= Ġvm 3 1 Ġ* Ġpm 2 3 ĊĠĠĠ Ġval Ġnm 2 2 Ġ= Ġvm 3 2 Ġ* Ġpm 2 3 ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= Ġview . m 0 2 Ġ* Ġpm 3 2 Ġ+ Ġvm 3 0 Ġ* Ġpm 3 3 ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= Ġview . m 1 2 Ġ* Ġpm 3 2 Ġ+ Ġvm 3 1 Ġ* Ġpm 3 3 ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= Ġview . m 2 2 Ġ* Ġpm 3 2 Ġ+ Ġvm 3 2 Ġ* Ġpm 3 3 ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġnm 0 0 ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġnm 0 1 ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġnm 0 2 ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġnm 1 0 ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġnm 1 1 ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġnm 1 2 ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġnm 2 0 ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġnm 2 1 ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġnm 2 2 ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġpm 2 3 ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġnm 3 0 ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġnm 3 1 ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġnm 3 2 ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġpm 3 3 ĊĠĠĠ Ġdest . properties Ġ= Ġ 0 ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . invert Affine ( dest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġm 1 1 m 0 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġm 1 0 m 0 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġm 1 0 m 0 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġm 1 2 m 0 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġm 1 2 ĊĠĠĠ Ġval Ġm 1 2 m 0 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġm 1 2 ĊĠĠĠ Ġval Ġm 1 1 m 0 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġdet : ĠFloat Ġ= Ġ( m 1 1 m 0 0 Ġ- Ġm 1 0 m 0 1 ) Ġ* Ġm 2 2 Ġ+ Ġ( m 1 0 m 0 2 Ġ- Ġm 1 2 m 0 0 ) Ġ* Ġm 2 1 Ġ+ Ġ( m 1 2 m 0 1 Ġ- Ġm 1 1 m 0 2 ) Ġ* Ġm 2 0 ĊĠĠĠ Ġval Ġs Ġ= Ġ 1 . 0 f Ġ/ Ġdet ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat ĊĠĠĠ Ġval Ġm 1 0 m 2 2 : ĠFloat Ġ= Ġm 1 0 Ġ* Ġm 2 2 ĊĠĠĠ Ġval Ġm 1 0 m 2 1 : ĠFloat Ġ= Ġm 1 0 Ġ* Ġm 2 1 ĊĠĠĠ Ġval Ġm 1 1 m 2 2 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġm 2 2 ĊĠĠĠ Ġval Ġm 1 1 m 2 0 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġm 2 0 ĊĠĠĠ Ġval Ġm 1 2 m 2 1 : ĠFloat Ġ= Ġm 1 2 Ġ* Ġm 2 1 ĊĠĠĠ Ġval Ġm 1 2 m 2 0 : ĠFloat Ġ= Ġm 1 2 Ġ* Ġm 2 0 ĊĠĠĠ Ġval Ġm 2 0 m 0 2 : ĠFloat Ġ= Ġm 2 0 Ġ* Ġm 0 2 ĊĠĠĠ Ġval Ġm 2 0 m 0 1 : ĠFloat Ġ= Ġm 2 0 Ġ* Ġm 0 1 ĊĠĠĠ Ġval Ġm 2 1 m 0 2 : ĠFloat Ġ= Ġm 2 1 Ġ* Ġm 0 2 ĊĠĠĠ Ġval Ġm 2 1 m 0 0 : ĠFloat Ġ= Ġm 2 1 Ġ* Ġm 0 0 ĊĠĠĠ Ġval Ġm 2 2 m 0 1 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġm 0 1 ĊĠĠĠ Ġval Ġm 2 2 m 0 0 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġm 0 0 ĊĠĠĠ Ġnm 0 0 Ġ= Ġ( m 1 1 m 2 2 Ġ- Ġm 1 2 m 2 1 ) Ġ* Ġs ĊĠĠĠ Ġnm 0 1 Ġ= Ġ( m 2 1 m 0 2 Ġ- Ġm 2 2 m 0 1 ) Ġ* Ġs ĊĠĠĠ Ġnm 0 2 Ġ= Ġ( m 1 2 m 0 1 Ġ- Ġm 1 1 m 0 2 ) Ġ* Ġs ĊĠĠĠ Ġnm 1 0 Ġ= Ġ( m 1 2 m 2 0 Ġ- Ġm 1 0 m 2 2 ) Ġ* Ġs ĊĠĠĠ Ġnm 1 1 Ġ= Ġ( m 2 2 m 0 0 Ġ- Ġm 2 0 m 0 2 ) Ġ* Ġs ĊĠĠĠ Ġnm 1 2 Ġ= Ġ( m 1 0 m 0 2 Ġ- Ġm 1 2 m 0 0 ) Ġ* Ġs ĊĠĠĠ Ġnm 2 0 Ġ= Ġ( m 1 0 m 2 1 Ġ- Ġm 1 1 m 2 0 ) Ġ* Ġs ĊĠĠĠ Ġnm 2 1 Ġ= Ġ( m 2 0 m 0 1 Ġ- Ġm 2 1 m 0 0 ) Ġ* Ġs ĊĠĠĠ Ġnm 2 2 Ġ= Ġ( m 1 1 m 0 0 Ġ- Ġm 1 0 m 0 1 ) Ġ* Ġs ĊĠĠĠ Ġnm 3 0 Ġ= Ġ( m 1 0 m 2 2 Ġ* Ġm 3 1 Ġ- Ġm 1 0 m 2 1 Ġ* Ġm 3 2 Ġ+ Ġm 1 1 m 2 0 Ġ* Ġm 3 2 Ġ- Ġm 1 1 m 2 2 Ġ* Ġm 3 0 Ġ+ Ġm 1 2 m 2 1 Ġ* Ġm 3 0 Ġ- Ġm 1 2 m 2 0 Ġ* Ġm 3 1 ) Ġ* Ġs ĊĠĠĠ Ġnm 3 1 Ġ= Ġ( m 2 0 m 0 2 Ġ* Ġm 3 1 Ġ- Ġm 2 0 m 0 1 Ġ* Ġm 3 2 Ġ+ Ġm 2 1 m 0 0 Ġ* Ġm 3 2 Ġ- Ġm 2 1 m 0 2 Ġ* Ġm 3 0 Ġ+ Ġm 2 2 m 0 1 Ġ* Ġm 3 0 Ġ- Ġm 2 2 m 0 0 Ġ* Ġm 3 1 ) Ġ* Ġs ĊĠĠĠ Ġnm 3 2 Ġ= Ġ( m 1 1 m 0 2 Ġ* Ġm 3 0 Ġ- Ġm 1 2 m 0 1 Ġ* Ġm 3 0 Ġ+ Ġm 1 2 m 0 0 Ġ* Ġm 3 1 Ġ- Ġm 1 0 m 0 2 Ġ* Ġm 3 1 Ġ+ Ġm 1 0 m 0 1 Ġ* Ġm 3 2 Ġ- Ġm 1 1 m 0 0 Ġ* Ġm 3 2 ) Ġ* Ġs ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( 1 . 0 f ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE . toInt ()) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . invert Or thon ormal ( dest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= Ġ-( m 0 0 Ġ* Ġm 3 0 Ġ+ Ġm 0 1 Ġ* Ġm 3 1 Ġ+ Ġm 0 2 Ġ* Ġm 3 2 ) ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= Ġ-( m 1 0 Ġ* Ġm 3 0 Ġ+ Ġm 1 1 Ġ* Ġm 3 1 Ġ+ Ġm 1 2 Ġ* Ġm 3 2 ) ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= Ġ-( m 2 0 Ġ* Ġm 3 0 Ġ+ Ġm 2 1 Ġ* Ġm 3 1 Ġ+ Ġm 2 2 Ġ* Ġm 3 2 ) ĊĠĠĠ Ġval Ġm 0 1 : ĠFloat Ġ= Ġthis . m 0 1 ĊĠĠĠ Ġval Ġm 0 2 : ĠFloat Ġ= Ġthis . m 0 2 ĊĠĠĠ Ġval Ġm 1 2 : ĠFloat Ġ= Ġthis . m 1 2 ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( m 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( m 1 0 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( m 2 0 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( m 0 1 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( m 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( m 2 1 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 0 2 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 1 2 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( 1 . 0 f ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE Ġor ĠPROPERTY _ OR THON ORMAL ) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . invert Translation ( dest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġif Ġ( dest Ġ!== Ġthis ) ĊĠĠĠĠĠĠĠ Ġdest . set ( this ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ- m 3 0 ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ- m 3 1 ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ- m 3 2 ĊĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . mul Generic ( right : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= ĠMath . f ma ( m 0 0 , Ġright . m 0 0 , ĠMath . f ma ( m 1 0 , Ġright . m 0 1 , ĠMath . f ma ( m 2 0 , Ġright . m 0 2 , Ġm 3 0 Ġ* Ġright . m 0 3 ))) ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= ĠMath . f ma ( m 0 1 , Ġright . m 0 0 , ĠMath . f ma ( m 1 1 , Ġright . m 0 1 , ĠMath . f ma ( m 2 1 , Ġright . m 0 2 , Ġm 3 1 Ġ* Ġright . m 0 3 ))) ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= ĠMath . f ma ( m 0 2 , Ġright . m 0 0 , ĠMath . f ma ( m 1 2 , Ġright . m 0 1 , ĠMath . f ma ( m 2 2 , Ġright . m 0 2 , Ġm 3 2 Ġ* Ġright . m 0 3 ))) ĊĠĠĠ Ġval Ġnm 0 3 : ĠFloat Ġ= ĠMath . f ma ( m 0 3 , Ġright . m 0 0 , ĠMath . f ma ( m 1 3 , Ġright . m 0 1 , ĠMath . f ma ( m 2 3 , Ġright . m 0 2 , Ġm 3 3 Ġ* Ġright . m 0 3 ))) ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= ĠMath . f ma ( m 0 0 , Ġright . m 1 0 , ĠMath . f ma ( m 1 0 , Ġright . m 1 1 , ĠMath . f ma ( m 2 0 , Ġright . m 1 2 , Ġm 3 0 Ġ* Ġright . m 1 3 ))) ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= ĠMath . f ma ( m 0 1 , Ġright . m 1 0 , ĠMath . f ma ( m 1 1 , Ġright . m 1 1 , ĠMath . f ma ( m 2 1 , Ġright . m 1 2 , Ġm 3 1 Ġ* Ġright . m 1 3 ))) ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= ĠMath . f ma ( m 0 2 , Ġright . m 1 0 , ĠMath . f ma ( m 1 2 , Ġright . m 1 1 , ĠMath . f ma ( m 2 2 , Ġright . m 1 2 , Ġm 3 2 Ġ* Ġright . m 1 3 ))) ĊĠĠĠ Ġval Ġnm 1 3 : ĠFloat Ġ= ĠMath . f ma ( m 0 3 , Ġright . m 1 0 , ĠMath . f ma ( m 1 3 , Ġright . m 1 1 , ĠMath . f ma ( m 2 3 , Ġright . m 1 2 , Ġm 3 3 Ġ* Ġright . m 1 3 ))) ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat Ġ= ĠMath . f ma ( m 0 0 , Ġright . m 2 0 , ĠMath . f ma ( m 1 0 , Ġright . m 2 1 , ĠMath . f ma ( m 2 0 , Ġright . m 2 2 , Ġm 3 0 Ġ* Ġright . m 2 3 ))) ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat Ġ= ĠMath . f ma ( m 0 1 , Ġright . m 2 0 , ĠMath . f ma ( m 1 1 , Ġright . m 2 1 , ĠMath . f ma ( m 2 1 , Ġright . m 2 2 , Ġm 3 1 Ġ* Ġright . m 2 3 ))) ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat Ġ= ĠMath . f ma ( m 0 2 , Ġright . m 2 0 , ĠMath . f ma ( m 1 2 , Ġright . m 2 1 , ĠMath . f ma ( m 2 2 , Ġright . m 2 2 , Ġm 3 2 Ġ* Ġright . m 2 3 ))) ĊĠĠĠ Ġval Ġnm 2 3 : ĠFloat Ġ= ĠMath . f ma ( m 0 3 , Ġright . m 2 0 , ĠMath . f ma ( m 1 3 , Ġright . m 2 1 , ĠMath . f ma ( m 2 3 , Ġright . m 2 2 , Ġm 3 3 Ġ* Ġright . m 2 3 ))) ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= ĠMath . f ma ( m 0 0 , Ġright . m 3 0 , ĠMath . f ma ( m 1 0 , Ġright . m 3 1 , ĠMath . f ma ( m 2 0 , Ġright . m 3 2 , Ġm 3 0 Ġ* Ġright . m 3 3 ))) ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= ĠMath . f ma ( m 0 1 , Ġright . m 3 0 , ĠMath . f ma ( m 1 1 , Ġright . m 3 1 , ĠMath . f ma ( m 2 1 , Ġright . m 3 2 , Ġm 3 1 Ġ* Ġright . m 3 3 ))) ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= ĠMath . f ma ( m 0 2 , Ġright . m 3 0 , ĠMath . f ma ( m 1 2 , Ġright . m 3 1 , ĠMath . f ma ( m 2 2 , Ġright . m 3 2 , Ġm 3 2 Ġ* Ġright . m 3 3 ))) ĊĠĠĠ Ġval Ġnm 3 3 : ĠFloat Ġ= ĠMath . f ma ( m 0 3 , Ġright . m 3 0 , ĠMath . f ma ( m 1 3 , Ġright . m 3 1 , ĠMath . f ma ( m 2 3 , Ġright . m 3 2 , Ġm 3 3 Ġ* Ġright . m 3 3 ))) ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( nm 1 3 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( nm 2 3 ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( nm 3 3 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( 0 ) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ fun ĠMatrix 4 fc . mul Affine R ( right : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 3 : ĠFloat Ġ= Ġm 0 3 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 3 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 3 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 3 : ĠFloat Ġ= Ġm 0 3 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 3 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 3 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 3 : ĠFloat Ġ= Ġm 0 3 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 3 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 3 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 0 ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 1 ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 2 ĊĠĠĠ Ġval Ġnm 3 3 : ĠFloat Ġ= Ġm 0 3 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 3 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 3 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 3 ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( nm 1 3 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( nm 2 3 ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( nm 3 3 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ IDENTITY Ġor ĠPROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ). inv ()) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ fun ĠMatrix 4 fc . mul Perspective Affine ( view : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġview . m 0 0 ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġview . m 0 1 ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġview . m 0 2 ĊĠĠĠ Ġval Ġnm 0 3 : ĠFloat Ġ= Ġm 2 3 Ġ* Ġview . m 0 2 ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġview . m 1 0 ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġview . m 1 1 ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġview . m 1 2 ĊĠĠĠ Ġval Ġnm 1 3 : ĠFloat Ġ= Ġm 2 3 Ġ* Ġview . m 1 2 ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġview . m 2 0 ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġview . m 2 1 ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġview . m 2 2 ĊĠĠĠ Ġval Ġnm 2 3 : ĠFloat Ġ= Ġm 2 3 Ġ* Ġview . m 2 2 ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġview . m 3 0 ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= Ġm 1 1 Ġ* Ġview . m 3 1 ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= Ġm 2 2 Ġ* Ġview . m 3 2 Ġ+ Ġm 3 2 ĊĠĠĠ Ġval Ġnm 3 3 : ĠFloat Ġ= Ġm 2 3 Ġ* Ġview . m 3 2 ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( nm 1 3 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( nm 2 3 ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( nm 3 3 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( 0 ) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . mul Affine ( right : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 0 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 0 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 3 : ĠFloat Ġ= Ġm 0 3 ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 1 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 1 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 3 : ĠFloat Ġ= Ġm 1 3 ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 2 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 2 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 3 : ĠFloat Ġ= Ġm 2 3 ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= Ġm 0 0 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 0 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 0 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 0 ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= Ġm 0 1 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 1 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 1 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 1 ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= Ġm 0 2 Ġ* Ġright . m 3 0 Ġ+ Ġm 1 2 Ġ* Ġright . m 3 1 Ġ+ Ġm 2 2 Ġ* Ġright . m 3 2 Ġ+ Ġm 3 2 ĊĠĠĠ Ġval Ġnm 3 3 : ĠFloat Ġ= Ġm 3 3 ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( nm 1 3 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( nm 2 3 ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( nm 3 3 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE Ġor Ġ( this . properties Ġand Ġright . properties Ġand ĠPROPERTY _ OR THON ORMAL )) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . mul Translation Affine ( right : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġnm 0 0 : ĠFloat Ġ= Ġright . m 0 0 ĊĠĠĠ Ġval Ġnm 0 1 : ĠFloat Ġ= Ġright . m 0 1 ĊĠĠĠ Ġval Ġnm 0 2 : ĠFloat Ġ= Ġright . m 0 2 ĊĠĠĠ Ġval Ġnm 0 3 : ĠFloat Ġ= Ġm 0 3 ĊĠĠĠ Ġval Ġnm 1 0 : ĠFloat Ġ= Ġright . m 1 0 ĊĠĠĠ Ġval Ġnm 1 1 : ĠFloat Ġ= Ġright . m 1 1 ĊĠĠĠ Ġval Ġnm 1 2 : ĠFloat Ġ= Ġright . m 1 2 ĊĠĠĠ Ġval Ġnm 1 3 : ĠFloat Ġ= Ġm 1 3 ĊĠĠĠ Ġval Ġnm 2 0 : ĠFloat Ġ= Ġright . m 2 0 ĊĠĠĠ Ġval Ġnm 2 1 : ĠFloat Ġ= Ġright . m 2 1 ĊĠĠĠ Ġval Ġnm 2 2 : ĠFloat Ġ= Ġright . m 2 2 ĊĠĠĠ Ġval Ġnm 2 3 : ĠFloat Ġ= Ġm 2 3 ĊĠĠĠ Ġval Ġnm 3 0 : ĠFloat Ġ= Ġright . m 3 0 Ġ+ Ġm 3 0 ĊĠĠĠ Ġval Ġnm 3 1 : ĠFloat Ġ= Ġright . m 3 1 Ġ+ Ġm 3 1 ĊĠĠĠ Ġval Ġnm 3 2 : ĠFloat Ġ= Ġright . m 3 2 Ġ+ Ġm 3 2 ĊĠĠĠ Ġval Ġnm 3 3 : ĠFloat Ġ= Ġm 3 3 ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( nm 1 3 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( nm 2 3 ) ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( nm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( nm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( nm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( nm 3 3 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( PROPERTY _ AFF INE Ġor Ġ( right . properties Ġand ĠPROPERTY _ OR THON ORMAL )) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . orth o 2 D Generic ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ Ġ// Ġcalculate Ġright Ġmatrix Ġelements ĊĠĠĠ Ġval Ġrm 0 0 Ġ= Ġ 2 . 0 f Ġ/ Ġ( right Ġ- Ġleft ) ĊĠĠĠ Ġval Ġrm 1 1 Ġ= Ġ 2 . 0 f Ġ/ Ġ( top Ġ- Ġbottom ) ĊĠĠĠ Ġval Ġrm 3 0 Ġ= Ġ( right Ġ+ Ġleft ) Ġ/ Ġ( left Ġ- Ġright ) ĊĠĠĠ Ġval Ġrm 3 1 Ġ= Ġ( top Ġ+ Ġbottom ) Ġ/ Ġ( bottom Ġ- Ġtop ) ĊĠĠĠ Ġ// Ġperform Ġoptimized Ġmultiplication Ċ // Ġcompute Ġthe Ġlast Ġcolumn Ġfirst , Ġbecause Ġother Ġcolumns Ġdo Ġnot Ġdepend Ġon Ġit ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 3 0 Ġ+ Ġm 1 0 Ġ* Ġrm 3 1 Ġ+ Ġm 3 0 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 3 0 Ġ+ Ġm 1 1 Ġ* Ġrm 3 1 Ġ+ Ġm 3 1 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 3 0 Ġ+ Ġm 1 2 Ġ* Ġrm 3 1 Ġ+ Ġm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 3 0 Ġ+ Ġm 1 3 Ġ* Ġrm 3 1 Ġ+ Ġm 3 3 ) ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( m 1 0 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( m 1 1 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( m 1 2 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( m 1 3 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ(- m 2 0 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ(- m 2 1 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ(- m 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ(- m 2 3 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ). inv ()) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ private Ġfun ĠMatrix 4 fc . orth o 3 D Generic ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f { ĊĠĠĠ Ġval Ġrm 0 0 Ġ= Ġ 2 . 0 f Ġ/ Ġ( right Ġ- Ġleft ) ĊĠĠĠ Ġval Ġrm 1 1 Ġ= Ġ 1 . 0 f Ġ/ Ġ( top Ġ- Ġbottom ) ĊĠĠĠ Ġval Ġrm 2 2 Ġ= Ġ- 2 . 0 f Ġ/ Ġ( z Far Ġ- Ġz Near ) ĊĠĠĠ Ġval Ġrm 3 0 Ġ= Ġ( right Ġ+ Ġleft ) Ġ/ Ġ( left Ġ- Ġright ) ĊĠĠĠ Ġval Ġrm 3 1 Ġ= Ġ( top Ġ+ Ġbottom ) Ġ/ Ġ( bottom Ġ- Ġtop ) ĊĠĠĠ Ġval Ġrm 3 2 Ġ= Ġ( z Far Ġ+ Ġz Near ) Ġ/ Ġ( z Near Ġ- Ġz Far ) ĊĠĠĠ Ġ// Ġperform Ġoptimized Ġmultiplication Ċ // Ġcompute Ġthe Ġlast Ġcolumn Ġfirst , Ġbecause Ġother Ġcolumns Ġdo Ġnot Ġdepend Ġon Ġit ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 3 0 Ġ+ Ġm 1 0 Ġ* Ġrm 3 1 Ġ+ Ġm 3 0 Ġ* Ġrm 3 2 ) ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 3 0 Ġ+ Ġm 1 1 Ġ* Ġrm 3 1 Ġ+ Ġm 3 1 Ġ* Ġrm 3 2 ) ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 3 0 Ġ+ Ġm 1 2 Ġ* Ġrm 3 1 Ġ+ Ġm 3 2 Ġ* Ġrm 3 2 ) ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 3 0 Ġ+ Ġm 1 3 Ġ* Ġrm 3 1 Ġ+ Ġm 3 3 Ġ* Ġrm 3 2 ) ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 0 0 ) ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġ( m 1 0 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġ( m 1 1 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġ( m 1 2 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġ( m 1 3 Ġ* Ġrm 1 1 ) ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 2 0 Ġ* Ġrm 2 2 ) ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 2 1 Ġ* Ġrm 2 2 ) ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 2 2 Ġ* Ġrm 2 2 ) ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġ( m 2 3 Ġ* Ġrm 2 2 ) ĊĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ). inv ()) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ var ĠPROPERTY _ IDENTITY Ġ= Ġ 1 Ġshl Ġ 2 Ċ var ĠPROPERTY _ AFF INE Ġ= Ġ 1 Ġshl Ġ 1 Ċ var ĠPROPERTY _ TRANSL ATION Ġ= Ġ 1 Ġshl Ġ 3 Ċ var ĠPROPERTY _ OR THON ORMAL Ġ= Ġ 1 Ġshl Ġ 4 Ċ var ĠPROPERTY _ PER S PECT IVE Ġ= Ġ 1 Ġshl Ġ 0 Ċ Ċ class ĠMatrix 4 f Ġ: ĠMatrix 4 fc Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġproperties Ġ= ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ AFF INE Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ĊĠĠĠ Ġ// internal Ġval Ġdata Ġ= ĠFloat 3 2 Array ( 1 6 ) ĊĠĠĠ Ġoverride Ġvar Ġm 0 0 Ġ= Ġ 1 f ĊĠĠĠ Ġoverride Ġvar Ġm 0 1 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 0 2 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 0 3 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 1 0 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 1 1 Ġ= Ġ 1 f ĊĠĠĠ Ġoverride Ġvar Ġm 1 2 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 1 3 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 2 0 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 2 1 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 2 2 Ġ= Ġ 1 f ĊĠĠĠ Ġoverride Ġvar Ġm 2 3 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 3 0 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 3 1 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 3 2 Ġ= Ġ 0 f ĊĠĠĠ Ġoverride Ġvar Ġm 3 3 Ġ= Ġ 1 f ĊĊĠĠĠ Ġconstructor () ĊĠĠĠ Ġconstructor ( other : ĠMatrix 4 fc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġother . m 0 0 ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġother . m 0 1 ĊĠĠĠĠĠĠĠ Ġm 0 2 Ġ= Ġother . m 0 2 ĊĠĠĠĠĠĠĠ Ġm 0 3 Ġ= Ġother . m 0 3 ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġother . m 1 0 ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġother . m 1 1 ĊĠĠĠĠĠĠĠ Ġm 1 2 Ġ= Ġother . m 1 2 ĊĠĠĠĠĠĠĠ Ġm 1 3 Ġ= Ġother . m 1 3 ĊĠĠĠĠĠĠĠ Ġm 2 0 Ġ= Ġother . m 2 0 ĊĠĠĠĠĠĠĠ Ġm 2 1 Ġ= Ġother . m 2 1 ĊĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġother . m 2 2 ĊĠĠĠĠĠĠĠ Ġm 2 3 Ġ= Ġother . m 2 3 ĊĠĠĠĠĠĠĠ Ġm 3 0 Ġ= Ġother . m 3 0 ĊĠĠĠĠĠĠĠ Ġm 3 1 Ġ= Ġother . m 3 1 ĊĠĠĠĠĠĠĠ Ġm 3 2 Ġ= Ġother . m 3 2 ĊĠĠĠĠĠĠĠ Ġm 3 3 Ġ= Ġother . m 3 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinvert (): ĠMatrix 4 f Ġ= Ġinvert ( this ) ĊĊĠĠĠ Ġfun ĠrotateZ ( ang : ĠFloat ): ĠMatrix 4 f Ġ= ĠrotateZ ( ang , Ġthis ) ĊĊĠĠĠ Ġfun Ġor tho 2 D ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat ): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġor tho 2 D ( left , Ġright , Ġbottom , Ġtop , Ġthis ) ĊĠĠĠ Ġfun Ġor tho 3 D ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat ): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġor tho 3 D ( left , Ġright , Ġbottom , Ġtop , z Near , z Far , this ) ĊĊĠĠĠ Ġfun Ġset Or tho 2 D ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ== Ġ 0 ) Ġidentity () ĊĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġ( 2 . 0 f Ġ/ Ġ( right Ġ- Ġleft )) ĊĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġ( 2 . 0 f Ġ/ Ġ( top Ġ- Ġbottom )) ĊĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġ(- 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġthis . m 3 0 Ġ= Ġ(( right Ġ+ Ġleft ) Ġ/ Ġ( left Ġ- Ġright )) ĊĠĠĠĠĠĠĠ Ġthis . m 3 1 Ġ= Ġ(( top Ġ+ Ġbottom ) Ġ/ Ġ( bottom Ġ- Ġtop )) ĊĠĠĠĠĠĠĠ Ġproperties Ġ= ĠPROPERTY _ AFF INE ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Or tho 3 D ( left : ĠFloat , Ġright : ĠFloat , Ġbottom : ĠFloat , Ġtop : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ== Ġ 0 ) Ġidentity () ĊĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġ( 2 . 0 f Ġ/ Ġ( right Ġ- Ġleft )) ĊĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġ( 1 . 0 f Ġ/ Ġ( top Ġ- Ġbottom )) ĊĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġ(- 2 . 0 f Ġ/ Ġ( z Far Ġ- Ġz Near )) ĊĠĠĠĠĠĠĠ Ġthis . m 3 0 Ġ= Ġ(( right Ġ+ Ġleft ) Ġ/ Ġ( left Ġ- Ġright )) ĊĠĠĠĠĠĠĠ Ġthis . m 3 1 Ġ= Ġ(( top Ġ+ Ġbottom ) Ġ/ Ġ( bottom Ġ- Ġtop )) ĊĠĠĠĠĠĠĠ Ġthis . m 3 3 Ġ= Ġ(( z Far + z Near )/( z Near - z Far )) ĊĠĠĠĠĠĠĠ Ġproperties Ġ= ĠPROPERTY _ AFF INE ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġidentity (): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 0 2 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 0 3 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġm 1 2 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 1 3 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 2 0 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 2 1 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġm 2 3 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 3 0 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 3 1 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 3 2 Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġm 3 3 Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġproperties Ġ= ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ AFF INE Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) Ġreturn Ġtranslation ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġthis . m 3 0 Ġ= Ġ( m 0 0 Ġ* Ġx Ġ+ Ġm 1 0 Ġ* Ġy Ġ+ Ġm 2 0 Ġ* Ġz Ġ+ Ġm 3 0 ) ĊĠĠĠĠĠĠĠ Ġthis . m 3 1 Ġ= Ġ( m 0 1 Ġ* Ġx Ġ+ Ġm 1 1 Ġ* Ġy Ġ+ Ġm 2 1 Ġ* Ġz Ġ+ Ġm 3 1 ) ĊĠĠĠĠĠĠĠ Ġthis . m 3 2 Ġ= Ġ( m 0 2 Ġ* Ġx Ġ+ Ġm 1 2 Ġ* Ġy Ġ+ Ġm 2 2 Ġ* Ġz Ġ+ Ġm 3 2 ) ĊĠĠĠĠĠĠĠ Ġthis . m 3 3 Ġ= Ġ( m 0 3 Ġ* Ġx Ġ+ Ġm 1 3 Ġ* Ġy Ġ+ Ġm 2 3 Ġ* Ġz Ġ+ Ġm 3 3 ) ĊĠĠĠĠĠĠĠ Ġproperties Ġ= Ġproperties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY ). inv () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ m 0 0 Ġ Ġ$ m 0 1 Ġ Ġ$ m 0 2 Ġ$ m 0 3 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ m 1 0 Ġ Ġ$ m 1 1 Ġ Ġ$ m 1 2 Ġ$ m 1 3 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ m 2 0 Ġ Ġ$ m 2 1 Ġ Ġ$ m 2 2 Ġ$ m 2 3 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ m 3 0 Ġ Ġ$ m 3 1 Ġ Ġ$ m 3 2 Ġ$ m 3 3 \ n " ĊĊĠĠĠ Ġfun Ġset ( other : ĠMatrix 4 fc ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġother . m 0 0 ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġother . m 0 1 ĊĠĠĠĠĠĠĠ Ġm 0 2 Ġ= Ġother . m 0 2 ĊĠĠĠĠĠĠĠ Ġm 0 3 Ġ= Ġother . m 0 3 ĊĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġother . m 1 0 ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġother . m 1 1 ĊĠĠĠĠĠĠĠ Ġm 1 2 Ġ= Ġother . m 1 2 ĊĠĠĠĠĠĠĠ Ġm 1 3 Ġ= Ġother . m 1 3 ĊĊĠĠĠĠĠĠĠ Ġm 2 0 Ġ= Ġother . m 2 0 ĊĠĠĠĠĠĠĠ Ġm 2 1 Ġ= Ġother . m 2 1 ĊĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġother . m 2 2 ĊĠĠĠĠĠĠĠ Ġm 2 3 Ġ= Ġother . m 2 3 ĊĊĠĠĠĠĠĠĠ Ġm 3 0 Ġ= Ġother . m 3 0 ĊĠĠĠĠĠĠĠ Ġm 3 1 Ġ= Ġother . m 3 1 ĊĠĠĠĠĠĠĠ Ġm 3 2 Ġ= Ġother . m 3 2 ĊĠĠĠĠĠĠĠ Ġm 3 3 Ġ= Ġother . m 3 3 ĊĠĠĠĠĠĠĠ Ġproperties Ġ= Ġother . properties ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslation ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMatrix 4 f Ġ= Ġtranslate ( x , Ġy , Ġz , Ġthis ) ĊĊĠĠĠ Ġfun Ġtranslate ( vector : ĠVector 3 fc ): ĠMatrix 4 f Ġ= Ġtranslation ( vector . x , Ġvector . y , Ġvector . z ) ĊĊĠĠĠ Ġoverride Ġfun Ġrotate ( other : ĠQuaternion fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquat Ġ= Ġother ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest . rotation ( quat ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ TRANSL ATION Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotate Translation ( quat , Ġdest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ AFF INE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotate Affine ( quat , Ġdest ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrotate Generic ( quat , Ġdest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate Affine ( quat : ĠQuaternion fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw 2 : ĠFloat Ġ= Ġquat . w Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġx 2 : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . x ĊĠĠĠĠĠĠĠ Ġval Ġy 2 : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġz 2 : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġz w : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġd zw Ġ= Ġz w Ġ+ Ġz w ĊĠĠĠĠĠĠĠ Ġval Ġxy : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġd xy Ġ= Ġxy Ġ+ Ġxy ĊĠĠĠĠĠĠĠ Ġval Ġx z : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdx z Ġ= Ġx z Ġ+ Ġx z ĊĠĠĠĠĠĠĠ Ġval Ġy w : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdy w Ġ= Ġy w Ġ+ Ġy w ĊĠĠĠĠĠĠĠ Ġval Ġy z : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdy z Ġ= Ġy z Ġ+ Ġy z ĊĠĠĠĠĠĠĠ Ġval Ġx w : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdx w Ġ= Ġx w Ġ+ Ġx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 0 Ġ= Ġw 2 Ġ+ Ġx 2 Ġ- Ġz 2 Ġ- Ġy 2 ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 1 Ġ= Ġd xy Ġ+ Ġd zw ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 2 Ġ= Ġdx z Ġ- Ġdy w ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 0 Ġ= Ġ- dz w Ġ+ Ġd xy ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 1 Ġ= Ġy 2 Ġ- Ġz 2 Ġ+ Ġw 2 Ġ- Ġx 2 ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 2 Ġ= Ġdy z Ġ+ Ġdx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 0 Ġ= Ġdy w Ġ+ Ġdx z ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 1 Ġ= Ġdy z Ġ- Ġdx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 2 Ġ= Ġz 2 Ġ- Ġy 2 Ġ- Ġx 2 Ġ+ Ġw 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 0 Ġ= Ġm 0 0 Ġ* Ġrm 0 0 Ġ+ Ġm 1 0 Ġ* Ġrm 0 1 Ġ+ Ġm 2 0 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 1 Ġ= Ġm 0 1 Ġ* Ġrm 0 0 Ġ+ Ġm 1 1 Ġ* Ġrm 0 1 Ġ+ Ġm 2 1 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 2 Ġ= Ġm 0 2 Ġ* Ġrm 0 0 Ġ+ Ġm 1 2 Ġ* Ġrm 0 1 Ġ+ Ġm 2 2 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 0 Ġ= Ġm 0 0 Ġ* Ġrm 1 0 Ġ+ Ġm 1 0 Ġ* Ġrm 1 1 Ġ+ Ġm 2 0 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 1 Ġ= Ġm 0 1 Ġ* Ġrm 1 0 Ġ+ Ġm 1 1 Ġ* Ġrm 1 1 Ġ+ Ġm 2 1 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 2 Ġ= Ġm 0 2 Ġ* Ġrm 1 0 Ġ+ Ġm 1 2 Ġ* Ġrm 1 1 Ġ+ Ġm 2 2 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 2 0 Ġ+ Ġm 1 0 Ġ* Ġrm 2 1 Ġ+ Ġm 2 0 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 2 0 Ġ+ Ġm 1 1 Ġ* Ġrm 2 1 Ġ+ Ġm 2 1 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 2 0 Ġ+ Ġm 1 2 Ġ* Ġrm 2 1 Ġ+ Ġm 2 2 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 3 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 3 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 3 3 ) ĊĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate Affine ( ang : ĠFloat , Ġx : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġkotlin . math . sin ( ang ) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcos From Sin ( s , Ġang ) ĊĠĠĠĠĠĠĠ Ġval ĠC Ġ= Ġ 1 . 0 f Ġ- Ġc ĊĠĠĠĠĠĠĠ Ġval Ġxx Ġ= Ġx Ġ* Ġx ĊĠĠĠĠĠĠĠ Ġval Ġxy Ġ= Ġx Ġ* Ġy ĊĠĠĠĠĠĠĠ Ġval Ġx z Ġ= Ġx Ġ* Ġz ĊĠĠĠĠĠĠĠ Ġval Ġyy Ġ= Ġy Ġ* Ġy ĊĠĠĠĠĠĠĠ Ġval Ġy z Ġ= Ġy Ġ* Ġz ĊĠĠĠĠĠĠĠ Ġval Ġzz Ġ= Ġz Ġ* Ġz ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 0 Ġ= Ġxx Ġ* ĠC Ġ+ Ġc ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 1 Ġ= Ġxy Ġ* ĠC Ġ+ Ġz Ġ* Ġs ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 2 Ġ= Ġx z Ġ* ĠC Ġ- Ġy Ġ* Ġs ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 0 Ġ= Ġxy Ġ* ĠC Ġ- Ġz Ġ* Ġs ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 1 Ġ= Ġyy Ġ* ĠC Ġ+ Ġc ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 2 Ġ= Ġy z Ġ* ĠC Ġ+ Ġx Ġ* Ġs ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 0 Ġ= Ġx z Ġ* ĠC Ġ+ Ġy Ġ* Ġs ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 1 Ġ= Ġy z Ġ* ĠC Ġ- Ġx Ġ* Ġs ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 2 Ġ= Ġzz Ġ* ĠC Ġ+ Ġc ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġtempor aries Ġfor Ġdependent Ġvalues ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 0 Ġ= Ġm 0 0 Ġ* Ġrm 0 0 Ġ+ Ġm 1 0 Ġ* Ġrm 0 1 Ġ+ Ġm 2 0 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 1 Ġ= Ġm 0 1 Ġ* Ġrm 0 0 Ġ+ Ġm 1 1 Ġ* Ġrm 0 1 Ġ+ Ġm 2 1 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 2 Ġ= Ġm 0 2 Ġ* Ġrm 0 0 Ġ+ Ġm 1 2 Ġ* Ġrm 0 1 Ġ+ Ġm 2 2 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 0 Ġ= Ġm 0 0 Ġ* Ġrm 1 0 Ġ+ Ġm 1 0 Ġ* Ġrm 1 1 Ġ+ Ġm 2 0 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 1 Ġ= Ġm 0 1 Ġ* Ġrm 1 0 Ġ+ Ġm 1 1 Ġ* Ġrm 1 1 Ġ+ Ġm 2 1 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 2 Ġ= Ġm 0 2 Ġ* Ġrm 1 0 Ġ+ Ġm 1 2 Ġ* Ġrm 1 1 Ġ+ Ġm 2 2 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġnon - dependent Ġvalues Ġdirectly ĊĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 2 0 Ġ+ Ġm 1 0 Ġ* Ġrm 2 1 Ġ+ Ġm 2 0 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 2 0 Ġ+ Ġm 1 1 Ġ* Ġrm 2 1 Ġ+ Ġm 2 1 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 2 0 Ġ+ Ġm 1 2 Ġ* Ġrm 2 1 Ġ+ Ġm 2 2 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġother Ġvalues ĊĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 3 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 3 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Generic ( quat : ĠQuaternion fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw 2 : ĠFloat Ġ= Ġquat . w Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġx 2 : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . x ĊĠĠĠĠĠĠĠ Ġval Ġy 2 : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġz 2 : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġz w : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġd zw Ġ= Ġz w Ġ+ Ġz w ĊĠĠĠĠĠĠĠ Ġval Ġxy : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġd xy Ġ= Ġxy Ġ+ Ġxy ĊĠĠĠĠĠĠĠ Ġval Ġx z : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdx z Ġ= Ġx z Ġ+ Ġx z ĊĠĠĠĠĠĠĠ Ġval Ġy w : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdy w Ġ= Ġy w Ġ+ Ġy w ĊĠĠĠĠĠĠĠ Ġval Ġy z : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdy z Ġ= Ġy z Ġ+ Ġy z ĊĠĠĠĠĠĠĠ Ġval Ġx w : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdx w Ġ= Ġx w Ġ+ Ġx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 0 Ġ= Ġw 2 Ġ+ Ġx 2 Ġ- Ġz 2 Ġ- Ġy 2 ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 1 Ġ= Ġd xy Ġ+ Ġd zw ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 2 Ġ= Ġdx z Ġ- Ġdy w ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 0 Ġ= Ġ- dz w Ġ+ Ġd xy ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 1 Ġ= Ġy 2 Ġ- Ġz 2 Ġ+ Ġw 2 Ġ- Ġx 2 ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 2 Ġ= Ġdy z Ġ+ Ġdx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 0 Ġ= Ġdy w Ġ+ Ġdx z ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 1 Ġ= Ġdy z Ġ- Ġdx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 2 Ġ= Ġz 2 Ġ- Ġy 2 Ġ- Ġx 2 Ġ+ Ġw 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 0 Ġ= Ġm 0 0 Ġ* Ġrm 0 0 Ġ+ Ġm 1 0 Ġ* Ġrm 0 1 Ġ+ Ġm 2 0 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 1 Ġ= Ġm 0 1 Ġ* Ġrm 0 0 Ġ+ Ġm 1 1 Ġ* Ġrm 0 1 Ġ+ Ġm 2 1 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 2 Ġ= Ġm 0 2 Ġ* Ġrm 0 0 Ġ+ Ġm 1 2 Ġ* Ġrm 0 1 Ġ+ Ġm 2 2 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 0 3 Ġ= Ġm 0 3 Ġ* Ġrm 0 0 Ġ+ Ġm 1 3 Ġ* Ġrm 0 1 Ġ+ Ġm 2 3 Ġ* Ġrm 0 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 0 Ġ= Ġm 0 0 Ġ* Ġrm 1 0 Ġ+ Ġm 1 0 Ġ* Ġrm 1 1 Ġ+ Ġm 2 0 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 1 Ġ= Ġm 0 1 Ġ* Ġrm 1 0 Ġ+ Ġm 1 1 Ġ* Ġrm 1 1 Ġ+ Ġm 2 1 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 2 Ġ= Ġm 0 2 Ġ* Ġrm 1 0 Ġ+ Ġm 1 2 Ġ* Ġrm 1 1 Ġ+ Ġm 2 2 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 1 3 Ġ= Ġm 0 3 Ġ* Ġrm 1 0 Ġ+ Ġm 1 3 Ġ* Ġrm 1 1 Ġ+ Ġm 2 3 Ġ* Ġrm 1 2 ĊĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 2 0 Ġ+ Ġm 1 0 Ġ* Ġrm 2 1 Ġ+ Ġm 2 0 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 2 0 Ġ+ Ġm 1 1 Ġ* Ġrm 2 1 Ġ+ Ġm 2 1 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 2 0 Ġ+ Ġm 1 2 Ġ* Ġrm 2 1 Ġ+ Ġm 2 2 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 2 0 Ġ+ Ġm 1 3 Ġ* Ġrm 2 1 Ġ+ Ġm 2 3 Ġ* Ġrm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( nm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( nm 0 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( nm 0 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( nm 0 3 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( nm 1 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( nm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( nm 1 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( nm 1 3 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 3 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 3 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 3 3 ) ĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate Translation ( quat : ĠQuaternion fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw 2 : ĠFloat Ġ= Ġquat . w Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġx 2 : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . x ĊĠĠĠĠĠĠĠ Ġval Ġy 2 : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġz 2 : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġz w : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġd zw Ġ= Ġz w Ġ+ Ġz w ĊĠĠĠĠĠĠĠ Ġval Ġxy : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġd xy Ġ= Ġxy Ġ+ Ġxy ĊĠĠĠĠĠĠĠ Ġval Ġx z : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdx z Ġ= Ġx z Ġ+ Ġx z ĊĠĠĠĠĠĠĠ Ġval Ġy w : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdy w Ġ= Ġy w Ġ+ Ġy w ĊĠĠĠĠĠĠĠ Ġval Ġy z : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdy z Ġ= Ġy z Ġ+ Ġy z ĊĠĠĠĠĠĠĠ Ġval Ġx w : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdx w Ġ= Ġx w Ġ+ Ġx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 0 Ġ= Ġw 2 Ġ+ Ġx 2 Ġ- Ġz 2 Ġ- Ġy 2 ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 1 Ġ= Ġd xy Ġ+ Ġd zw ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 2 Ġ= Ġdx z Ġ- Ġdy w ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 0 Ġ= Ġ- dz w Ġ+ Ġd xy ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 1 Ġ= Ġy 2 Ġ- Ġz 2 Ġ+ Ġw 2 Ġ- Ġx 2 ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 2 Ġ= Ġdy z Ġ+ Ġdx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 0 Ġ= Ġdy w Ġ+ Ġdx z ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 1 Ġ= Ġdy z Ġ- Ġdx w ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 2 Ġ= Ġz 2 Ġ- Ġy 2 Ġ- Ġx 2 Ġ+ Ġw 2 ĊĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( rm 2 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( rm 2 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( rm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( rm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( rm 0 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( rm 0 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( rm 1 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( rm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( rm 1 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 3 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 3 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 3 3 ) ĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotation ( quat : ĠQuaternion fc ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw 2 : ĠFloat Ġ= Ġquat . w Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġx 2 : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . x ĊĠĠĠĠĠĠĠ Ġval Ġy 2 : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġz 2 : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġz w : ĠFloat Ġ= Ġquat . z Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġd zw Ġ= Ġz w Ġ+ Ġz w ĊĠĠĠĠĠĠĠ Ġval Ġxy : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . y ĊĠĠĠĠĠĠĠ Ġval Ġd xy Ġ= Ġxy Ġ+ Ġxy ĊĠĠĠĠĠĠĠ Ġval Ġx z : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdx z Ġ= Ġx z Ġ+ Ġx z ĊĠĠĠĠĠĠĠ Ġval Ġy w : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdy w Ġ= Ġy w Ġ+ Ġy w ĊĠĠĠĠĠĠĠ Ġval Ġy z : ĠFloat Ġ= Ġquat . y Ġ* Ġquat . z ĊĠĠĠĠĠĠĠ Ġval Ġdy z Ġ= Ġy z Ġ+ Ġy z ĊĠĠĠĠĠĠĠ Ġval Ġx w : ĠFloat Ġ= Ġquat . x Ġ* Ġquat . w ĊĠĠĠĠĠĠĠ Ġval Ġdx w Ġ= Ġx w Ġ+ Ġx w ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ== Ġ 0 ) Ġidentity () ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġ( w 2 Ġ+ Ġx 2 Ġ- Ġz 2 Ġ- Ġy 2 ) ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġ( d xy Ġ+ Ġd zw ) ĊĠĠĠĠĠĠĠ Ġm 0 2 Ġ= Ġ( dx z Ġ- Ġdy w ) ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġ(- dz w Ġ+ Ġd xy ) ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġ( y 2 Ġ- Ġz 2 Ġ+ Ġw 2 Ġ- Ġx 2 ) ĊĠĠĠĠĠĠĠ Ġm 1 2 Ġ= Ġ( dy z Ġ+ Ġdx w ) ĊĠĠĠĠĠĠĠ Ġm 2 0 Ġ= Ġ( dy w Ġ+ Ġdx z ) ĊĠĠĠĠĠĠĠ Ġm 2 1 Ġ= Ġ( dy z Ġ- Ġdx w ) ĊĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġ( z 2 Ġ- Ġy 2 Ġ- Ġx 2 Ġ+ Ġw 2 ) ĊĠĠĠĠĠĠĠ Ġproperties Ġ= Ġ( PROPERTY _ AFF INE Ġor ĠPROPERTY _ OR THON ORMAL ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate ( other : ĠQuaternion fc ): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotate ( other , Ġthis ) ĊĊĠĠĠ Ġfun Ġrotate Affine ( other : ĠQuaternion fc ): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotate Affine ( other , Ġthis ) ĊĊĠĠĠ Ġfun Ġscale ( vector : ĠVector 3 fc ): ĠMatrix 4 f Ġ= Ġscale ( vector . x , Ġvector . y , Ġvector . z , Ġthis ) ĊĠĠĠ Ġfun Ġscale ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMatrix 4 f Ġ= Ġscale ( x , Ġy , Ġz , Ġthis ) ĊĊĠĠĠ Ġfun Ġperspective ( fo vy : ĠFloat , Ġaspect : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat ): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperspective ( fo vy , Ġaspect , Ġz Near , Ġz Far , Ġthis ) ĊĊĠĠĠ Ġfun Ġscaling ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity () ĊĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġ( x ) ĊĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġ( y ) ĊĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġ( z ) ĊĠĠĠĠĠĠĠ Ġval Ġone Ġ= Ġkotlin . math . abs ( x ) Ġ== Ġ 1 . 0 f Ġ&& Ġkotlin . math . abs ( y ) Ġ== Ġ 1 . 0 f Ġ&& Ġkotlin . math . abs ( z ) Ġ== Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġproperties Ġ= Ġ( PROPERTY _ AFF INE Ġor Ġif Ġ( one ) ĠPROPERTY _ OR THON ORMAL Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperspective ( fo vy : ĠFloat , Ġaspect : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġz Zero ToOne : ĠBoolean , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( properties Ġand ĠPROPERTY _ IDENTITY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdest . set Perspective ( fo vy , Ġaspect , Ġz Near , Ġz Far , Ġz Zero ToOne ) ĊĠĠĠĠĠĠĠ Ġreturn Ġperspective Generic ( fo vy , Ġaspect , Ġz Near , Ġz Far , Ġz Zero ToOne , Ġdest ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperspective Generic ( fo vy : ĠFloat , Ġaspect : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġz Zero ToOne : ĠBoolean , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġkotlin . math . tan ( fo vy Ġ* Ġ 0 . 5 f . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġright Ġmatrix Ġelements ĊĠĠĠĠĠĠĠ Ġval Ġrm 0 0 Ġ= Ġ 1 . 0 f Ġ/ Ġ( h Ġ* Ġaspect ) ĊĠĠĠĠĠĠĠ Ġval Ġrm 1 1 Ġ= Ġ 1 . 0 f Ġ/ Ġh ĊĠĠĠĠĠĠĠ Ġval Ġrm 2 2 : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġrm 3 2 : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġfar Inf Ġ= Ġz Far Ġ> Ġ 0 Ġ&& Ġz Far . isIn finite () ĊĠĠĠĠĠĠĠ Ġval Ġnear Inf Ġ= Ġz Near Ġ> Ġ 0 Ġ&& Ġz Near . isIn finite () ĊĠĠĠĠĠĠĠ Ġif Ġ( far Inf ) Ġ{ Ġ// ĠSee : Ġ" Infinite ĠProjection ĠMatrix " Ġ( http :// www . ter athon . com / g dc 0 7 _ l eng yel . pdf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġ 1 E - 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrm 2 2 Ġ= Ġe Ġ- Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrm 3 2 Ġ= Ġ( e Ġ- Ġif Ġ( z Zero ToOne ) Ġ 1 . 0 f Ġelse Ġ 2 . 0 f ) Ġ* Ġz Near ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( near Inf ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġ 1 E - 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrm 2 2 Ġ= Ġ( if Ġ( z Zero ToOne ) Ġ 0 . 0 f Ġelse Ġ 1 . 0 f ) Ġ- Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrm 3 2 Ġ= Ġ(( if Ġ( z Zero ToOne ) Ġ 1 . 0 f Ġelse Ġ 2 . 0 f ) Ġ- Ġe ) Ġ* Ġz Far ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrm 2 2 Ġ= Ġ( if Ġ( z Zero ToOne ) Ġz Far Ġelse Ġz Far Ġ+ Ġz Near ) Ġ/ Ġ( z Near Ġ- Ġz Far ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrm 3 2 Ġ= Ġ( if Ġ( z Zero ToOne ) Ġz Far Ġelse Ġz Far Ġ+ Ġz Far ) Ġ* Ġz Near Ġ/ Ġ( z Near Ġ- Ġz Far ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġperform Ġoptimized Ġmatrix Ġmultiplication ĊĠĠĠĠĠĠĠ Ġval Ġnm 2 0 Ġ= Ġm 2 0 Ġ* Ġrm 2 2 Ġ- Ġm 3 0 ĊĠĠĠĠĠĠĠ Ġval Ġnm 2 1 Ġ= Ġm 2 1 Ġ* Ġrm 2 2 Ġ- Ġm 3 1 ĊĠĠĠĠĠĠĠ Ġval Ġnm 2 2 Ġ= Ġm 2 2 Ġ* Ġrm 2 2 Ġ- Ġm 3 2 ĊĠĠĠĠĠĠĠ Ġval Ġnm 2 3 Ġ= Ġm 2 3 Ġ* Ġrm 2 2 Ġ- Ġm 3 3 ĊĠĠĠĠĠĠĠ Ġdest . m 0 0 Ġ= Ġ( m 0 0 Ġ* Ġrm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 1 Ġ= Ġ( m 0 1 Ġ* Ġrm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 2 Ġ= Ġ( m 0 2 Ġ* Ġrm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 0 3 Ġ= Ġ( m 0 3 Ġ* Ġrm 0 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 0 Ġ= Ġ( m 1 0 Ġ* Ġrm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 1 Ġ= Ġ( m 1 1 Ġ* Ġrm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 2 Ġ= Ġ( m 1 2 Ġ* Ġrm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 1 3 Ġ= Ġ( m 1 3 Ġ* Ġrm 1 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 0 Ġ= Ġ( m 2 0 Ġ* Ġrm 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 1 Ġ= Ġ( m 2 1 Ġ* Ġrm 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 2 Ġ= Ġ( m 2 2 Ġ* Ġrm 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 3 3 Ġ= Ġ( m 2 3 Ġ* Ġrm 3 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 0 Ġ= Ġ( nm 2 0 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 1 Ġ= Ġ( nm 2 1 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 2 Ġ= Ġ( nm 2 2 ) ĊĠĠĠĠĠĠĠ Ġdest . m 2 3 Ġ= Ġ( nm 2 3 ) ĊĠĠĠĠĠĠĠ Ġdest . properties Ġ= Ġ( properties Ġand Ġ( PROPERTY _ AFF INE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION Ġor ĠPROPERTY _ OR THON ORMAL ). inv ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġzero () Ġ{ ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 0 2 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 0 3 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 1 2 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 1 3 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 2 0 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 2 1 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 2 3 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 3 0 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 3 1 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 3 2 Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġm 3 3 Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Perspective ( fo vy : ĠFloat , Ġaspect : ĠFloat , Ġz Near : ĠFloat , Ġz Far : ĠFloat , Ġz Zero ToOne : ĠBoolean ): ĠMatrix 4 f Ġ{ ĊĠĠĠĠĠĠĠ Ġzero () ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġkotlin . math . tan ( fo vy Ġ* Ġ 0 . 5 f . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġ( 1 . 0 f Ġ/ Ġ( h Ġ* Ġaspect )) ĊĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġ( 1 . 0 f Ġ/ Ġh ) ĊĠĠĠĠĠĠĠ Ġval Ġfar Inf Ġ= Ġz Far Ġ> Ġ 0 Ġ&& Ġz Far . isIn finite () ĊĠĠĠĠĠĠĠ Ġval Ġnear Inf Ġ= Ġz Near Ġ> Ġ 0 Ġ&& Ġz Near . isIn finite () ĊĠĠĠĠĠĠĠ Ġif Ġ( far Inf ) Ġ{ Ġ// ĠSee : Ġ" Infinite ĠProjection ĠMatrix " Ġ( http :// www . ter athon . com / g dc 0 7 _ l eng yel . pdf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġ 1 E - 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġ( e Ġ- Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 3 2 Ġ= Ġ(( e Ġ- Ġif Ġ( z Zero ToOne ) Ġ 1 . 0 f Ġelse Ġ 2 . 0 f ) Ġ* Ġz Near ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( near Inf ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġ 1 E - 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġ(( if Ġ( z Zero ToOne ) Ġ 0 . 0 f Ġelse Ġ 1 . 0 f ) Ġ- Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 3 2 Ġ= Ġ((( if Ġ( z Zero ToOne ) Ġ 1 . 0 f Ġelse Ġ 2 . 0 f ) Ġ- Ġe ) Ġ* Ġz Far ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġ(( if Ġ( z Zero ToOne ) Ġz Far Ġelse Ġz Far Ġ+ Ġz Near ) Ġ/ Ġ( z Near Ġ- Ġz Far )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 3 2 Ġ= Ġ(( if Ġ( z Zero ToOne ) Ġz Far Ġelse Ġz Far Ġ+ Ġz Far ) Ġ* Ġz Near Ġ/ Ġ( z Near Ġ- Ġz Far )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . m 2 3 Ġ= Ġ(- 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġproperties Ġ= Ġ( PROPERTY _ PER S PECT IVE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ const Ġval ĠP If Ġ= ĠPI . toFloat () Ċ const Ġval ĠPI 2 Ġ= ĠPI Ġ* Ġ 2 Ċ const Ġval ĠP IH alf Ġ= ĠP If Ġ* Ġ 0 . 5 f Ċ const Ġval ĠP IH alf 2 Ġ= ĠPI Ġ* Ġ 0 . 5 Ċ fun Ġcos From Sin ( sin : ĠDouble , Ġangle : ĠDouble ): ĠDouble Ġ{ Ċ // ĠĠĠ Ġif Ġ( Options . FA STM ATH ) ĊĠĠĠ Ġreturn Ġkotlin . math . sin ( angle Ġ+ ĠP IH alf 2 ) Ċ } Ċ Ċ fun Ġcos From Sin ( sin : ĠFloat , Ġangle : ĠFloat ): ĠFloat Ġ{ Ċ // ĠĠĠ Ġif Ġ( Options . FA STM ATH ) ĊĠĠĠ Ġreturn Ġkotlin . math . sin ( angle Ġ+ ĠP IH alf ) Ċ } Ċ Ċ operator Ġfun ĠMatrix 4 fc . times ( view Matrix : ĠMatrix 4 fc ): ĠMatrix 4 f Ġ= Ġmul ( view Matrix , ĠMatrix 4 f ()) Ċ Ċ fun ĠMatrix 4 f . translation Rotate Scale ( t : ĠVector 3 fc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq : ĠQuaternion fc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs : ĠVector 3 fc ) Ġ= ĊĠĠĠĠĠĠĠ Ġtranslation Rotate Scale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . x , Ġt . y , Ġt . z , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq . x , Ġq . y , Ġq . z , Ġq . w , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . x , Ġs . y , Ġs . z ĊĠĠĠĠĠĠĠ Ġ) ĊĊ Ċ fun ĠMatrix 4 f . translation Rotate Scale ( tx : ĠFloat , Ġty : ĠFloat , Ġtz : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq x : ĠFloat , Ġq y : ĠFloat , Ġq z : ĠFloat , Ġqw : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsx : ĠFloat , Ġsy : ĠFloat , Ġsz : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġd qx Ġ= Ġq x Ġ+ Ġq x ĊĠĠĠ Ġval Ġd qy Ġ= Ġq y Ġ+ Ġq y ĊĠĠĠ Ġval Ġd qz Ġ= Ġq z Ġ+ Ġq z ĊĠĠĠ Ġval Ġq 0 0 Ġ= Ġd qx Ġ* Ġq x ĊĠĠĠ Ġval Ġq 1 1 Ġ= Ġd qy Ġ* Ġq y ĊĠĠĠ Ġval Ġq 2 2 Ġ= Ġd qz Ġ* Ġq z ĊĠĠĠ Ġval Ġq 0 1 Ġ= Ġd qx Ġ* Ġq y ĊĠĠĠ Ġval Ġq 0 2 Ġ= Ġd qx Ġ* Ġq z ĊĠĠĠ Ġval Ġq 0 3 Ġ= Ġd qx Ġ* Ġqw ĊĠĠĠ Ġval Ġq 1 2 Ġ= Ġd qy Ġ* Ġq z ĊĠĠĠ Ġval Ġq 1 3 Ġ= Ġd qy Ġ* Ġqw ĊĠĠĠ Ġval Ġq 2 3 Ġ= Ġd qz Ġ* Ġqw ĊĠĠĠ Ġthis . m 0 0 Ġ= Ġsx Ġ- Ġ( q 1 1 Ġ+ Ġq 2 2 ) Ġ* Ġsx ĊĠĠĠ Ġthis . m 0 1 Ġ= Ġ( q 0 1 Ġ+ Ġq 2 3 ) Ġ* Ġsx ĊĠĠĠ Ġthis . m 0 2 Ġ= Ġ( q 0 2 Ġ- Ġq 1 3 ) Ġ* Ġsx ĊĠĠĠ Ġthis . m 0 3 Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġthis . m 1 0 Ġ= Ġ( q 0 1 Ġ- Ġq 2 3 ) Ġ* Ġsy ĊĠĠĠ Ġthis . m 1 1 Ġ= Ġsy Ġ- Ġ( q 2 2 Ġ+ Ġq 0 0 ) Ġ* Ġsy ĊĠĠĠ Ġthis . m 1 2 Ġ= Ġ( q 1 2 Ġ+ Ġq 0 3 ) Ġ* Ġsy ĊĠĠĠ Ġthis . m 1 3 Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġthis . m 2 0 Ġ= Ġ( q 0 2 Ġ+ Ġq 1 3 ) Ġ* Ġsz ĊĠĠĠ Ġthis . m 2 1 Ġ= Ġ( q 1 2 Ġ- Ġq 0 3 ) Ġ* Ġsz ĊĠĠĠ Ġthis . m 2 2 Ġ= Ġsz Ġ- Ġ( q 1 1 Ġ+ Ġq 0 0 ) Ġ* Ġsz ĊĠĠĠ Ġthis . m 2 3 Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġthis . m 3 0 Ġ= Ġtx ĊĠĠĠ Ġthis . m 3 1 Ġ= Ġty ĊĠĠĠ Ġthis . m 3 2 Ġ= Ġtz ĊĠĠĠ Ġthis . m 3 3 Ġ= Ġ 1 . 0 f ĊĠĠĠ Ġval Ġone Ġ= Ġabs ( sx ) Ġ== Ġ 1 . 0 f Ġ&& Ġabs ( sy ) Ġ== Ġ 1 . 0 f Ġ&& Ġabs ( sz ) Ġ== Ġ 1 . 0 f ĊĠĠĠ Ġproperties Ġ= ĠPROPERTY _ AFF INE Ġor Ġif Ġ( one ) ĠPROPERTY _ OR THON ORMAL Ġelse Ġ 0 ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠMatrix 4 fc . un project Ray ( win X : ĠFloat , Ġwin Y : ĠFloat , Ġviewport : ĠInt Array , Ġorigin Dest : ĠVector 3 f , Ġdir Dest : ĠVector 3 fm ): ĠMatrix 4 fc Ġ{ ĊĠĠĠ Ġval Ġa Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġb Ġ= Ġm 0 0 Ġ* Ġm 1 2 Ġ- Ġm 0 2 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġc Ġ= Ġm 0 0 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġd Ġ= Ġm 0 1 Ġ* Ġm 1 2 Ġ- Ġm 0 2 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġe Ġ= Ġm 0 1 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġf Ġ= Ġm 0 2 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 2 ĊĠĠĠ Ġval Ġg Ġ= Ġm 2 0 Ġ* Ġm 3 1 Ġ- Ġm 2 1 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġh Ġ= Ġm 2 0 Ġ* Ġm 3 2 Ġ- Ġm 2 2 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġi Ġ= Ġm 2 0 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġj Ġ= Ġm 2 1 Ġ* Ġm 3 2 Ġ- Ġm 2 2 Ġ* Ġm 3 1 ĊĠĠĠ Ġval Ġk Ġ= Ġm 2 1 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 1 ĊĠĠĠ Ġval Ġl Ġ= Ġm 2 2 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 2 ĊĠĠĠ Ġvar Ġdet Ġ= Ġa Ġ* Ġl Ġ- Ġb Ġ* Ġk Ġ+ Ġc Ġ* Ġj Ġ+ Ġd Ġ* Ġi Ġ- Ġe Ġ* Ġh Ġ+ Ġf Ġ* Ġg ĊĠĠĠ Ġdet Ġ= Ġ 1 . 0 f Ġ/ Ġdet ĊĠĠĠ Ġval Ġim 0 0 Ġ= Ġ( m 1 1 Ġ* Ġl Ġ- Ġm 1 2 Ġ* Ġk Ġ+ Ġm 1 3 Ġ* Ġj ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 0 1 Ġ= Ġ(- m 0 1 Ġ* Ġl Ġ+ Ġm 0 2 Ġ* Ġk Ġ- Ġm 0 3 Ġ* Ġj ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 0 2 Ġ= Ġ( m 3 1 Ġ* Ġf Ġ- Ġm 3 2 Ġ* Ġe Ġ+ Ġm 3 3 Ġ* Ġd ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 0 3 Ġ= Ġ(- m 2 1 Ġ* Ġf Ġ+ Ġm 2 2 Ġ* Ġe Ġ- Ġm 2 3 Ġ* Ġd ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 0 Ġ= Ġ(- m 1 0 Ġ* Ġl Ġ+ Ġm 1 2 Ġ* Ġi Ġ- Ġm 1 3 Ġ* Ġh ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 1 Ġ= Ġ( m 0 0 Ġ* Ġl Ġ- Ġm 0 2 Ġ* Ġi Ġ+ Ġm 0 3 Ġ* Ġh ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 2 Ġ= Ġ(- m 3 0 Ġ* Ġf Ġ+ Ġm 3 2 Ġ* Ġc Ġ- Ġm 3 3 Ġ* Ġb ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 3 Ġ= Ġ( m 2 0 Ġ* Ġf Ġ- Ġm 2 2 Ġ* Ġc Ġ+ Ġm 2 3 Ġ* Ġb ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 0 Ġ= Ġ( m 1 0 Ġ* Ġk Ġ- Ġm 1 1 Ġ* Ġi Ġ+ Ġm 1 3 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 1 Ġ= Ġ(- m 0 0 Ġ* Ġk Ġ+ Ġm 0 1 Ġ* Ġi Ġ- Ġm 0 3 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 2 Ġ= Ġ( m 3 0 Ġ* Ġe Ġ- Ġm 3 1 Ġ* Ġc Ġ+ Ġm 3 3 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 3 Ġ= Ġ(- m 2 0 Ġ* Ġe Ġ+ Ġm 2 1 Ġ* Ġc Ġ- Ġm 2 3 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 0 Ġ= Ġ(- m 1 0 Ġ* Ġj Ġ+ Ġm 1 1 Ġ* Ġh Ġ- Ġm 1 2 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 1 Ġ= Ġ( m 0 0 Ġ* Ġj Ġ- Ġm 0 1 Ġ* Ġh Ġ+ Ġm 0 2 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 2 Ġ= Ġ(- m 3 0 Ġ* Ġd Ġ+ Ġm 3 1 Ġ* Ġb Ġ- Ġm 3 2 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 3 Ġ= Ġ( m 2 0 Ġ* Ġd Ġ- Ġm 2 1 Ġ* Ġb Ġ+ Ġm 2 2 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġn dc X Ġ= Ġ( win X Ġ- Ġviewport [ 0 ]) Ġ/ Ġviewport [ 2 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Y Ġ= Ġ( win Y Ġ- Ġviewport [ 1 ]) Ġ/ Ġviewport [ 3 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġpx Ġ= Ġim 0 0 Ġ* Ġn dc X Ġ+ Ġim 1 0 Ġ* Ġn dc Y Ġ+ Ġim 3 0 ĊĠĠĠ Ġval Ġpy Ġ= Ġim 0 1 Ġ* Ġn dc X Ġ+ Ġim 1 1 Ġ* Ġn dc Y Ġ+ Ġim 3 1 ĊĠĠĠ Ġval Ġpz Ġ= Ġim 0 2 Ġ* Ġn dc X Ġ+ Ġim 1 2 Ġ* Ġn dc Y Ġ+ Ġim 3 2 ĊĠĠĠ Ġval Ġinv Near W Ġ= Ġ 1 . 0 f Ġ/ Ġ( im 0 3 Ġ* Ġn dc X Ġ+ Ġim 1 3 Ġ* Ġn dc Y Ġ- Ġim 2 3 Ġ+ Ġim 3 3 ) ĊĠĠĠ Ġval Ġnear X Ġ= Ġ( px Ġ- Ġim 2 0 ) Ġ* Ġinv Near W ĊĠĠĠ Ġval Ġnear Y Ġ= Ġ( py Ġ- Ġim 2 1 ) Ġ* Ġinv Near W ĊĠĠĠ Ġval Ġnear Z Ġ= Ġ( pz Ġ- Ġim 2 2 ) Ġ* Ġinv Near W ĊĠĠĠ Ġval Ġinv W 0 Ġ= Ġ 1 . 0 f Ġ/ Ġ( im 0 3 Ġ* Ġn dc X Ġ+ Ġim 1 3 Ġ* Ġn dc Y Ġ+ Ġim 3 3 ) ĊĠĠĠ Ġ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 ĊĠĠĠ Ġdir Dest . x Ġ= Ġx 0 Ġ- Ġnear X ĊĠĠĠ Ġdir Dest . y Ġ= Ġy 0 Ġ- Ġnear Y ĊĠĠĠ Ġdir Dest . z Ġ= Ġz 0 Ġ- Ġnear Z ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠMatrix 4 fc . un project ( win X : ĠFloat , Ġwin Y : ĠFloat , Ġwin Z : ĠFloat , Ġviewport : ĠInt Array , Ġdest : ĠVector 3 f ): ĠVector 3 f Ġ{ ĊĠĠĠ Ġval Ġa : ĠFloat Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġb : ĠFloat Ġ= Ġm 0 0 Ġ* Ġm 1 2 Ġ- Ġm 0 2 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġc : ĠFloat Ġ= Ġm 0 0 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 0 ĊĠĠĠ Ġval Ġd : ĠFloat Ġ= Ġm 0 1 Ġ* Ġm 1 2 Ġ- Ġm 0 2 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġe : ĠFloat Ġ= Ġm 0 1 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 1 ĊĠĠĠ Ġval Ġf : ĠFloat Ġ= Ġm 0 2 Ġ* Ġm 1 3 Ġ- Ġm 0 3 Ġ* Ġm 1 2 ĊĠĠĠ Ġval Ġg : ĠFloat Ġ= Ġm 2 0 Ġ* Ġm 3 1 Ġ- Ġm 2 1 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġh : ĠFloat Ġ= Ġm 2 0 Ġ* Ġm 3 2 Ġ- Ġm 2 2 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġi : ĠFloat Ġ= Ġm 2 0 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 0 ĊĠĠĠ Ġval Ġj : ĠFloat Ġ= Ġm 2 1 Ġ* Ġm 3 2 Ġ- Ġm 2 2 Ġ* Ġm 3 1 ĊĠĠĠ Ġval Ġk : ĠFloat Ġ= Ġm 2 1 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 1 ĊĠĠĠ Ġval Ġl : ĠFloat Ġ= Ġm 2 2 Ġ* Ġm 3 3 Ġ- Ġm 2 3 Ġ* Ġm 3 2 ĊĠĠĠ Ġvar Ġdet Ġ= Ġa Ġ* Ġl Ġ- Ġb Ġ* Ġk Ġ+ Ġc Ġ* Ġj Ġ+ Ġd Ġ* Ġi Ġ- Ġe Ġ* Ġh Ġ+ Ġf Ġ* Ġg ĊĠĠĠ Ġdet Ġ= Ġ 1 . 0 f Ġ/ Ġdet ĊĠĠĠ Ġval Ġim 0 0 : ĠFloat Ġ= Ġ( m 1 1 Ġ* Ġl Ġ- Ġm 1 2 Ġ* Ġk Ġ+ Ġm 1 3 Ġ* Ġj ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 0 1 : ĠFloat Ġ= Ġ(- m 0 1 Ġ* Ġl Ġ+ Ġm 0 2 Ġ* Ġk Ġ- Ġm 0 3 Ġ* Ġj ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 0 2 : ĠFloat Ġ= Ġ( m 3 1 Ġ* Ġf Ġ- Ġm 3 2 Ġ* Ġe Ġ+ Ġm 3 3 Ġ* Ġd ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 0 3 : ĠFloat Ġ= Ġ(- m 2 1 Ġ* Ġf Ġ+ Ġm 2 2 Ġ* Ġe Ġ- Ġm 2 3 Ġ* Ġd ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 0 : ĠFloat Ġ= Ġ(- m 1 0 Ġ* Ġl Ġ+ Ġm 1 2 Ġ* Ġi Ġ- Ġm 1 3 Ġ* Ġh ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 1 : ĠFloat Ġ= Ġ( m 0 0 Ġ* Ġl Ġ- Ġm 0 2 Ġ* Ġi Ġ+ Ġm 0 3 Ġ* Ġh ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 2 : ĠFloat Ġ= Ġ(- m 3 0 Ġ* Ġf Ġ+ Ġm 3 2 Ġ* Ġc Ġ- Ġm 3 3 Ġ* Ġb ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 1 3 : ĠFloat Ġ= Ġ( m 2 0 Ġ* Ġf Ġ- Ġm 2 2 Ġ* Ġc Ġ+ Ġm 2 3 Ġ* Ġb ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 0 : ĠFloat Ġ= Ġ( m 1 0 Ġ* Ġk Ġ- Ġm 1 1 Ġ* Ġi Ġ+ Ġm 1 3 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 1 : ĠFloat Ġ= Ġ(- m 0 0 Ġ* Ġk Ġ+ Ġm 0 1 Ġ* Ġi Ġ- Ġm 0 3 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 2 : ĠFloat Ġ= Ġ( m 3 0 Ġ* Ġe Ġ- Ġm 3 1 Ġ* Ġc Ġ+ Ġm 3 3 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 2 3 : ĠFloat Ġ= Ġ(- m 2 0 Ġ* Ġe Ġ+ Ġm 2 1 Ġ* Ġc Ġ- Ġm 2 3 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 0 : ĠFloat Ġ= Ġ(- m 1 0 Ġ* Ġj Ġ+ Ġm 1 1 Ġ* Ġh Ġ- Ġm 1 2 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 1 : ĠFloat Ġ= Ġ( m 0 0 Ġ* Ġj Ġ- Ġm 0 1 Ġ* Ġh Ġ+ Ġm 0 2 Ġ* Ġg ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 2 : ĠFloat Ġ= Ġ(- m 3 0 Ġ* Ġd Ġ+ Ġm 3 1 Ġ* Ġb Ġ- Ġm 3 2 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġim 3 3 : ĠFloat Ġ= Ġ( m 2 0 Ġ* Ġd Ġ- Ġm 2 1 Ġ* Ġb Ġ+ Ġm 2 2 Ġ* Ġa ) Ġ* Ġdet ĊĠĠĠ Ġval Ġn dc X Ġ= Ġ( win X Ġ- Ġviewport [ 0 ]) Ġ/ Ġviewport [ 2 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Y Ġ= Ġ( win Y Ġ- Ġviewport [ 1 ]) Ġ/ Ġviewport [ 3 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Z Ġ= Ġwin Z Ġ+ Ġwin Z Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġinv W Ġ= Ġ 1 . 0 f Ġ/ Ġ( im 0 3 Ġ* Ġn dc X Ġ+ Ġim 1 3 Ġ* Ġn dc Y Ġ+ Ġim 2 3 Ġ* Ġn dc Z Ġ+ Ġim 3 3 ) ĊĠĠĠ Ġdest . x Ġ= Ġ( im 0 0 Ġ* Ġn dc X Ġ+ Ġim 1 0 Ġ* Ġn dc Y Ġ+ Ġim 2 0 Ġ* Ġn dc Z Ġ+ Ġim 3 0 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . y Ġ= Ġ( im 0 1 Ġ* Ġn dc X Ġ+ Ġim 1 1 Ġ* Ġn dc Y Ġ+ Ġim 2 1 Ġ* Ġn dc Z Ġ+ Ġim 3 1 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . z Ġ= Ġ( im 0 2 Ġ* Ġn dc X Ġ+ Ġim 1 2 Ġ* Ġn dc Y Ġ+ Ġim 2 2 Ġ* Ġn dc Z Ġ+ Ġim 3 2 ) Ġ* Ġinv W ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ fun ĠMatrix 4 f . mul ( right : ĠMatrix 4 fc ): ĠMatrix 4 f Ġ= Ġmul ( right , Ġthis ) Ċ Ċ fun ĠMatrix 4 fc . un project Inv Ray ( win X : ĠFloat , Ġwin Y : ĠFloat , Ġviewport : ĠInt Array , Ġorigin Dest : ĠVector 3 fm , Ġdir Dest : ĠVector 3 fm ): ĠMatrix 4 fc Ġ{ ĊĠĠĠ Ġval Ġn dc X Ġ= Ġ( win X Ġ- Ġviewport [ 0 ]) Ġ/ Ġviewport [ 2 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Y Ġ= Ġ( win Y Ġ- Ġviewport [ 1 ]) Ġ/ Ġviewport [ 3 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġpx : ĠFloat Ġ= Ġm 0 0 Ġ* Ġn dc X Ġ+ Ġm 1 0 Ġ* Ġn dc Y Ġ+ Ġm 3 0 ĊĠĠĠ Ġval Ġpy : ĠFloat Ġ= Ġm 0 1 Ġ* Ġn dc X Ġ+ Ġm 1 1 Ġ* Ġn dc Y Ġ+ Ġm 3 1 ĊĠĠĠ Ġval Ġpz : ĠFloat Ġ= Ġm 0 2 Ġ* Ġn dc X Ġ+ Ġm 1 2 Ġ* Ġn dc Y Ġ+ Ġm 3 2 ĊĠĠĠ Ġval Ġinv Near W : ĠFloat Ġ= Ġ 1 . 0 f Ġ/ Ġ( m 0 3 Ġ* Ġn dc X Ġ+ Ġm 1 3 Ġ* Ġn dc Y Ġ- Ġm 2 3 Ġ+ Ġm 3 3 ) ĊĠĠĠ Ġval Ġnear X : ĠFloat Ġ= Ġ( px Ġ- Ġm 2 0 ) Ġ* Ġinv Near W ĊĠĠĠ Ġval Ġnear Y : ĠFloat Ġ= Ġ( py Ġ- Ġm 2 1 ) Ġ* Ġinv Near W ĊĠĠĠ Ġval Ġnear Z : ĠFloat Ġ= Ġ( pz Ġ- Ġm 2 2 ) Ġ* Ġinv Near W ĊĠĠĠ Ġval Ġinv Far W : ĠFloat Ġ= Ġ 1 . 0 f Ġ/ Ġ( m 0 3 Ġ* Ġn dc X Ġ+ Ġm 1 3 Ġ* Ġn dc Y Ġ+ Ġm 2 3 Ġ+ Ġm 3 3 ) ĊĠĠĠ Ġval Ġfar X : ĠFloat Ġ= Ġ( px Ġ+ Ġm 2 0 ) Ġ* Ġinv Far W ĊĠĠĠ Ġval Ġfar Y : ĠFloat Ġ= Ġ( py Ġ+ Ġm 2 1 ) Ġ* Ġinv Far W ĊĠĠĠ Ġval Ġfar Z : ĠFloat Ġ= Ġ( pz Ġ+ Ġm 2 2 ) Ġ* Ġinv Far W ĊĠĠĠ Ġorigin Dest . x Ġ= Ġnear X ĊĠĠĠ Ġorigin Dest . y Ġ= Ġnear Y ĊĠĠĠ Ġorigin Dest . z Ġ= Ġnear Z ĊĠĠĠ Ġdir Dest . x Ġ= Ġfar X Ġ- Ġnear X ĊĠĠĠ Ġdir Dest . y Ġ= Ġfar Y Ġ- Ġnear Y ĊĠĠĠ Ġdir Dest . z Ġ= Ġfar Z Ġ- Ġnear Z ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠMatrix 4 fc . un project Inv ( win X : ĠFloat , Ġwin Y : ĠFloat , Ġwin Z : ĠFloat , Ġviewport : ĠInt Array , Ġdest : ĠVector 4 f ): ĠVector 4 f Ġ{ ĊĠĠĠ Ġval Ġn dc X Ġ= Ġ( win X Ġ- Ġviewport [ 0 ]) Ġ/ Ġviewport [ 2 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Y Ġ= Ġ( win Y Ġ- Ġviewport [ 1 ]) Ġ/ Ġviewport [ 3 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Z Ġ= Ġwin Z Ġ+ Ġwin Z Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġinv W : ĠFloat Ġ= Ġ 1 . 0 f Ġ/ Ġ( m 0 3 Ġ* Ġn dc X Ġ+ Ġm 1 3 Ġ* Ġn dc Y Ġ+ Ġm 2 3 Ġ* Ġn dc Z Ġ+ Ġm 3 3 ) ĊĠĠĠ Ġdest . x Ġ= Ġ( m 0 0 Ġ* Ġn dc X Ġ+ Ġm 1 0 Ġ* Ġn dc Y Ġ+ Ġm 2 0 Ġ* Ġn dc Z Ġ+ Ġm 3 0 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . y Ġ= Ġ( m 0 1 Ġ* Ġn dc X Ġ+ Ġm 1 1 Ġ* Ġn dc Y Ġ+ Ġm 2 1 Ġ* Ġn dc Z Ġ+ Ġm 3 1 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . z Ġ= Ġ( m 0 2 Ġ* Ġn dc X Ġ+ Ġm 1 2 Ġ* Ġn dc Y Ġ+ Ġm 2 2 Ġ* Ġn dc Z Ġ+ Ġm 3 2 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . w Ġ= Ġ 1 . 0 f ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ fun ĠMatrix 4 fc . un project Inv ( win X : ĠFloat , Ġwin Y : ĠFloat , Ġwin Z : ĠFloat , Ġviewport : ĠInt Array , Ġdest : ĠVector 3 fm ): ĠVector 3 fm Ġ{ ĊĠĠĠ Ġval Ġn dc X Ġ= Ġ( win X Ġ- Ġviewport [ 0 ]) Ġ/ Ġviewport [ 2 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Y Ġ= Ġ( win Y Ġ- Ġviewport [ 1 ]) Ġ/ Ġviewport [ 3 ] Ġ* Ġ 2 . 0 f Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġn dc Z Ġ= Ġwin Z Ġ+ Ġwin Z Ġ- Ġ 1 . 0 f ĊĠĠĠ Ġval Ġinv W : ĠFloat Ġ= Ġ 1 . 0 f Ġ/ Ġ( m 0 3 Ġ* Ġn dc X Ġ+ Ġm 1 3 Ġ* Ġn dc Y Ġ+ Ġm 2 3 Ġ* Ġn dc Z Ġ+ Ġm 3 3 ) ĊĠĠĠ Ġdest . x Ġ= Ġ( m 0 0 Ġ* Ġn dc X Ġ+ Ġm 1 0 Ġ* Ġn dc Y Ġ+ Ġm 2 0 Ġ* Ġn dc Z Ġ+ Ġm 3 0 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . y Ġ= Ġ( m 0 1 Ġ* Ġn dc X Ġ+ Ġm 1 1 Ġ* Ġn dc Y Ġ+ Ġm 2 1 Ġ* Ġn dc Z Ġ+ Ġm 3 1 ) Ġ* Ġinv W ĊĠĠĠ Ġdest . z Ġ= Ġ( m 0 2 Ġ* Ġn dc X Ġ+ Ġm 1 2 Ġ* Ġn dc Y Ġ+ Ġm 2 2 Ġ* Ġn dc Z Ġ+ Ġm 3 2 ) Ġ* Ġinv W ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ fun ĠMatrix 4 fc . sub ( sub tr ah end : ĠMatrix 4 fc , Ġdest : ĠMatrix 4 f ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġdest . m 0 0 Ġ= Ġm 0 0 Ġ- Ġsub tr ah end . m 0 0 ĊĠĠĠ Ġdest . m 0 1 Ġ= Ġm 0 1 Ġ- Ġsub tr ah end . m 0 1 ĊĠĠĠ Ġdest . m 0 2 Ġ= Ġm 0 2 Ġ- Ġsub tr ah end . m 0 2 ĊĠĠĠ Ġdest . m 0 3 Ġ= Ġm 0 3 Ġ- Ġsub tr ah end . m 0 3 ĊĠĠĠ Ġdest . m 1 0 Ġ= Ġm 1 0 Ġ- Ġsub tr ah end . m 1 0 ĊĠĠĠ Ġdest . m 1 1 Ġ= Ġm 1 1 Ġ- Ġsub tr ah end . m 1 1 ĊĠĠĠ Ġdest . m 1 2 Ġ= Ġm 1 2 Ġ- Ġsub tr ah end . m 1 2 ĊĠĠĠ Ġdest . m 1 3 Ġ= Ġm 1 3 Ġ- Ġsub tr ah end . m 1 3 ĊĠĠĠ Ġdest . m 2 0 Ġ= Ġm 2 0 Ġ- Ġsub tr ah end . m 2 0 ĊĠĠĠ Ġdest . m 2 1 Ġ= Ġm 2 1 Ġ- Ġsub tr ah end . m 2 1 ĊĠĠĠ Ġdest . m 2 2 Ġ= Ġm 2 2 Ġ- Ġsub tr ah end . m 2 2 ĊĠĠĠ Ġdest . m 2 3 Ġ= Ġm 2 3 Ġ- Ġsub tr ah end . m 2 3 ĊĠĠĠ Ġdest . m 3 0 Ġ= Ġm 3 0 Ġ- Ġsub tr ah end . m 3 0 ĊĠĠĠ Ġdest . m 3 1 Ġ= Ġm 3 1 Ġ- Ġsub tr ah end . m 3 1 ĊĠĠĠ Ġdest . m 3 2 Ġ= Ġm 3 2 Ġ- Ġsub tr ah end . m 3 2 ĊĠĠĠ Ġdest . m 3 3 Ġ= Ġm 3 3 Ġ- Ġsub tr ah end . m 3 3 ĊĠĠĠ Ġdest . properties Ġ= Ġ 0 ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ fun ĠMatrix 4 fc . fr ustum Corner ( corner : ĠInt , Ġpoint : ĠVector 3 fm ): ĠVector 3 fm Ġ{ ĊĠĠĠ Ġval Ġd 1 : ĠFloat ĊĠĠĠ Ġval Ġd 2 : ĠFloat ĊĠĠĠ Ġval Ġd 3 : ĠFloat ĊĠĠĠ Ġval Ġn 1 x : ĠFloat ĊĠĠĠ Ġval Ġn 1 y : ĠFloat ĊĠĠĠ Ġval Ġn 1 z : ĠFloat ĊĠĠĠ Ġval Ġn 2 x : ĠFloat ĊĠĠĠ Ġval Ġn 2 y : ĠFloat ĊĠĠĠ Ġval Ġn 2 z : ĠFloat ĊĠĠĠ Ġval Ġn 3 x : ĠFloat ĊĠĠĠ Ġval Ġn 3 y : ĠFloat ĊĠĠĠ Ġval Ġn 3 z : ĠFloat ĊĠĠĠ Ġwhen Ġ( corner ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ NX NY NZ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ+ Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ+ Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ+ Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ+ Ġm 3 0 Ġ// Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ+ Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ+ Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ+ Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ+ Ġm 3 1 Ġ// Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ+ Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ+ Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ+ Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ+ Ġm 3 2 Ġ// Ġnear ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ PX NY NZ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ- Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ- Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ- Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ- Ġm 3 0 Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ+ Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ+ Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ+ Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ+ Ġm 3 1 Ġ// Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ+ Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ+ Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ+ Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ+ Ġm 3 2 Ġ// Ġnear ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ PX PY NZ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ- Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ- Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ- Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ- Ġm 3 0 Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ- Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ- Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ- Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ- Ġm 3 1 Ġ// Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ+ Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ+ Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ+ Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ+ Ġm 3 2 Ġ// Ġnear ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ NX PY NZ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ+ Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ+ Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ+ Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ+ Ġm 3 0 Ġ// Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ- Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ- Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ- Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ- Ġm 3 1 Ġ// Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ+ Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ+ Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ+ Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ+ Ġm 3 2 Ġ// Ġnear ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ PX N YP Z Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ- Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ- Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ- Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ- Ġm 3 0 Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ+ Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ+ Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ+ Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ+ Ġm 3 1 Ġ// Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ- Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ- Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ- Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ- Ġm 3 2 Ġ// Ġfar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ NX N YP Z Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ+ Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ+ Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ+ Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ+ Ġm 3 0 Ġ// Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ+ Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ+ Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ+ Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ+ Ġm 3 1 Ġ// Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ- Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ- Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ- Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ- Ġm 3 2 Ġ// Ġfar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ NX PY P Z Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ+ Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ+ Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ+ Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ+ Ġm 3 0 Ġ// Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ- Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ- Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ- Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ- Ġm 3 1 Ġ// Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ- Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ- Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ- Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ- Ġm 3 2 Ġ// Ġfar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatrix 4 fc . COR NER _ PX PY P Z Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 x Ġ= Ġm 0 3 Ġ- Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 y Ġ= Ġm 1 3 Ġ- Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 z Ġ= Ġm 2 3 Ġ- Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 1 Ġ= Ġm 3 3 Ġ- Ġm 3 0 Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 x Ġ= Ġm 0 3 Ġ- Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 y Ġ= Ġm 1 3 Ġ- Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 2 z Ġ= Ġm 2 3 Ġ- Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 2 Ġ= Ġm 3 3 Ġ- Ġm 3 1 Ġ// Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 x Ġ= Ġm 0 3 Ġ- Ġm 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 y Ġ= Ġm 1 3 Ġ- Ġm 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn 3 z Ġ= Ġm 2 3 Ġ- Ġm 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd 3 Ġ= Ġm 3 3 Ġ- Ġm 3 2 Ġ// Ġfar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" corner ") Ġ//$ NON - NLS - 1 $ ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġc 2 3 x : ĠFloat ĊĠĠĠ Ġval Ġc 2 3 y : ĠFloat ĊĠĠĠ Ġval Ġc 2 3 z : ĠFloat ĊĠĠĠ Ġc 2 3 x Ġ= Ġn 2 y Ġ* Ġn 3 z Ġ- Ġn 2 z Ġ* Ġn 3 y ĊĠĠĠ Ġc 2 3 y Ġ= Ġn 2 z Ġ* Ġn 3 x Ġ- Ġn 2 x Ġ* Ġn 3 z ĊĠĠĠ Ġc 2 3 z Ġ= Ġn 2 x Ġ* Ġn 3 y Ġ- Ġn 2 y Ġ* Ġn 3 x ĊĠĠĠ Ġval Ġc 3 1 x : ĠFloat ĊĠĠĠ Ġval Ġc 3 1 y : ĠFloat ĊĠĠĠ Ġval Ġc 3 1 z : ĠFloat ĊĠĠĠ Ġc 3 1 x Ġ= Ġn 3 y Ġ* Ġn 1 z Ġ- Ġn 3 z Ġ* Ġn 1 y ĊĠĠĠ Ġc 3 1 y Ġ= Ġn 3 z Ġ* Ġn 1 x Ġ- Ġn 3 x Ġ* Ġn 1 z ĊĠĠĠ Ġc 3 1 z Ġ= Ġn 3 x Ġ* Ġn 1 y Ġ- Ġn 3 y Ġ* Ġn 1 x ĊĠĠĠ Ġval Ġc 1 2 x : ĠFloat ĊĠĠĠ Ġval Ġc 1 2 y : ĠFloat ĊĠĠĠ Ġval Ġc 1 2 z : ĠFloat ĊĠĠĠ Ġc 1 2 x Ġ= Ġn 1 y Ġ* Ġn 2 z Ġ- Ġn 1 z Ġ* Ġn 2 y ĊĠĠĠ Ġc 1 2 y Ġ= Ġn 1 z Ġ* Ġn 2 x Ġ- Ġn 1 x Ġ* Ġn 2 z ĊĠĠĠ Ġc 1 2 z Ġ= Ġn 1 x Ġ* Ġn 2 y Ġ- Ġn 1 y Ġ* Ġn 2 x ĊĠĠĠ Ġval Ġinv Dot Ġ= Ġ 1 . 0 f Ġ/ Ġ( n 1 x Ġ* Ġc 2 3 x Ġ+ Ġn 1 y Ġ* Ġc 2 3 y Ġ+ Ġn 1 z Ġ* Ġc 2 3 z ) ĊĠĠĠ Ġpoint . x Ġ= Ġ(- c 2 3 x Ġ* Ġd 1 Ġ- Ġc 3 1 x Ġ* Ġd 2 Ġ- Ġc 1 2 x Ġ* Ġd 3 ) Ġ* Ġinv Dot ĊĠĠĠ Ġpoint . y Ġ= Ġ(- c 2 3 y Ġ* Ġd 1 Ġ- Ġc 3 1 y Ġ* Ġd 2 Ġ- Ġc 1 2 y Ġ* Ġd 3 ) Ġ* Ġinv Dot ĊĠĠĠ Ġpoint . z Ġ= Ġ(- c 2 3 z Ġ* Ġd 1 Ġ- Ġc 3 1 z Ġ* Ġd 2 Ġ- Ġc 1 2 z Ġ* Ġd 3 ) Ġ* Ġinv Dot ĊĠĠĠ Ġreturn Ġpoint Ċ } Ċ Ċ fun ĠMatrix 4 f . set Translation ( translation : ĠVector 3 fc ): ĠMatrix 4 f Ġ= Ġset Translation ( translation . x , Ġtranslation . y , Ġtranslation . z ) Ċ Ċ fun ĠMatrix 4 f . set Translation ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġthis . m 3 0 Ġ= Ġx ĊĠĠĠ Ġthis . m 3 1 Ġ= Ġy ĊĠĠĠ Ġthis . m 3 2 Ġ= Ġz ĊĠĠĠ Ġproperties Ġ= Ġproperties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY ). inv () ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠSet Ġonly Ġthe Ġupper Ġleft Ġ 3 x 3 Ġsub matrix Ġof Ġthis Ġmatrix Ġto Ġa Ġrotation Ġof Ġ` angle X ` Ġradians Ġabout Ġthe ĠX Ġaxis , Ġfollowed Ġby Ġa Ġrotation Ċ Ġ* Ġof Ġ` angle Y ` Ġradians Ġabout Ġthe ĠY Ġaxis Ġand Ġfollowed Ġby Ġa Ġrotation Ġof Ġ` angle Z ` Ġradians Ġabout Ġthe ĠZ Ġaxis . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠWhen Ġused Ġwith Ġa Ġright - h anded Ġcoordinate Ġsystem , Ġthe Ġproduced Ġrotation Ġwill Ġrotate Ġa Ġvector Ċ Ġ* Ġcounter - clock wise Ġaround Ġthe Ġrotation Ġaxis , Ġwhen Ġviewing Ġalong Ġthe Ġnegative Ġaxis Ġdirection Ġtowards Ġthe Ġorigin . Ċ Ġ* ĠWhen Ġused Ġwith Ġa Ġleft - h anded Ġcoordinate Ġsystem , Ġthe Ġrotation Ġis Ġclock wise . Ċ Ġ* Ċ Ġ* Ġ@ param Ġangle X Ċ Ġ* Ġthe Ġangle Ġto Ġrotate Ġabout ĠX Ċ Ġ* Ġ@ param Ġangle Y Ċ Ġ* Ġthe Ġangle Ġto Ġrotate Ġabout ĠY Ċ Ġ* Ġ@ param Ġangle Z Ċ Ġ* Ġthe Ġangle Ġto Ġrotate Ġabout ĠZ Ċ Ġ* Ġ@ return Ġthis Ċ Ġ*/ Ċ fun ĠMatrix 4 f . setRotation XYZ ( angle X : ĠFloat , Ġangle Y : ĠFloat , Ġangle Z : ĠFloat ): ĠMatrix 4 f Ġ{ ĊĠĠĠ Ġval Ġsin X Ġ= Ġsin ( angle X ) ĊĠĠĠ Ġval Ġcos X Ġ= Ġcos From Sin ( sin X , Ġangle X ) ĊĠĠĠ Ġval Ġsin Y Ġ= Ġsin ( angle Y ) ĊĠĠĠ Ġval Ġcos Y Ġ= Ġcos From Sin ( sin Y , Ġangle Y ) ĊĠĠĠ Ġval Ġsin Z Ġ= Ġsin ( angle Z ) ĊĠĠĠ Ġval Ġcos Z Ġ= Ġcos From Sin ( sin Z , Ġangle Z ) ĊĠĠĠ Ġval Ġm _ sin X Ġ= Ġ- sin X ĊĠĠĠ Ġval Ġm _ sin Y Ġ= Ġ- sin Y ĊĠĠĠ Ġval Ġm _ sin Z Ġ= Ġ- sin Z ĊĠĠĠ Ġ// ĠrotateX ĊĠĠĠ Ġ// ĠrotateY ĊĠĠĠ Ġval Ġnm 0 1 Ġ= Ġm _ sin X Ġ* Ġm _ sin Y ĊĠĠĠ Ġval Ġnm 0 2 Ġ= Ġcos X Ġ* Ġm _ sin Y ĊĠĠĠ Ġthis . m 2 0 Ġ= Ġ( sin Y ) ĊĠĠĠ Ġthis . m 2 1 Ġ= Ġ( m _ sin X Ġ* Ġcos Y ) ĊĠĠĠ Ġthis . m 2 2 Ġ= Ġ( cosX Ġ* Ġcos Y ) ĊĠĠĠ Ġ// ĠrotateZ ĊĠĠĠ Ġthis . m 0 0 Ġ= Ġcos Y Ġ* Ġcos Z ĊĠĠĠ Ġthis . m 0 1 Ġ= Ġnm 0 1 Ġ* Ġcos Z Ġ+ Ġcos X Ġ* Ġsin Z ĊĠĠĠ Ġthis . m 0 2 Ġ= Ġnm 0 2 Ġ* Ġcos Z Ġ+ Ġsin X Ġ* Ġsin Z ĊĠĠĠ Ġthis . m 1 0 Ġ= Ġcos Y Ġ* Ġm _ sin Z ĊĠĠĠ Ġthis . m 1 1 Ġ= Ġnm 0 1 Ġ* Ġm _ sin Z Ġ+ Ġcos X Ġ* Ġcos Z ĊĠĠĠ Ġthis . m 1 2 Ġ= Ġnm 0 2 Ġ* Ġm _ sin Z Ġ+ Ġsin X Ġ* Ġcos Z ĊĠĠĠ Ġproperties Ġ= Ġproperties Ġand Ġ( PROPERTY _ PER S PECT IVE Ġor ĠPROPERTY _ IDENTITY Ġor ĠPROPERTY _ TRANSL ATION ). inv () ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠMatrix 4 fc . get Axis Angle Rotation ( dest : Vector 4 fm ): ĠVector 4 fm Ġ{ ĊĠĠĠ Ġval Ġm Ġ= Ġthis ĊĠĠĠ Ġvar Ġnm 0 0 = Ġm . m 0 0 ĊĠĠĠ Ġvar Ġnm 0 1 = Ġm . m 0 1 ĊĠĠĠ Ġvar Ġnm 0 2 Ġ= Ġm . m 0 2 ĊĠĠĠ Ġvar Ġnm 1 0 Ġ= Ġm . m 1 0 ĊĠĠĠ Ġvar Ġnm 1 1 Ġ= Ġm . m 1 1 ĊĠĠĠ Ġvar Ġnm 1 2 Ġ= Ġm . m 1 2 ĊĠĠĠ Ġvar Ġnm 2 0 Ġ= Ġm . m 2 0 ĊĠĠĠ Ġvar Ġnm 2 1 Ġ= Ġm . m 2 1 ĊĠĠĠ Ġvar Ġnm 2 2 Ġ= Ġm . m 2 2 ĊĠĠĠ Ġval Ġlen X Ġ= Ġ 1 . 0 f Ġ/ Ġsqrt ( m . m 0 0 Ġ* Ġm . m 0 0 Ġ+ Ġm . m 0 1 Ġ* Ġm . m 0 1 Ġ+ Ġ( m . m 0 2 Ġ* Ġm . m 0 2 )) ĊĠĠĠ Ġval Ġlen Y Ġ= Ġ 1 . 0 f Ġ/ Ġsqrt ( m . m 1 0 Ġ* Ġm . m 1 0 Ġ+ Ġm . m 1 1 Ġ* Ġm . m 1 1 Ġ+ Ġ( m . m 1 2 Ġ* Ġm . m 1 2 )) ĊĠĠĠ Ġval Ġlen Z Ġ= Ġ 1 . 0 f Ġ/ Ġsqrt ( m . m 2 0 Ġ* Ġm . m 2 0 Ġ+ Ġm . m 2 1 Ġ* Ġm . m 2 1 Ġ+ Ġ( m . m 2 2 Ġ* Ġm . m 2 2 )) ĊĠĠĠ Ġnm 0 0 Ġ*= Ġlen X ĊĠĠĠ Ġnm 0 1 Ġ*= Ġlen X ĊĠĠĠ Ġnm 0 2 Ġ*= Ġlen X ĊĠĠĠ Ġnm 1 0 Ġ*= Ġlen Y ĊĠĠĠ Ġnm 1 1 Ġ*= Ġlen Y ĊĠĠĠ Ġnm 1 2 Ġ*= Ġlen Y ĊĠĠĠ Ġnm 2 0 Ġ*= Ġlen Z ĊĠĠĠ Ġnm 2 1 Ġ*= Ġlen Z ĊĠĠĠ Ġnm 2 2 Ġ*= Ġlen Z ĊĠĠĠ Ġval Ġepsilon Ġ= Ġ 1 E - 4 ĊĠĠĠ Ġif Ġ( abs ( nm 1 0 Ġ- Ġnm 0 1 ) Ġ< Ġepsilon Ġ&& Ġabs ( nm 2 0 Ġ- Ġnm 0 2 ) Ġ< Ġepsilon Ġ&& Ġabs ( nm 2 1 Ġ- Ġnm 1 2 ) Ġ< Ġepsilon ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdest . w Ġ= ĠP If ĊĠĠĠĠĠĠĠ Ġval Ġxx Ġ= Ġ( nm 0 0 Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġyy Ġ= Ġ( nm 1 1 Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġzz Ġ= Ġ( nm 2 2 Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġxy Ġ= Ġ( nm 1 0 Ġ+ Ġnm 0 1 ) Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġx z Ġ= Ġ( nm 2 0 Ġ+ Ġnm 0 2 ) Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġy z Ġ= Ġ( nm 2 1 Ġ+ Ġnm 1 2 ) Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġif Ġ( xx Ġ> Ġyy Ġ&& Ġxx Ġ> Ġzz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . x Ġ= Ġsqrt ( xx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . y Ġ= Ġ( xy Ġ/ Ġdest . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . z Ġ= Ġ( xz Ġ/ Ġdest . x ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( yy Ġ> Ġzz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . y Ġ= Ġsqrt ( yy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . x Ġ= Ġ( xy Ġ/ Ġdest . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . z Ġ= Ġ( yz Ġ/ Ġdest . y ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . z Ġ= Ġsqrt ( zz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . x Ġ= Ġ( xz Ġ/ Ġdest . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . y Ġ= Ġ( yz Ġ/ Ġdest . z ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdest ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġs Ġ= Ġsqrt (( nm 1 2 Ġ- Ġnm 2 1 ) Ġ* Ġ( nm 1 2 Ġ- Ġnm 2 1 ) Ġ+ Ġ( nm 2 0 Ġ- Ġnm 0 2 ) Ġ* Ġ( nm 2 0 Ġ- Ġnm 0 2 ) Ġ+ Ġ( nm 0 1 Ġ- Ġnm 1 0 ) Ġ* Ġ( nm 0 1 Ġ- Ġnm 1 0 )) ĊĠĠĠ Ġdest . w Ġ= Ġsafe A cos (( nm 0 0 Ġ+ Ġnm 1 1 Ġ+ Ġnm 2 2 Ġ- Ġ 1 ) Ġ/ Ġ 2 ) ĊĠĠĠ Ġdest . x Ġ= Ġ(( nm 1 2 Ġ- Ġnm 2 1 ) Ġ/ Ġs ) ĊĠĠĠ Ġdest . y Ġ= Ġ(( nm 2 0 Ġ- Ġnm 0 2 ) Ġ/ Ġs ) ĊĠĠĠ Ġdest . z Ġ= Ġ(( nm 0 1 Ġ- Ġnm 1 0 ) Ġ/ Ġs ) ĊĠĠĠ Ġreturn Ġdest Ċ }