/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠJean Ġd ' Arc . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ċ Ġ* Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ċ Ġ* Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ċ Ġ* Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ċ Ġ* Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT Ċ Ġ* ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNON - INFRINGEMENT . Ċ Ġ* ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġengine . math Ċ Ċ import Ġengine . math . Scalar . max Ċ import Ġengine . math . Scalar . min Ċ import Ġengine . math . Scalar . sqr Ċ import Ġkotlin . math . sqrt Ċ Ċ @ Suppress (" unused ", Ġ" D uplicated Code ", Ġ" Member Visibility Can Be Private ") Ċ class ĠA abb ( min : ĠVector 3 Ġ= ĠVector 3 . POSITIVE _ INFINITY , Ġmax : ĠVector 3 Ġ= ĠVector 3 . NEGATIVE _ INFINITY ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmin Ġ= Ġfloat ArrayOf ( min . x , Ġmin . y , Ġmin . z ) ĊĠĠĠ Ġprivate Ġval Ġmax Ġ= Ġfloat ArrayOf ( max . x , Ġmax . y , Ġmax . z ) ĊĊĠĠĠ Ġval Ġwidth Ġget () Ġ= Ġmax [ 0 ] Ġ- Ġmin [ 0 ] ĊĠĠĠ Ġval Ġheight Ġget () Ġ= Ġmax [ 1 ] Ġ- Ġmin [ 1 ] ĊĠĠĠ Ġval Ġdepth Ġget () Ġ= Ġmax [ 2 ] Ġ- Ġmin [ 2 ] ĊĊĠĠĠ Ġval Ġcenter Ġget () Ġ= ĠVector 3 (( min [ 0 ] Ġ+ Ġmax [ 0 ]) Ġ/ Ġ 2 F , Ġ( min [ 1 ] Ġ+ Ġmax [ 1 ]) Ġ/ Ġ 2 F , Ġ( min [ 2 ] Ġ+ Ġmax [ 2 ]) Ġ/ Ġ 2 F ) ĊĠĠĠ Ġval Ġradius Ġget () Ġ= Ġsqrt (( max [ 0 ] Ġ- Ġmin [ 0 ]). sqr () Ġ+ Ġ( max [ 1 ] Ġ- Ġmin [ 1 ]). sqr () Ġ+ Ġ( max [ 2 ] Ġ- Ġmin [ 2 ]). sqr ()) Ġ/ Ġ 2 F ĊĊĠĠĠ Ġfun Ġreset (): ĠA abb Ġ{ ĊĠĠĠĠĠĠĠ Ġmin . fill ( Float . POSITIVE _ INFINITY ) ĊĠĠĠĠĠĠĠ Ġmax . fill ( Float . NEGATIVE _ INFINITY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( v : ĠVector 3 ) Ġ= ĊĠĠĠĠĠĠĠ Ġ( v . x Ġ>= Ġmin [ 0 ]) Ġ&& Ġ( v . y Ġ>= Ġmin [ 1 ]) Ġ&& Ġ( v . z Ġ>= Ġmin [ 2 ]) Ġ&& ĊĠĠĠĠĠĠĠ Ġ( v . x Ġ<= Ġmax [ 0 ]) Ġ&& Ġ( v . y Ġ<= Ġmax [ 1 ]) Ġ&& Ġ( v . z Ġ<= Ġmax [ 2 ]) ĊĊĠĠĠ Ġfun Ġpoints Be hind ( plane : ĠPlane ) Ġ= ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( min [ 0 ], Ġmax [ 1 ], Ġmin [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( max [ 0 ], Ġmax [ 1 ], Ġmin [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( max [ 0 ], Ġmin [ 1 ], Ġmin [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( min [ 0 ], Ġmin [ 1 ], Ġmin [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( min [ 0 ], Ġmax [ 1 ], Ġmax [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( max [ 0 ], Ġmax [ 1 ], Ġmax [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( max [ 0 ], Ġmin [ 1 ], Ġmax [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠ Ġ( if Ġ( plane . dot ( min [ 0 ], Ġmin [ 1 ], Ġmax [ 2 ]) Ġ< Ġ 0 ) Ġ 1 Ġelse Ġ 0 ) ĊĊĠĠĠ Ġfun Ġaggregate ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠA abb Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( x . is Finite () Ġ&& Ġy . is Finite () Ġ&& Ġz . is Finite ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin [ 0 ] Ġ= Ġmin ( x , Ġmin [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin [ 1 ] Ġ= Ġmin ( y , Ġmin [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin [ 2 ] Ġ= Ġmin ( z , Ġmin [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax [ 0 ] Ġ= Ġmax ( x , Ġmax [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax [ 1 ] Ġ= Ġmax ( y , Ġmax [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax [ 2 ] Ġ= Ġmax ( z , Ġmax [ 2 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaggregate ( point : ĠVector 3 ) Ġ= Ġaggregate ( point . x , Ġpoint . y , Ġpoint . z ) ĊĊĠĠĠ Ġfun Ġaggregate ( other : ĠA abb ) Ġ= ĊĠĠĠĠĠĠĠ Ġaggregate ( other . min [ 0 ], Ġother . min [ 1 ], Ġother . min [ 2 ]). aggregate ( other . max [ 0 ], Ġother . max [ 1 ], Ġother . max [ 2 ]) ĊĊĠĠĠ Ġfun Ġaggregate ( box : ĠA abb , Ġtransform : ĠMatrix 4 ): ĠA abb Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġtransform . m 0 0 Ġ* Ġbox . min [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġtransform . m 1 0 Ġ* Ġbox . min [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtransform . m 2 0 Ġ* Ġbox . min [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġtransform . m 0 1 Ġ* Ġbox . min [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġtransform . m 1 1 Ġ* Ġbox . min [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġtransform . m 2 1 Ġ* Ġbox . min [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġtransform . m 0 2 Ġ* Ġbox . min [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġtransform . m 1 2 Ġ* Ġbox . min [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġtransform . m 2 2 Ġ* Ġbox . min [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġj Ġ= Ġtransform . m 0 0 Ġ* Ġbox . max [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġtransform . m 1 0 Ġ* Ġbox . max [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġtransform . m 2 0 Ġ* Ġbox . max [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġtransform . m 0 1 Ġ* Ġbox . max [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġtransform . m 1 1 Ġ* Ġbox . max [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġo Ġ= Ġtransform . m 2 1 Ġ* Ġbox . max [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġtransform . m 0 2 Ġ* Ġbox . max [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= Ġtransform . m 1 2 Ġ* Ġbox . max [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġtransform . m 2 2 Ġ* Ġbox . max [ 2 ] ĊĠĠĠĠĠĠĠ Ġaggregate ( a Ġ+ Ġm Ġ+ Ġg Ġ+ Ġtransform . m 0 3 , Ġb Ġ+ Ġn Ġ+ Ġh Ġ+ Ġtransform . m 1 3 , Ġc Ġ+ Ġo Ġ+ Ġi Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( j Ġ+ Ġm Ġ+ Ġg Ġ+ Ġtransform . m 0 3 , Ġk Ġ+ Ġn Ġ+ Ġh Ġ+ Ġtransform . m 1 3 , Ġl Ġ+ Ġo Ġ+ Ġi Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( j Ġ+ Ġd Ġ+ Ġg Ġ+ Ġtransform . m 0 3 , Ġk Ġ+ Ġe Ġ+ Ġh Ġ+ Ġtransform . m 1 3 , Ġl Ġ+ Ġf Ġ+ Ġi Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( a Ġ+ Ġd Ġ+ Ġg Ġ+ Ġtransform . m 0 3 , Ġb Ġ+ Ġe Ġ+ Ġh Ġ+ Ġtransform . m 1 3 , Ġc Ġ+ Ġf Ġ+ Ġi Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( a Ġ+ Ġm Ġ+ Ġp Ġ+ Ġtransform . m 0 3 , Ġb Ġ+ Ġn Ġ+ Ġq Ġ+ Ġtransform . m 1 3 , Ġc Ġ+ Ġo Ġ+ Ġr Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( j Ġ+ Ġm Ġ+ Ġp Ġ+ Ġtransform . m 0 3 , Ġk Ġ+ Ġn Ġ+ Ġq Ġ+ Ġtransform . m 1 3 , Ġl Ġ+ Ġo Ġ+ Ġr Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( j Ġ+ Ġd Ġ+ Ġp Ġ+ Ġtransform . m 0 3 , Ġk Ġ+ Ġe Ġ+ Ġq Ġ+ Ġtransform . m 1 3 , Ġl Ġ+ Ġf Ġ+ Ġr Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġaggregate ( a Ġ+ Ġd Ġ+ Ġp Ġ+ Ġtransform . m 0 3 , Ġb Ġ+ Ġe Ġ+ Ġq Ġ+ Ġtransform . m 1 3 , Ġc Ġ+ Ġf Ġ+ Ġr Ġ+ Ġtransform . m 2 3 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ } Ċ