package Ġde . fab max . k ool . demo . at mosphere Ċ Ċ import Ġde . fab max . k ool . math . Vec 2 f Ċ import Ġde . fab max . k ool . math . Vec 3 f Ċ import Ġde . fab max . k ool . modules . at mosphere . At mosphere Node Ċ import Ġde . fab max . k ool . modules . at mosphere . Ray Sphere Intersection Node Ċ import Ġde . fab max . k ool . pipeline . Depth Compare Op Ċ import Ġde . fab max . k ool . pipeline . Uniform Mat 4 f Ċ import Ġde . fab max . k ool . pipeline . deferred . Deferred Pass Swap Listener Ċ import Ġde . fab max . k ool . pipeline . deferred . Deferred P asses Ċ import Ġde . fab max . k ool . pipeline . shader model .* Ċ import Ġde . fab max . k ool . pipeline . sh ading . Mode led Shader Ċ import Ġde . fab max . k ool . pipeline . sh ading . Texture 2 d Input Ċ import Ġde . fab max . k ool . util . Color Ċ import Ġkotlin . math . pow Ċ Ċ class ĠAt mo spher ic Scatter ing Shader Ġ: ĠMode led Shader ( at mosphere Model ()), ĠDeferred Pass Swap Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġat mosphere Node : ĠAt mosphere Node ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġoptical Depth L ut Ġ= ĠTexture 2 d Input (" t Opt ical Depth L ut ") ĊĠĠĠ Ġval Ġscene Color Ġ= ĠTexture 2 d Input (" t Scene Color ") ĊĠĠĠ Ġval Ġscene Pos Ġ= ĠTexture 2 d Input (" t Scene Pos ") ĊĠĠĠ Ġval Ġsky Color Ġ= ĠTexture 2 d Input (" t Sky Color ") ĊĊĠĠĠ Ġvar Ġdir ToS un Ġ= ĠVec 3 f ( 0 f , Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u Dir ToS un ?. value ?. set ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġsun Color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u Sun Color ?. value ?. set ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġscatter ing Coeff Pow Ġ= Ġ 4 . 5 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Scatter ing Coeff s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġscatter ing Coeff Strength Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Scatter ing Coeff s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġscatter ing Coeff s Ġ= ĠVec 3 f ( 0 . 5 f , Ġ 0 . 8 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Scatter ing Coeff s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġray le igh Color Ġ= ĠColor ( 0 . 7 5 f , Ġ 0 . 7 5 f , Ġ 0 . 7 5 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u Ray le igh Color ?. value ?. set ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġm ie Color Ġ= ĠColor ( 1 f , Ġ 0 . 9 f , Ġ 0 . 8 f , Ġ 0 . 3 f ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u M ie Color ?. value ?. set ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġm ie G Ġ= Ġ 0 . 9 9 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u M ie G ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġplanet Center Ġ= ĠVec 3 f . ZERO ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u Planet Center ?. value ?. set ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġsurface Radius Ġ= Ġ 6 0 0 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u Surface Radius ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġat mosphere Radius Ġ= Ġ 6 0 9 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. u At mosphere Radius ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġon Pipeline Setup Ġ+= Ġ{ Ġbuilder , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . depth Test Ġ= ĠDepth Compare Op . DISABLED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Pipeline Created Ġ+= Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptical Depth L ut . connect ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Color . connect ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Pos . connect ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsky Color . connect ( model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node Ġ= Ġmodel . find Node ByType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat mosphere Node ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Dir ToS un . value . set ( dir ToS un ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Planet Center . value . set ( planet Center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Surface Radius . value Ġ= Ġsurface Radius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu At mosphere Radius . value Ġ= Ġat mosphere Radius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Ray le igh Color . value . set ( ray le igh Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu M ie Color . value . set ( m ie Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu M ie G . value Ġ= Ġm ie G ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Sun Color . value . set ( sun Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Scatter ing Coeff s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Scatter ing Coeff s () Ġ{ ĊĠĠĠĠĠĠĠ Ġat mosphere Node ?. u Scatter ing Coeff s ?. value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . x Ġ= Ġscatter ing Coeff s . x . pow ( scatter ing Coeff Pow ) Ġ* Ġscatter ing Coeff Strength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . y Ġ= Ġscatter ing Coeff s . y . pow ( scatter ing Coeff Pow ) Ġ* Ġscatter ing Coeff Strength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . z Ġ= Ġscatter ing Coeff s . z . pow ( scatter ing Coeff Pow ) Ġ* Ġscatter ing Coeff Strength ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġat mosphere Model () Ġ= ĠShader Model (" at mo - scatter ing - shader "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm vp : ĠUniform Buffer M vp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Quad Pos : ĠStage Interface Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif View Dir : ĠStage Interface Node ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Stage Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm vp Ġ= Ġm vp Node () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquad Pos Ġ= Ġattr Tex Coords (). output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Dir Ġ= Ġadd Node ( Xy To View Dir Node ( stage )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Screen Pos Ġ= Ġquad Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif View Dir Ġ= Ġstage Interface Node (" if View Dir ", Ġview Dir . out View Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Quad Pos Ġ= Ġstage Interface Node (" if Tex Coords ", Ġquad Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Output Ġ= Ġfull Screen Quad Position Node ( quad Pos ). out Quad Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Stage Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Node ( Ray Sphere Intersection Node ( stage )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrag M vp Ġ= Ġm vp . addTo Stage ( stage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptical Depth L ut Ġ= Ġtexture 2 d Node (" t Opt ical Depth L ut ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscene Color Ġ= Ġtexture 2 d Sampler Node ( texture 2 d Node (" t Scene Color "), Ġif Quad Pos . output ). out Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsky Color Ġ= Ġtexture 2 d Sampler Node ( texture 2 d Node (" t Sky Color "), Ġif Quad Pos . output ). out Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Pos Ġ= Ġtexture 2 d Sampler Node ( texture 2 d Node (" t Scene Pos "), Ġif Quad Pos . output ). out Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview 2 world Ġ= Ġadd Node ( View To World Pos Node ( stage )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin View Pos Ġ= Ġview Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġat mo Nd Ġ= Ġadd Node ( At mosphere Node ( opt ical Depth L ut , Ġstage )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Scene Color Ġ= Ġscene Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Scene Depth Ġ= Ġsplit Node ( view Pos , Ġ" z "). output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Scene Pos Ġ= Ġview 2 world . out World Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Sky Color Ġ= Ġsky Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin View Depth Ġ= Ġsplit Node ( view Pos , Ġ" z "). output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Cam Pos Ġ= Ġfrag M vp . out Cam Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Look Dir Ġ= Ġif View Dir . output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Output ( hdr To L dr Node ( at mo Nd . out Color ). out Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠX y To View Dir Node ( graph : ĠShader Graph ) Ġ: ĠShader Node (" xy To View Dir ", Ġgraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġu Inv View Proj Mat Ġ= ĠUniform Mat 4 f (" u Inv View Proj Mat ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġin Screen Pos Ġ= ĠShader Node Io Var ( Model Var 2 f Const ( Vec 2 f . ZERO )) ĊĠĠĠĠĠĠĠ Ġval Ġout View Dir Ġ= ĠShader Node Io Var ( Model Var 3 f ("${ name }_ out World Pos "), Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsetup ( shader Graph : ĠShader Graph ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . setup ( shader Graph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( in Screen Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshader Graph . descriptor Set . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Buffer ( name , Ġshader Graph . stage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ { Ġu Inv View Proj Mat Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Ġ= Ġ{ Ġ_, Ġcmd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Inv View Proj Mat . value . set ( cmd . render Pass . camera . inv View Proj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate Code ( generator : ĠCode Generator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . append Main (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġ${ name }_ near Ġ= Ġ$ u Inv View Proj Mat Ġ* Ġvec 4 (${ in Screen Pos . ref 2 f ()} Ġ* Ġ 2 . 0 Ġ- Ġ 1 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġ${ name }_ far Ġ= Ġ$ u Inv View Proj Mat Ġ* Ġvec 4 (${ in Screen Pos . ref 2 f ()} Ġ* Ġ 2 . 0 Ġ- Ġ 1 . 0 , Ġ 1 . 0 , Ġ 1 . 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ out View Dir . declare ()} Ġ= Ġ(${ name }_ far . xyz Ġ/ Ġ${ name }_ far . w ) Ġ- Ġ(${ name }_ near . xyz Ġ/ Ġ${ name }_ near . w ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠView To World Pos Node ( graph : ĠShader Graph ) Ġ: ĠShader Node (" view 2 world Pos ", Ġgraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġu Inv View Mat Ġ= ĠUniform Mat 4 f (" u Inv View Mat ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġin View Pos Ġ= ĠShader Node Io Var ( Model Var 3 f Const ( Vec 3 f . ZERO )) ĊĠĠĠĠĠĠĠ Ġval Ġout World Pos Ġ= ĠShader Node Io Var ( Model Var 4 f ("${ name }_ out World Pos "), Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsetup ( shader Graph : ĠShader Graph ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . setup ( shader Graph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( in View Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshader Graph . descriptor Set . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Buffer ( name , Ġshader Graph . stage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ { Ġu Inv View Mat Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Ġ= Ġ{ Ġ_, Ġcmd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Inv View Mat . value . set ( cmd . render Pass . camera . inv View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate Code ( generator : ĠCode Generator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . append Main ("${ out World Pos . declare ()} Ġ= Ġ$ u Inv View Mat Ġ* Ġvec 4 (${ in View Pos . ref 3 f ()}, Ġ 1 . 0 ); ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Swap ( previous P asses : ĠDeferred P asses , Ġcurrent P asses : ĠDeferred P asses ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscene Color ( current P asses . lighting Pass . color Texture ) ĊĠĠĠĠĠĠĠ Ġscene Pos ( current P asses . material Pass . position Flags ) ĊĠĠĠ Ġ} Ċ }