/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAnt on ĠTr ush kov Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . ks df v . the le ma . test Ċ Ċ import Ġorg . ks df v . the le ma . app . APP Ċ import Ġorg . ks df v . the le ma . g 3 d . cam . Camera Ċ import Ġorg . ks df v . the le ma . g 3 d . cam . Orbit Camera Control Ċ import Ġorg . ks df v . the le ma . gl . GL Ċ import Ġorg . ks df v . the le ma . gl . GL _ COLOR _ BUFFER _ BIT Ċ import Ġorg . ks df v . the le ma . gl . GL _ DEPTH _ BUFFER _ BIT Ċ import Ġorg . ks df v . the le ma . input . KB Ċ import Ġorg . ks df v . the le ma . math .* Ċ import Ġorg . ks df v . the le ma . mesh . IM esh Ċ import Ġorg . ks df v . the le ma . mesh . Mesh Ċ import Ġorg . ks df v . the le ma . mesh . gen . Fr ustum Mesh Builder Ċ import Ġorg . ks df v . the le ma . shader . Shader Ċ import Ġorg . ks df v . the le ma . utils . Color Ċ import Ġorg . ks df v . the le ma . utils . LOG Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ġ@ author Ġz eg an styl Ġ*/ Ċ class ĠCas ca ded Shadow Mat rices Test : ĠTest Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Cas ca ded Ġshadow Ġmatrices " ĊĊĠĠĠ Ġval Ġlight Direction Ġ= ĠVec 3 ( 1 f , Ġ- 1 f , Ġ- 1 f ). nor () ĊĠĠĠ Ġval Ġlight Position Offset Ġ= Ġ 0 f ĊĊĠĠĠ Ġval Ġnum Cas ca des Ġ= Ġ 2 ĊĠĠĠ Ġval Ġcascade End Ġ= ĠarrayOf ( 0 . 1 f , Ġ 5 f , Ġ 1 0 f ) ĊĠĠĠ Ġval Ġlight View Ġ= ĠMat 4 (). set To Look ( MATH . Zero 3 , Ġlight Direction , ĠM ATH . Y ) ĊĊĠĠĠ Ġval Ġscene Camera Fr ustum Points Ġ= ĠArray < Mutable List < IV ec 3 >>( num Cas ca des ) Ġ{ ĊĠĠĠĠĠĠĠ ĠArrayList < IV ec 3 >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Vec 3 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcascade Fr ust ums Ġ= ĠArray ( num Cas ca des ) Ġ{ ĠF rust um () Ġ} ĊĊĠĠĠ Ġval Ġscene Camera Fr ustum Mes hes Ġ= ĠArray < IM esh >( num Cas ca des ) Ġ{ ĠMesh () Ġ} ĊĠĠĠ Ġval Ġcascade Fr ustum Mes hes Ġ= ĠArray < IM esh >( num Cas ca des ) Ġ{ ĠMesh () Ġ} ĊĊĠĠĠ Ġval Ġlight Proj Ġ= ĠArray < IM at 4 >( num Cas ca des ) Ġ{ ĠMat 4 () Ġ} ĊĊĠĠĠ Ġval Ġtmp Mat Ġ= ĠMat 4 () ĊĠĠĠ Ġval Ġtmp Vec Ġ= ĠVec 3 () ĊĠĠĠ Ġval Ġcentroid Ġ= ĠVec 3 () ĊĊĠĠĠ Ġval Ġscene Camera Ġ= ĊĠĠĠĠĠĠĠ ĠCamera ( near Ġ= Ġ 0 . 1 f , Ġfar Ġ= Ġ 1 0 f , Ġis Or tho graphic Ġ= Ġfalse ) ĊĠĠĠ Ġval Ġscene Camera Fr ustum Ġ= ĠF rust um ( scene Camera . inverse View Projection Matrix ) ĊĊĠĠĠ Ġfun Ġupdate Fr ust ums () Ġ{ ĊĠĠĠĠĠĠĠ Ġscene Camera . update () ĊĠĠĠĠĠĠĠ Ġscene Camera Fr ustum . update ( scene Camera . inverse View Projection Matrix ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscene Camera Fr ustum Points Ġ= Ġscene Camera Fr ustum . points ĊĠĠĠĠĠĠĠ Ġval Ġcam Far Sub Near Ġ= Ġscene Camera . far Ġ- Ġscene Camera . near ĊĊĠĠĠĠĠĠĠ Ġlight View . set To Look ( scene Camera . position , Ġlight Direction , ĠM ATH . Y ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Cas ca des ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Near Ġ= Ġcascade End [ i ] Ġ/ Ġcam Far Sub Near ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfr ustum Points Ġ= Ġthis . scene Camera Fr ustum Points [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid . set ( 0 f , Ġ 0 f , Ġ 0 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Z Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Z Ġ= ĠFloat . MIN _ VALUE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġfr ustum Points [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . set ( scene Camera Fr ustum Points [ j ]). lerp ( scene Camera Fr ustum Points [ j Ġ+ Ġ 4 ], Ġalpha Near ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid . add ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Z Ġ= Ġmin ( min Z , Ġp . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Z Ġ= Ġmax ( max Z , Ġp . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Far Ġ= Ġcascade End [ i Ġ+ Ġ 1 ] Ġ/ Ġcam Far Sub Near ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġfr ustum Points [ j Ġ+ Ġ 4 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . set ( scene Camera Fr ustum Points [ j ]). lerp ( scene Camera Fr ustum Points [ j Ġ+ Ġ 4 ], Ġalpha Far ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid . add ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Z Ġ= Ġmin ( min Z , Ġp . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Z Ġ= Ġmax ( max Z , Ġp . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġscene Ġcamera Ġfr ustum Ġpart ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF rust um Mesh Builder . update Mesh ( scene Camera Fr ustum Mes hes [ i ], Ġfr ustum Points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Camera Fr ustum Mes hes [ i ]. vertices ?. load Buffer To Gpu () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid . scl ( 0 . 1 2 5 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlight View . set To Look ( centroid , Ġlight Direction , ĠM ATH . Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax X Ġ= ĠFloat . MIN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Y Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Y Ġ= ĠFloat . MIN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Z Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Z Ġ= ĠFloat . MIN _ VALUE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv W Ġ= Ġfr ustum Points [ j ]. mul ( light View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin X Ġ= Ġmin ( min X , Ġv W . x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax X Ġ= Ġmax ( max X , Ġv W . x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Y Ġ= Ġmin ( min Y , Ġv W . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Y Ġ= Ġmax ( max Y , Ġv W . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Z Ġ= Ġmin ( min Z , Ġv W . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Z Ġ= Ġmax ( max Z , Ġv W . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Mat Ġ= Ġlight Proj [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlight Mat . set To Or tho ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġmin X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġmax X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġmin Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġmax Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnear Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfar Ġ= Ġmax Z Ġ- Ġmin Z Ġ+ Ġlight Position Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Mat . set To Look ( tmp Vec . set ( light Direction ). scl (- max Z Ġ- Ġlight Position Offset ). add ( centroid ), Ġlight Direction , ĠM ATH . Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlight Mat . mul ( tmp Mat ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcascade Fr ust ums [ i ]. update ( tmp Mat . set ( light Mat ). inv ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF rust um Mesh Builder . update Mesh ( cascade Fr ustum Mes hes [ i ], Ġcascade Fr ust ums [ i ]. points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcascade Fr ustum Mes hes [ i ]. vertices ?. load Buffer To Gpu () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtest Main () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġshader Ġ= ĠShader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvert Code Ġ= Ġ""" Ċ attribute Ġvec 3 Ġa Position ; Ċ uniform Ġmat 4 Ġview Proj ; Ċ Ċ void Ġmain Ġ() Ġ{ ĊĠĠĠ Ġgl _ Position Ġ= Ġview Proj Ġ* Ġvec 4 ( a Position , Ġ 1 . 0 ); Ċ } """, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrag Code Ġ= Ġ""" Ċ uniform Ġvec 4 Ġcolor ; Ċ void Ġmain Ġ() Ġ{ ĊĠĠĠ Ġgl _ Frag Color Ġ= Ġcolor ; Ċ } """) ĊĊĠĠĠĠĠĠĠ Ġval Ġcolors Ġ= ĠarrayOf ( Color . OR ANGE , ĠColor . GREEN , ĠColor . CY AN , ĠColor . OL IVE , ĠColor . PIN K ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġscene Camera Fr ustum Mes hes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Camera Fr ustum Mes hes [ i ] Ġ= ĠF rust um Mesh Builder ( scene Camera Fr ustum Points [ i ]). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcascade Fr ustum Mes hes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcascade Fr ustum Mes hes [ i ] Ġ= ĠF rust um Mesh Builder ( cascade Fr ust ums [ i ]. points ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Fr ust ums () ĊĊĠĠĠĠĠĠĠ Ġval Ġcamera Ġ= ĠCamera ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= ĠVec 3 ( 3 f , Ġ 3 f , Ġ- 3 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= ĠVec 3 ( 0 f , Ġ 0 f , Ġ 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnear Ġ= Ġ 0 . 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfar Ġ= Ġ 1 0 0 f ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= ĠOr bit Camera Control ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġcamera , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz en ith Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaz imuth Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= ĠVec 3 ( 1 0 f , Ġ 3 f , Ġ 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Distance Ġ= Ġ 1 0 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcontrol . listen To Mouse () ĊĠĠĠĠĠĠĠ ĠLOG . info ( control . help ) ĊĊĠĠĠĠĠĠĠ ĠLOG . info (" Use ĠW ĠA ĠS ĠD Ġkeys Ġto Ġmove Ġobject ") ĊĊĠĠĠĠĠĠĠ Ġval Ġquaternion Ġ= ĠVec 4 () ĊĊĠĠĠĠĠĠĠ ĠGL . gl Clear Color ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ ĠGL . render Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear ( GL _ COLOR _ BUFFER _ BIT Ġor ĠGL _ DEPTH _ BUFFER _ BIT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠAPP . deltaTime ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol . update ( delta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . update () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( KB . is Key Pressed ( KB . A )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion . set Quaternion By Axis ( x Ġ= Ġ 0 f , Ġy Ġ= Ġ 1 f , Ġz Ġ= Ġ 0 f , Ġdelta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion . rotate Vec 3 ( scene Camera . direction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fr ust ums () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( KB . is Key Pressed ( KB . D )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion . set Quaternion By Axis ( x Ġ= Ġ 0 f , Ġy Ġ= Ġ 1 f , Ġz Ġ= Ġ 0 f , Ġ- delta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion . rotate Vec 3 ( scene Camera . direction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fr ust ums () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( KB . is Key Pressed ( KB . W )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Camera . position . add ( tmp Vec . set ( scene Camera . direction ). scl ( delta Ġ* Ġ 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fr ust ums () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( KB . is Key Pressed ( KB . S )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Camera . position . sub ( tmp Vec . set ( scene Camera . direction ). scl ( delta Ġ* Ġ 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fr ust ums () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshader . bind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshader [" view Proj "] Ġ= Ġcamera . view Projection Matrix ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġscene Camera Fr ustum Mes hes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshader [" color "] Ġ= Ġcolors [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Camera Fr ustum Mes hes [ i ]. render ( shader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcascade Fr ustum Mes hes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshader [" color "] Ġ= Ġcolors [ i Ġ+ Ġscene Camera Fr ustum Mes hes . size ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcascade Fr ustum Mes hes [ i ]. render ( shader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }