/* Ċ Ġ* Ġ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 . core Ċ Ċ import Ġengine . math . Fr ustum Ċ import Ġengine . math . Matrix 4 Ċ import Ġengine . math . Scalar Ċ import Ġengine . math . Vector 3 Ċ import Ġorg . kh ronos . webgl . Float 3 2 Array Ċ import Ġorg . kh ronos . webgl . get Ċ import Ġorg . kh ronos . webgl . set Ċ import Ġkotlin . math . asin Ċ import Ġkotlin . math . atan 2 Ċ Ċ @ Suppress (" unused ", Ġ" Member Visibility Can Be Private ") Ċ class ĠCamera ( fo v : ĠFloat Ġ= ĠScalar . PI Ġ/ Ġ 4 F , Ġaspect Ratio : ĠFloat Ġ= Ġ 1 F , Ġnear Plane : ĠFloat Ġ= Ġ 1 F , Ġfar Plane : ĠFloat Ġ= Ġ 1 0 0 0 F ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġeye Pos Ġ= ĠFloat 3 2 Array ( array Of ( 0 F , Ġ 0 F , Ġ 1 F )) ĊĠĠĠ Ġprivate Ġval Ġlook At Ġ= ĠFloat 3 2 Array ( array Of ( 0 F , Ġ 0 F , Ġ 0 F )) ĊĠĠĠ Ġprivate Ġval Ġworld Up Ġ= ĠFloat 3 2 Array ( array Of ( 0 F , Ġ 1 F , Ġ 0 F )) ĊĠĠĠ Ġprivate Ġvar Ġview Matrix Ġ= ĠMatrix 4 . IDENTITY ĊĠĠĠ Ġprivate Ġvar Ġproj Matrix Ġ= ĠMatrix 4 . IDENTITY ĊĠĠĠ Ġprivate Ġvar Ġcam Fr ustum Ġ= ĠF rust um ( view Matrix , Ġproj Matrix ) ĊĠĠĠ Ġprivate Ġvar Ġdirty Ġ= Ġtrue ĊĊĠĠĠ Ġvar Ġfield Of View Ġ= Ġf ov ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue . coerce In ( Float . MIN _ VALUE , ĠScalar . PI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġaspect Ratio Ġ= Ġaspect Ratio ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue . coerce In ( Float . MIN _ VALUE , ĠFloat . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġnear Distance Ġ= Ġnear Plane ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue . coerce In ( Float . MIN _ VALUE , ĠFloat . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( near Distance Ġ>= Ġfar Distance ) Ġthrow ĠRuntimeException (" near Ġdistance Ġmust Ġbe Ġless Ġthan Ġfar Ġdistance ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġfar Distance Ġ= Ġfar Plane ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue . coerce In ( Float . MIN _ VALUE , ĠFloat . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( far Distance Ġ<= Ġnear Distance ) Ġthrow ĠRuntimeException (" far Ġdistance Ġmust Ġbe Ġgreater Ġthan Ġnear Ġdistance ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġposition ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠVector 3 ( eye Pos ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toArray ( eye Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtarget ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠVector 3 ( look At ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toArray ( look At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġup ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠVector 3 ( world Up ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 . normalize ( value ). toArray ( world Up ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfr ustum Ġget () Ġ= Ġre generate Matrix (). run Ġ{ Ġcam Fr ustum Ġ} ĊĊĠĠĠ Ġval Ġdirection Ġget () Ġ= ĠVector 3 . normalize ( Vector 3 ( look At [ 0 ] Ġ- Ġeye Pos [ 0 ], Ġlook At [ 1 ] Ġ- Ġeye Pos [ 1 ], Ġlook At [ 2 ] Ġ- Ġeye Pos [ 2 ])) ĊĊĠĠĠ Ġval Ġyaw Ġget () Ġ= Ġ- atan 2 (- view . m 2 0 , Ġview . m 2 2 ) ĊĠĠĠ Ġval Ġpitch Ġget () Ġ= Ġ- asin ( view . m 2 1 ) ĊĊĠĠĠ Ġval Ġview Ġget () Ġ= Ġre generate Matrix (). run Ġ{ Ġview Matrix Ġ} ĊĠĠĠ Ġval Ġprojection Ġget () Ġ= Ġre generate Matrix (). run Ġ{ Ġproj Matrix Ġ} ĊĊĠĠĠ Ġfun Ġmove Up ( amount : ĠFloat ) Ġ= Ġmove Down (- amount ) ĊĠĠĠ Ġfun Ġmove Down ( amount : ĠFloat ) Ġ= Ġstr afe ( view . m 1 0 Ġ* Ġamount , Ġview . m 1 1 Ġ* Ġamount , Ġview . m 1 2 Ġ* Ġamount ) ĊĊĠĠĠ Ġfun Ġmove Backward ( amount : ĠFloat ) Ġ= Ġmove Forward (- amount ) ĊĠĠĠ Ġfun Ġmove Forward ( amount : ĠFloat ) Ġ= Ġstr afe ( view . m 2 0 Ġ* Ġamount , Ġview . m 2 1 Ġ* Ġamount , Ġview . m 2 2 Ġ* Ġamount ) ĊĊĠĠĠ Ġfun Ġmove Right ( amount : ĠFloat ) Ġ= Ġmove Left (- amount ) ĊĠĠĠ Ġfun Ġmove Left ( amount : ĠFloat ) Ġ= Ġstr afe ( view . m 0 0 Ġ* Ġamount , Ġview . m 0 1 Ġ* Ġamount , Ġview . m 0 2 Ġ* Ġamount ) ĊĊĠĠĠ Ġfun Ġorient ( dir : ĠVector 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlook At [ 0 ] Ġ= Ġeye Pos [ 0 ] Ġ+ Ġdir . x ĊĠĠĠĠĠĠĠ Ġlook At [ 1 ] Ġ= Ġeye Pos [ 1 ] Ġ+ Ġdir . y ĊĠĠĠĠĠĠĠ Ġlook At [ 2 ] Ġ= Ġeye Pos [ 2 ] Ġ+ Ġdir . z ĊĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstr afe ( dx : ĠFloat , Ġdy : ĠFloat , Ġdz : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeye Pos [ 0 ] Ġ-= Ġdx ĊĠĠĠĠĠĠĠ Ġeye Pos [ 1 ] Ġ-= Ġdy ĊĠĠĠĠĠĠĠ Ġeye Pos [ 2 ] Ġ-= Ġdz ĊĠĠĠĠĠĠĠ Ġlook At [ 0 ] Ġ-= Ġdx ĊĠĠĠĠĠĠĠ Ġlook At [ 1 ] Ġ-= Ġdy ĊĠĠĠĠĠĠĠ Ġlook At [ 2 ] Ġ-= Ġdz ĊĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre generate Matrix () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dirty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Matrix Ġ= ĠMatrix 4 . create Look At ( position , Ġtarget , Ġup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproj Matrix Ġ= ĠMatrix 4 . create Perspective F ov ( field Of View , Ġaspect Ratio , Ġnear Distance , Ġfar Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcam Fr ustum Ġ= ĠF rust um ( view Matrix , Ġproj Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ