package Ġorg . open rnd r . extra . dn k 3 Ċ Ċ import Ġorg . open rnd r . draw . RenderTarget Ċ import Ġorg . open rnd r . math . Matrix 4 4 Ċ Ċ sealed Ġclass ĠShadow s Ġ{ ĊĠĠĠ Ġobject ĠNone Ġ: ĠShadow s () ĊĠĠĠ Ġabstract Ġclass ĠM apped Shadow s ( val Ġmap Size : ĠInt ) Ġ: ĠShadow s () ĊĠĠĠ Ġabstract Ġclass ĠDepth Mapped Shadow s ( map Size : ĠInt ) Ġ: ĠM apped Shadow s ( map Size ) ĊĠĠĠ Ġabstract Ġclass ĠColor Mapped Shadow s ( map Size : ĠInt ) Ġ: ĠM apped Shadow s ( map Size ) ĊĠĠĠ Ġclass ĠSimple ( map Size : ĠInt Ġ= Ġ 1 0 2 4 ) Ġ: ĠDepth Mapped Shadow s ( map Size ) ĊĠĠĠ Ġclass ĠP CF ( map Size : ĠInt Ġ= Ġ 1 0 2 4 , Ġval Ġsample Count : ĠInt Ġ= Ġ 1 2 ) Ġ: ĠDepth Mapped Shadow s ( map Size ) ĊĠĠĠ Ġclass ĠV SM ( map Size : ĠInt Ġ= Ġ 1 0 2 4 ) Ġ: ĠColor Mapped Shadow s ( map Size ) Ċ } Ċ Ċ interface ĠShadow Light Ġ{ ĊĠĠĠ Ġvar Ġshadow s : ĠShadow s ĊĠĠĠ Ġfun Ġprojection ( render Target : ĠRender Target ): ĠMatrix 4 4 ĊĠĠĠ Ġfun Ġview ( node : ĠScene Node ): ĠMatrix 4 4 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . world Transform . in versed ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġshaders Ċ Ċ fun ĠShadow s . V SM . fs ( index : ĠInt ) Ġ: ĠString Ġ= Ġ""" Ċ |{ Ċ | ĠĠ Ġvec 4 Ġsm c Ġ= Ġ( p _ light Transform $ index Ġ* Ġvec 4 ( v _ world Position , 1 . 0 )); Ċ | ĠĠ Ġvec 3 Ġlight Proj Ġ= Ġ( sm c . xyz / sm c . w ) Ġ* Ġ 0 . 5 Ġ+ Ġ 0 . 5 ; Ċ | ĠĠ Ġif Ġ( light Proj . x Ġ> Ġ 0 . 0 Ġ&& Ġlight Proj . x Ġ< Ġ 1 . 0 Ġ&& Ġlight Proj . y Ġ> Ġ 0 Ġ&& Ġlight Proj . y Ġ< Ġ 1 ) Ġ{ Ċ | ĠĠĠĠĠĠ Ġvec 2 Ġmoment s Ġ= Ġtexture ( p _ light Shadow Map $ index , Ġlight Proj . xy ). xy ; Ċ | ĠĠĠĠĠĠ Ġatt enuation Ġ*= Ġ( che by she v Upper Bound ( moment s , Ġlength ( Lr ), Ġ 5 0 . 0 )); Ċ | ĠĠ Ġ} Ċ |} Ċ """. trim Margin () Ċ Ċ fun ĠShadow s . Simple . fs ( index : ĠInt ): ĠString Ġ= Ġ""" Ċ |{ Ċ | ĠĠ Ġvec 4 Ġsm c Ġ= Ġ( p _ light Transform $ index Ġ* Ġvec 4 ( v _ world Position , 1 . 0 )); Ċ | ĠĠ Ġvec 3 Ġlight Proj Ġ= Ġ( sm c . xyz / sm c . w ) Ġ* Ġ 0 . 5 Ġ+ Ġ 0 . 5 ; Ċ | ĠĠ Ġif Ġ( light Proj . x Ġ> Ġ 0 . 0 Ġ&& Ġlight Proj . x Ġ< Ġ 1 . 0 Ġ&& Ġlight Proj . y Ġ> Ġ 0 Ġ&& Ġlight Proj . y Ġ< Ġ 1 ) Ġ{ Ċ | ĠĠĠĠĠĠ Ġvec 3 Ġsm z Ġ= Ġtexture ( p _ light Shadow Map $ index , Ġlight Proj . xy ). rgb ; Ċ | ĠĠĠĠĠĠ Ġvec 2 Ġstep Ġ= Ġ 1 . 0 Ġ/ Ġtexture Size ( p _ light Shadow Map $ index , 0 ); Ċ | ĠĠĠĠĠĠ Ġfloat Ġresult Ġ= Ġ 0 . 0 ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġcomp To Z Ġ= Ġ( light Proj . z - Ġ 0 . 0 0 2 0 Ġ* Ġtan ( acos ( No L ))) Ġ- Ġ 0 . 0 0 0 3 ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġcurrent Depth Ġ= Ġlight Proj . z ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġclosest Depth Ġ= Ġsm z . x ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġshadow Ġ= Ġ( current Depth Ġ- Ġ 0 . 0 0 2 0 Ġ* Ġtan ( acos ( No L ))) Ġ- Ġ 0 . 0 0 0 3 Ġ Ġ>= Ġclosest Depth Ġ Ġ? Ġ 0 . 0 Ġ: Ġ 1 . 0 ; Ċ | ĠĠĠĠĠĠ Ġatt enuation Ġ*= Ġshadow ; Ċ | ĠĠ Ġ} Ċ |} Ċ """. trim Margin () Ċ Ċ fun ĠShadow s . PC F . fs ( index : ĠInt ): ĠString Ġ= Ġ""" Ċ |{ Ċ | ĠĠ Ġfloat Ġl rl Ġ= Ġlength ( Lr )/ 1 0 0 . 0 ; Ċ | ĠĠ Ġvec 2 Ġf T aps _ Po isson [ 1 2 ]; Ċ | ĠĠ Ġf T aps _ Po isson [ 0 ] Ġ Ġ= Ġvec 2 (- . 3 2 6 ,- . 4 0 6 ); Ċ | ĠĠ Ġf T aps _ Po isson [ 1 ] Ġ Ġ= Ġvec 2 (- . 8 4 0 ,- . 0 7 4 ); Ċ | ĠĠ Ġf T aps _ Po isson [ 2 ] Ġ Ġ= Ġvec 2 (- . 6 9 6 , Ġ. 4 5 7 ); Ċ | ĉ f T aps _ Po isson [ 3 ] Ġ Ġ= Ġvec 2 (- . 2 0 3 , Ġ. 6 2 1 ); Ċ | ĉ f T aps _ Po isson [ 4 ] Ġ Ġ= Ġvec 2 ( Ġ. 9 6 2 ,- . 1 9 5 ); Ċ | ĉ f T aps _ Po isson [ 5 ] Ġ Ġ= Ġvec 2 ( Ġ. 4 7 3 ,- . 4 8 0 ); Ċ | ĉ f T aps _ Po isson [ 6 ] Ġ Ġ= Ġvec 2 ( Ġ. 5 1 9 , Ġ. 7 6 7 ); Ċ | ĉ f T aps _ Po isson [ 7 ] Ġ Ġ= Ġvec 2 ( Ġ. 1 8 5 ,- . 8 9 3 ); Ċ | ĉ f T aps _ Po isson [ 8 ] Ġ Ġ= Ġvec 2 ( Ġ. 5 0 7 , Ġ. 0 6 4 ); Ċ | ĉ f T aps _ Po isson [ 9 ] Ġ Ġ= Ġvec 2 ( Ġ. 8 9 6 , Ġ. 4 1 2 ); Ċ | ĉ f T aps _ Po isson [ 1 0 ] Ġ= Ġvec 2 (- . 3 2 2 ,- . 9 3 3 ); Ċ | ĉ f T aps _ Po isson [ 1 1 ] Ġ= Ġvec 2 (- . 7 9 2 ,- . 5 9 8 ); Ċ | ĠĠ Ġvec 4 Ġsm c Ġ= Ġ( p _ light Transform $ index Ġ* Ġvec 4 ( v _ world Position , 1 . 0 )); Ċ | ĠĠ Ġvec 3 Ġlight Proj Ġ= Ġ( sm c . xyz / sm c . w ) Ġ* Ġ 0 . 5 Ġ+ Ġ 0 . 5 ; Ċ | ĠĠ Ġif Ġ( light Proj . x Ġ> Ġ 0 . 0 Ġ&& Ġlight Proj . x Ġ< Ġ 1 . 0 Ġ&& Ġlight Proj . y Ġ> Ġ 0 Ġ&& Ġlight Proj . y Ġ< Ġ 1 ) Ġ{ Ċ | ĠĠĠĠĠĠ Ġvec 3 Ġsm z Ġ= Ġtexture ( p _ light Shadow Map $ index , Ġlight Proj . xy ). rgb ; Ċ | ĠĠĠĠĠĠ Ġvec 2 Ġstep Size Ġ= Ġ 1 . 0 Ġ/ Ġtexture Size ( p _ light Shadow Map $ index , 0 ); Ċ | ĠĠĠĠĠĠ Ġfloat Ġresult Ġ= Ġ 0 . 0 ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġcomp To Z Ġ= Ġ( light Proj . z - Ġ 0 . 0 0 2 0 Ġ* Ġtan ( acos ( No L ))) Ġ- Ġ 0 . 0 0 0 3 ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġnoise Ġ= Ġhash 2 2 ( light Proj . xy * 1 0 . 0 ). x ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġr Ġ= Ġnoise Ġ* Ġ 3 . 1 4 1 5 9 2 6 5 3 5 Ġ* Ġ 2 . 0 ; Ċ | ĠĠĠĠĠĠ Ġmat 2 Ġrot Ġ= Ġmat 2 ( Ġvec 2 ( cos ( r ), Ġ- sin ( r )), Ġvec 2 ( sin ( r ), cos ( r ))); Ċ | ĠĠĠĠĠĠ Ġfor Ġ( int Ġi Ġ= Ġ 0 ; Ġi Ġ< Ġ 1 2 ; Ġ++ i ) Ġ{ Ċ | ĠĠĠĠĠĠĠĠĠĠ Ġfloat Ġdepth Ġ= Ġtexture ( p _ light Shadow Map $ index , Ġlight Proj . xy Ġ+ Ġrot * f T aps _ Po isson [ i ]* i * l rl * step Size Ġ). r ; Ċ | ĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġstep ( comp To Z , Ġdepth ); Ċ | ĠĠĠĠĠĠ Ġ} Ċ | ĠĠĠĠĠĠ Ġresult Ġ/= Ġ 1 2 ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġcurrent Depth Ġ= Ġlight Proj . z ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġclosest Depth Ġ= Ġsm z . x ; Ċ | ĠĠĠĠĠĠ Ġfloat Ġshadow Ġ= Ġresult ;// Ġ( current Depth Ġ- Ġ 0 . 0 0 2 0 Ġ* Ġtan ( acos ( No L ))) Ġ- Ġ 0 . 0 0 0 3 Ġ Ġ>= Ġclosest Depth Ġ Ġ? Ġ 0 . 0 Ġ: Ġ 1 . 0 ; Ċ | ĠĠĠĠĠĠ Ġatt enuation Ġ*= Ġshadow ; Ċ | ĠĠ Ġ} Ċ |} Ċ """. trim Margin () Ċ Ċ fun ĠShadow s . fs ( index : ĠInt ): ĠString Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠShadow s . PC F Ġ-> Ġthis . fs ( index ) ĊĠĠĠ Ġis ĠShadow s . Simple Ġ-> Ġthis . fs ( index ) ĊĠĠĠ Ġis ĠShadow s . V SM Ġ-> Ġthis . fs ( index ) ĊĠĠĠ Ġis ĠShadow s . None Ġ-> Ġ"" ĊĠĠĠ Ġelse Ġ-> ĠTODO () Ċ } Ċ