package Ġsilent orb . my th ic . f ath om . sampling Ċ Ċ import Ġsilent orb . my th ic . f ath om . misc . get Normal Ċ import Ġsilent orb . my th ic . f ath om . surf acing . Grid Bounds Ċ import Ġsilent orb . my th ic . f ath om . surf acing . snap To Surface In cluding Normal Ċ import Ġsilent orb . my th ic . im aging . text uring . anonymous Sampler Ċ import Ġsilent orb . my th ic . spatial . Vector 2 Ċ import Ġsilent orb . my th ic . spatial . Vector 3 Ċ import Ġsilent orb . my th ic . spatial . Vector 3 i Ċ import Ġsilent orb . my th ic . spatial . to Vector 3 Ċ import Ġkotlin . math . abs Ċ Ċ val Ġsub division Template : ĠList < Vector 3 > Ġ= Ġ(- 1 .. 1 Ġstep Ġ 2 ). flatMap Ġ{ Ġz Ġ-> ĊĠ Ġ(- 1 .. 1 Ġstep Ġ 2 ). flatMap Ġ{ Ġy Ġ-> ĊĠĠĠ Ġ(- 1 .. 1 Ġstep Ġ 2 ). map Ġ{ Ġx Ġ-> ĊĠĠĠĠĠ ĠVector 3 ( x . toFloat (), Ġy . toFloat (), Ġz . toFloat ()) Ġ/ Ġ 2 f ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġsample Point ( config : ĠS ampling Config , Ġlevel Ranges : ĠList < Float >, Ġcell Length : ĠFloat , Ġlevel : ĠInt , Ġstart : ĠVector 3 ): ĠList < Sample Point > Ġ{ ĊĠ Ġval Ġsample Range Ġ= Ġlevel Ranges [ level ] ĊĠ Ġval Ġget Distance Ġ= Ġconfig . get Distance ĊĠ Ġval Ġget Shading Ġ= Ġconfig . get Shading ĊĠ Ġval Ġ(_, Ġstarting Distance ) Ġ= Ġget Distance ( start ) ĊĠ Ġval Ġabs Distance Ġ= Ġabs ( starting Distance ) ĊĊĠ Ġreturn Ġif Ġ( abs Distance Ġ> Ġsample Range ) Ġ{ ĊĠĠĠ Ġif Ġ( level Ġ== Ġ 0 Ġ&& Ġstarting Distance Ġ< Ġ- sample Range ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlocation Ġ= Ġstart ĊĠĠĠĠĠ Ġval Ġnormal Ġ= Ġget Normal ( get Distance , Ġstart ) ĊĠĠĠĠĠ Ġval Ġsh ading Ġ= Ġget Shading ( location ) ĊĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠ ĠSample Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ= Ġnormal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh ading Ġ= Ġsh ading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġconfig . point Size Scale Ġ* Ġcell Length Ġ* Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġlevel ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠ ĠlistOf () ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġval Ġnew Point List Ġ= Ġif Ġ( abs Distance Ġ> Ġsample Range Ġ/ Ġ 2 f ) ĊĠĠĠĠĠ ĠlistOf () ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġ( id , Ġlocation , Ġnormal ) Ġ= Ġsnap To Surface In cluding Normal ( get Distance , Ġstart ) ĊĠĠĠĠĠ Ġif Ġ( location . distance ( start ) Ġ> Ġcell Length Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsh ading Ġ= Ġget Shading ( location ) ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSample Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ= Ġnormal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh ading Ġ= Ġsh ading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġconfig . point Size Scale Ġ* Ġcell Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( level Ġ< Ġconfig . levels Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnext Resolution Ġ= Ġcell Length Ġ/ Ġ 2 f ĊĠĠĠĠĠ Ġval Ġnext Level Ġ= Ġlevel Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġnew Point List Ġ+ Ġsub division Template . flatMap Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠ Ġsample Point ( config , Ġlevel Ranges , Ġnext Resolution , Ġnext Level , Ġstart Ġ+ Ġoffset Ġ* Ġnext Resolution ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnew Point List ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġindex To Vector 3 i ( slice Size : ĠInt , Ġx Size : ĠInt , Ġindex : ĠInt ): ĠVector 3 i Ġ{ ĊĠ Ġval Ġz Ġ= Ġindex Ġ/ Ġslice Size ĊĠ Ġval Ġz Remain der Ġ= Ġindex Ġ- Ġslice Size Ġ* Ġz ĊĠ Ġval Ġy Ġ= Ġz Remain der Ġ/ Ġx Size ĊĠ Ġval Ġx Ġ= Ġz Remain der Ġ- Ġy Ġ* Ġx Size ĊĠ Ġreturn ĠVector 3 i ( x , Ġy , Ġz ) Ċ } Ċ Ċ fun Ġsample Cells ( config : ĠS ampling Config , Ġbounds : ĠGrid Bounds ): ĠCell Sampler Ġ{ ĊĠ Ġval Ġbounds Dimensions Ġ= Ġbounds . end Ġ- Ġbounds . start ĊĊĠ Ġ// ĠSometimes Ġintermediate Ġsdf Ġchanges Ġcan Ġcause Ġmass ive Ġspi kes Ġin Ġbounding Ġsize ĊĠ Ġif Ġ( bounds Dimensions . x Ġ> Ġ 1 0 0 Ġ|| Ġbounds Dimensions . y Ġ> Ġ 1 0 0 Ġ|| Ġbounds Dimensions . z Ġ> Ġ 1 0 0 ) ĊĠĠĠ Ġreturn ĠCell Sampler ( 0 ) Ġ{ ĠlistOf () Ġ} ĊĊĠ Ġval Ġstep Dimensions Ġ= Ġbounds Dimensions Ġ* Ġconfig . resolution ĊĠ Ġval Ġsample Count Ġ= Ġstep Dimensions . x Ġ* Ġstep Dimensions . y Ġ* Ġstep Dimensions . z ĊĠ Ġval Ġslice Size Ġ= Ġstep Dimensions . x Ġ* Ġstep Dimensions . y ĊĠ Ġval Ġstart Ġ= Ġbounds . start . to Vector 3 () ĊĠ Ġval Ġinitial Scale Ġ= Ġconfig . resolution . toFloat () ĊĊĠ Ġval Ġlevel Ranges Ġ= Ġ( 0 Ġuntil Ġconfig . levels Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġ. fold ( listOf ( 1 f Ġ/ Ġinitial Scale )) Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠ Ġa Ġ+ Ġa . last () Ġ/ Ġ 2 f ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ ĠVector 2 ( it ). length () Ġ} ĊĊĠ Ġreturn ĠCell Sampler ( sample Count ) Ġ{ Ġindex Ġ-> ĊĠĠĠ Ġval Ġoffset Ġ= Ġindex To Vector 3 i ( slice Size , Ġstep Dimensions . x , Ġindex ). to Vector 3 () ĊĠĠĠ Ġval Ġstarting Location Ġ= Ġstart Ġ+ Ġoffset Ġ/ Ġinitial Scale ĊĠĠĠ Ġsample Point ( config , Ġlevel Ranges , Ġ 1 f Ġ/ Ġinitial Scale , Ġ 0 , Ġstarting Location ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġsample Form ( config : ĠS ampling Config , Ġbounds : ĠGrid Bounds ): ĠList < Sample Point > Ġ{ ĊĠ Ġval Ġ( sample Count , Ġsampler ) Ġ= Ġsample Cells ( config , Ġbounds ) ĊĠ Ġreturn Ġ( 0 Ġuntil Ġsample Count ). flatMap ( sampler ) Ċ } Ċ Ċ data Ġclass ĠCell Sampler ( ĊĠĠĠ Ġval Ġcell Count : ĠInt , ĊĠĠĠ Ġval Ġsampler : Ġ( Int ) Ġ-> ĠList < Sample Point > Ċ ) Ċ