/* Ċ Ġ* Ġ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 Ġcom . zyn aps . graphics Ċ Ċ import Ġcom . zyn aps . math . Matrix 4 Ċ import Ġcom . zyn aps . math . Scalar . ceil Ċ import Ġcom . zyn aps . math . Scalar . clamp Ċ import Ġcom . zyn aps . math . Scalar . min Ċ import Ġcom . zyn aps . math . Scalar . max Ċ import Ġcom . zyn aps . math . Vector 3 Ċ import Ġjava . awt . Color Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Fork Join Pool Ċ Ċ @ Suppress (" unused ", Ġ" Has Platform Type ") Ċ class ĠVisual izer ( private Ġval Ġbitmap : ĠBitmap , Ġprivate Ġval Ġshadow Size : ĠInt ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdepth Buffer Ġ= ĠFloat Array ( bitmap . width Ġ* Ġbitmap . height ) ĊĠĠĠ Ġprivate Ġval Ġshadow Buffer Ġ= ĠFloat Array ( shadow Size Ġ* Ġshadow Size ) ĊĠĠĠ Ġprivate Ġval Ġfr ustum Ġ= ĠF rust um () ĊĠĠĠ Ġprivate Ġval Ġshadow Fr ustum Ġ= ĠF rust um () ĊĠĠĠ Ġprivate Ġval Ġraster izer Ġ= ĠDevice ( bitmap . pixels , Ġdepth Buffer , Ġbitmap . width , Ġbitmap . height ) ĊĠĠĠ Ġprivate Ġval Ġshadow Raster izer Ġ= ĠDevice ( IntArray ( 0 ), Ġshadow Buffer , Ġshadow Size , Ġshadow Size ) ĊĠĠĠ Ġprivate Ġval Ġlight Camera Ġ= ĠCamera () ĊĠĠĠ Ġprivate Ġvar Ġambient Ġ= Ġ 1 2 8 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlight Direction Ġ= ĠVector 3 . normalize ( Vector 3 (- 0 . 9 5 F , Ġ 2 F , Ġ 1 F )) ĊĠĠĠĠĠĠĠ Ġlight Camera . far Plane Ġ= Ġ 3 0 0 F ĊĠĠĠĠĠĠĠ Ġlight Camera . moveTo ( light Direction . x Ġ* Ġ 2 0 , Ġlight Direction . y Ġ* Ġ 2 0 , Ġlight Direction . z Ġ* Ġ 2 0 ) ĊĠĠĠĠĠĠĠ Ġlight Camera . look At ( 0 F , Ġ 0 F , Ġ 0 F ) ĊĊĠĠĠĠĠĠĠ Ġraster izer . move Light ( light Direction . x , Ġlight Direction . y , Ġlight Direction . z ) ĊĠĠĠĠĠĠĠ Ġshadow Raster izer . c ull Ġ= ĠC ull Mode . FRONT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġambient Intensity ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġambient Ġ/ Ġ 2 5 5 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġambient Ġ= Ġ( clamp ( value ) Ġ* Ġ 2 5 5 F ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġbackground Ġ= ĠColor . BLACK ĊĊĠĠĠ Ġfun Ġrender ( scene : ĠScene , Ġcamera : ĠCamera ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġor tho graphic Ġ= ĠMatrix 4 . create Or tho graphic (- 1 0 F , Ġ 1 0 F , Ġ- 1 0 F , Ġ 1 0 F , Ġ 1 F , Ġ 3 0 F ) ĊĊĠĠĠĠĠĠĠ ĠFork Join Pool . common Pool (). invoke All ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Fr ustum . configure ( light Camera . view Matrix , Ġor tho graphic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Raster izer . clear ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Raster izer . view Ġ= Ġlight Camera . view Matrix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Raster izer . proj Ġ= Ġor tho graphic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene . render ( shadow Fr ustum , Ġshadow Raster izer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfr ustum . configure ( camera . view Matrix , Ġcamera . projection Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraster izer . clear ( background . rgb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraster izer . view Ġ= Ġcamera . view Matrix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraster izer . proj Ġ= Ġcamera . projection Matrix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene . render ( fr ustum , Ġraster izer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġpost Process ( camera . view Matrix , Ġcamera . projection Matrix , Ġlight Camera . view Matrix , Ġor tho graphic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Process ( camera View : ĠMatrix 4 , Ġcamera Proj : ĠMatrix 4 , Ġlight View : ĠMatrix 4 , Ġlight Proj : ĠMatrix 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcombined Ġ= Ġlight Proj Ġ* Ġlight View Ġ* ĠMatrix 4 . invert ( camera Proj Ġ* Ġcamera View ) ĊĠĠĠĠĠĠĠ Ġval Ġtwo Over Width Ġ= Ġ 2 F Ġ/ Ġbitmap . width ĊĠĠĠĠĠĠĠ Ġval Ġtwo Over Height Ġ= Ġ 2 F Ġ/ Ġbitmap . height ĊĠĠĠĠĠĠĠ Ġval Ġhalf Shadow Size Ġ= Ġshadow Size Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġshadow Size 1 Ġ= Ġshadow Size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġceil ( bitmap . height . toFloat () Ġ/ ĠCP US ) ĊĠĠĠĠĠĠĠ ĠFork Join Pool . common Pool (). invoke All (( 0 Ġuntil Ġbitmap . height Ġstep Ġsize ). map Indexed Ġ{ Ġ_, Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġit Ġuntil Ġit Ġ+ Ġmin ( size , Ġbitmap . height Ġ- Ġit )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsy Ġ= Ġ 1 Ġ- Ġy Ġ* Ġtwo Over Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmem Ġ= Ġy Ġ* Ġbitmap . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġbitmap . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġdepth Buffer [ mem ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsx Ġ= Ġx Ġ* Ġtwo Over Width Ġ- Ġ 1 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsz Ġ= Ġ 2 F Ġ* Ġz Ġ- Ġ 1 F ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtw Ġ= Ġ( combined . m 3 0 Ġ* Ġsx Ġ+ Ġcombined . m 3 1 Ġ* Ġsy Ġ+ Ġcombined . m 3 2 Ġ* Ġsz Ġ+ Ġcombined . m 3 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġ( combined . m 0 0 Ġ* Ġsx Ġ+ Ġcombined . m 0 1 Ġ* Ġsy Ġ+ Ġcombined . m 0 2 Ġ* Ġsz Ġ+ Ġcombined . m 0 3 ) Ġ/ Ġtw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġ( combined . m 1 0 Ġ* Ġsx Ġ+ Ġcombined . m 1 1 Ġ* Ġsy Ġ+ Ġcombined . m 1 2 Ġ* Ġsz Ġ+ Ġcombined . m 1 3 ) Ġ/ Ġtw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtz Ġ= Ġ( combined . m 2 0 Ġ* Ġsx Ġ+ Ġcombined . m 2 1 Ġ* Ġsy Ġ+ Ġcombined . m 2 2 Ġ* Ġsz Ġ+ Ġcombined . m 2 3 ) Ġ/ Ġtw ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnx Ġ= Ġ( 1 Ġ+ Ġtx ) Ġ* Ġhalf Shadow Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġny Ġ= Ġ( 1 Ġ- Ġty ) Ġ* Ġhalf Shadow Size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlit Ġ= Ġambient ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiffuse Ġ= Ġbitmap . pixels [ mem ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nx Ġ> Ġ 1 Ġ&& Ġnx Ġ< Ġshadow Size 1 Ġ&& Ġny Ġ> Ġ 1 Ġ&& Ġny Ġ< Ġshadow Size 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnz Ġ= Ġ( 1 F Ġ+ Ġtz ) Ġ* Ġ 0 . 5 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs mem 1 Ġ= Ġny . toInt () Ġ* Ġshadow Size Ġ+ Ġnx . toInt () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs mem 0 Ġ= Ġs mem 1 Ġ- Ġshadow Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs mem 2 Ġ= Ġs mem 1 Ġ+ Ġshadow Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 0 Ġ+ Ġ 0 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 0 Ġ+ Ġ 1 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 0 Ġ+ Ġ 2 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 1 Ġ+ Ġ 0 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 1 Ġ+ Ġ 1 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 2 Ġ+ Ġ 0 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 2 Ġ+ Ġ 1 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġif Ġ( nz Ġ< Ġshadow Buffer [ s mem 2 Ġ+ Ġ 2 ]) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacc Ġ= Ġa Ġ+ Ġb Ġ+ Ġc Ġ+ Ġd Ġ+ Ġe Ġ+ Ġf Ġ+ Ġg Ġ+ Ġh ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlit Ġ= Ġmin ( 0 xFF , Ġ( diffuse Ġshr Ġ 2 4 Ġand Ġ 0 xFF ) Ġ* Ġacc Ġshr Ġ 3 ) Ġ+ Ġambient ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġred Ġ= Ġmax ( 0 , Ġmin ( 2 5 5 , Ġ( diffuse Ġshr Ġ 0 x 1 0 Ġand Ġ 2 5 5 ) Ġ* Ġlit Ġshr Ġ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgr n Ġ= Ġmax ( 0 , Ġmin ( 2 5 5 , Ġ( diffuse Ġshr Ġ 0 x 0 8 Ġand Ġ 2 5 5 ) Ġ* Ġlit Ġshr Ġ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbl u Ġ= Ġmax ( 0 , Ġmin ( 2 5 5 , Ġ( diffuse Ġshr Ġ 0 x 0 0 Ġand Ġ 2 5 5 ) Ġ* Ġlit Ġshr Ġ 8 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . pixels [ mem ] Ġ= Ġ 2 5 5 . sh l ( 2 4 ) Ġor Ġred . sh l ( 1 6 ) Ġor Ġgr n . sh l ( 8 ) Ġor Ġbl u ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ mem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠCP US Ġ= ĠRuntime . get Runtime (). available Processors () ĊĠĠĠ Ġ} Ċ } Ċ