package Ġme . anno . ecs . components . light Ċ Ċ import Ġme . anno . ecs . Entity Ċ import Ġme . anno . ecs . annotations . Hide In Inspector Ċ import Ġme . anno . ecs . annotations . Range Ċ import Ġme . anno . ecs . components . mesh . Mesh Ċ import Ġme . anno . ecs . pref ab . Prefab Save able Ċ import Ġme . anno . engine . ui . render . ECS Shader Lib . pbr Model Shader Ċ import Ġme . anno . engine . ui . render . Render View Ċ import Ġme . anno . gpu . Depth Mode Ċ import Ġme . anno . gpu . Render State Ċ import Ġme . anno . gpu . Render State . use Frame Ċ import Ġme . anno . gpu . deferred . Deferred Settings V 2 Ċ import Ġme . anno . gpu . framebuffer .* Ċ import Ġme . anno . gpu . pipeline . Pipeline Ċ import Ġme . anno . gpu . pipeline . Pipeline Stage Ċ import Ġme . anno . gpu . pipeline . Sorting Ċ import Ġme . anno . gpu . shader . Renderer Ċ import Ġme . anno . io . serialization . Not Serialized Property Ċ import Ġme . anno . io . serialization . Serialized Property Ċ import Ġme . anno . utils . pool ing . J om l Pools Ċ import Ġme . anno . utils . types . AABB s . transform Union Ċ import Ġme . anno . utils . types . Mat rices . get Scale Length Ċ import Ġorg . j om l .* Ċ import Ġorg . lwjgl . opengl . GL 1 1 . GL _ DEPTH _ BUFFER _ BIT Ċ import Ġorg . lwjgl . opengl . GL 1 1 . gl Clear Ċ import Ġkotlin . math . pow Ċ Ċ abstract Ġclass ĠLight Component ( ĊĠĠĠ Ġval Ġlight Type : ĠLight Type Ċ ) Ġ: ĠLight Component Base () Ġ{ ĊĊĠĠĠ Ġ// Ġtodo ĠAES Ġlights , Ġand Ġtheir Ġtextures ? ĊĊĠĠĠ Ġ// Ġtodo Ġplane Ġof Ġlight : Ġhow ? ĊĠĠĠ Ġ// Ġtodo Ġlines Ġof Ġlight : Ġhow ? ĊĠĠĠ Ġ// Ġtodo Ġcircle / sphere Ġof Ġlight : Ġhow ? ĊĊĠĠĠ Ġvar Ġshadow Map Cas ca des Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġensure Shadow Buffers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtypical : Ġ 2 .. 4 ĊĠĠĠ Ġ@ Range ( 1 . 0 , Ġ 1 0 0 0 . 0 ) ĊĠĠĠ Ġ@ Serialized Property ĊĠĠĠ Ġvar Ġshadow Map Power Ġ= Ġ 4 . 0 ĊĠĠĠ Ġvar Ġshadow Map Resolution Ġ= Ġ 1 0 2 4 ĊĊĠĠĠ Ġval Ġhas Shadow Ġget () Ġ= Ġshadow Map Cas ca des Ġ> Ġ 0 ĊĊĠĠĠ Ġvar Ġneeds Update Ġ= Ġtrue ĊĠĠĠ Ġvar Ġauto Update Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġfill Space ( global Transform : ĠMatrix 4 x 3 d , Ġa abb : ĠA ABB d ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmesh Ġ= Ġget Light Primitive () ĊĠĠĠĠĠĠĠ Ġmesh . ensure Buffer () ĊĠĠĠĠĠĠĠ Ġmesh . aabb . transform Union ( global Transform , Ġa abb ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġinvalidate Shadow s () Ġ{ ĊĠĠĠĠĠĠĠ Ġneeds Update Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġblack Ġl amp Ġlight ? ĊĠĠĠ Ġ@ Serialized Property ĊĠĠĠ Ġvar Ġcolor : ĠVector 3 f Ġ= ĠVector 3 f ( 1 f ) ĊĊĠĠĠ Ġoverride Ġfun Ġcopy ( clone : ĠPref ab Save able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . copy ( clone ) ĊĠĠĠĠĠĠĠ Ġclone Ġas ĠLight Component ĊĠĠĠĠĠĠĠ Ġclone . shadow Map Cas ca des Ġ= Ġshadow Map Cas ca des ĊĠĠĠĠĠĠĠ Ġclone . shadow Map Power Ġ= Ġshadow Map Power ĊĠĠĠĠĠĠĠ Ġclone . shadow Map Resolution Ġ= Ġshadow Map Resolution ĊĠĠĠĠĠĠĠ Ġclone . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġclone . needs Update Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġclone . auto Update Ġ= Ġauto Update ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw GUI () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isSelected Indirect ly ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Shape () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġdraw Shape () ĊĊĠĠĠ Ġabstract Ġfun Ġget Light Primitive (): ĠMesh ĊĊĠĠĠ Ġ@ Hide In Inspector ĊĠĠĠ Ġ@ Not Serialized Property ĊĠĠĠ Ġvar Ġshadow Textures : ĠArray < I Framebuffer >? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġsamples Ġ= Ġ 1 ĊĊĠĠĠ Ġfun Ġensure Shadow Buffers () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Shadow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġa Ġsingle Ġone Ġis Ġsupported , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbecause Ġmore Ġmakes Ġno Ġsense ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Point Light Ġ= Ġlight Type Ġ== ĠLight Type . POINT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Point Light ) Ġshadow Map Cas ca des Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshadow Cas ca des Ġ= Ġshadow Textures ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Size Ġ= Ġshadow Map Cas ca des ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolution Ġ= Ġshadow Map Resolution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsamples Ġ= Ġsamples ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shadow Cas ca des Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Cas ca des . size Ġ!= Ġtarget Size Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Cas ca des . first (). samples Ġ!= Ġsamples ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Cas ca des ?. forEach Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġcurrently Ġuse Ġa Ġdepth Ġbias Ġof Ġ 0 . 0 0 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġis Ġequal Ġto Ġ~ Ġ 1 / 2 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġa Ġ 8 Ġbit Ġdepth Ġbuffer Ġwould Ġbe Ġenough ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Buffer Type Ġ= ĠDepth Buffer Type . TEXTURE _ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shadow Textures Ġ= ĠArray ( target Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Point Light ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ub emap Framebuffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Shadow Cub emap [$ it ]", Ġresolution , Ġsamples , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġdepth Buffer Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Shadow [$ it ]", Ġresolution , Ġresolution , Ġsamples , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġdepth Buffer Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Textures ?. forEach Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Textures Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Visible Update (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Shadow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Update Ġ|| Ġneeds Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneeds Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġensure Shadow Buffers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Shadow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Shadow Maps () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġupdate Shadow Map ( ĊĠĠĠĠĠĠĠ Ġcascade Scale : ĠDouble , Ġworld Scale : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcamera Matrix : ĠMatrix 4 f , ĊĠĠĠĠĠĠĠ Ġdraw Transform : ĠMatrix 4 x 3 d , Ġpipeline : ĠPipeline , ĊĠĠĠĠĠĠĠ Ġresolution : ĠInt , Ġposition : ĠVector 3 d , Ġrotation : ĠQuaternion d ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġopen Ġfun Ġupdate Shadow Maps () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= Ġpipeline ĊĠĠĠĠĠĠĠ Ġpipeline . reset () ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity !! ĊĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= Ġentity . transform ĊĠĠĠĠĠĠĠ Ġval Ġdraw Transform Ġ= Ġtransform . draw Transform ĊĠĠĠĠĠĠĠ Ġval Ġresolution Ġ= Ġshadow Map Resolution ĊĠĠĠĠĠĠĠ Ġval Ġglobal Ġ= Ġtransform . global Transform ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġglobal . get Translation ( J om l Pools . vec 3 d . create ()) ĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġglobal . getUn normalized Rotation ( J om l Pools . quat 4 d . create ()) ĊĠĠĠĠĠĠĠ Ġval Ġsqrt 3 Ġ= Ġ 1 . 7 3 2 0 5 0 8 0 7 5 6 8 8 7 7 2 ĊĠĠĠĠĠĠĠ Ġval Ġworld Scale Ġ= Ġsqrt 3 Ġ/ Ġglobal . get Scale Length () ĊĠĠĠĠĠĠĠ Ġval Ġcamera Matrix Ġ= ĠJ om l Pools . mat 4 f . create () ĊĠĠĠĠĠĠĠ Ġval Ġshadow Textures Ġ= Ġshadow Textures ĊĠĠĠĠĠĠĠ Ġval Ġshadow Map Power Ġ= Ġshadow Map Power ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġfill Ġpipeline Ġonce ? Ġprobably Ġbetter ... ĊĠĠĠĠĠĠĠ Ġval Ġrenderer Ġ= ĠRenderer . depth Only Renderer ĊĠĠĠĠĠĠĠ Ġval Ġdepth Mode Ġ= ĠDepth Mode . GRE ATER ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġshadow Map Cas ca des ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcascade Scale Ġ= Ġshadow Map Power . pow (- i . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtexture Ġ= Ġshadow Textures ! ![ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Shadow Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcascade Scale , Ġworld Scale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Matrix , Ġdraw Transform , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline , Ġresolution , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition , Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġentity . getRoot ( Entity :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . fill Depth ( root , Ġposition , Ġworld Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRender State . depth Mode . use ( depth Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Frame ( resolution , Ġresolution , Ġtrue , Ġtexture , Ġrenderer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame . bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Clear ( GL _ DEPTH _ BUFFER _ BIT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . draw Depth ( camera Matrix , Ġposition , Ġworld Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġwhy Ġis Ġthis Ġcausing Ġa ĠBuffer Under Flow ? ĊĠĠĠĠĠĠĠ Ġ// ĠJ om l Pools . vec 3 d . sub ( 1 ) ĊĠĠĠĠĠĠĠ ĠJ om l Pools . quat 4 d . sub ( 1 ) ĊĠĠĠĠĠĠĠ ĠJ om l Pools . mat 4 f . sub ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġis Ġset Ġby Ġthe Ġpipeline , ĊĠĠĠĠ Ġ* Ġis Ġequal Ġto Ġinv ( transform . global Matrix Ġ- Ġcamera Position ) ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Not Serialized Property ĊĠĠĠ Ġval Ġinv World Matrix Ġ= ĠMatrix 4 x 3 f () ĊĊĠĠĠ Ġopen Ġfun Ġget Shader V 0 ( draw Transform : ĠMatrix 4 x 3 d , Ġworld Scale : ĠDouble ): ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġopen Ġfun Ġget Shader V 1 (): ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġopen Ġfun Ġget Shader V 2 (): ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . destroy () ĊĠĠĠĠĠĠĠ Ġshadow Textures ?. forEach Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠ Ġshadow Textures Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= ĠPipeline ( Deferred Settings V 2 ( listOf (), Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . default Stage Ġ= ĠPipeline Stage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĠSort ing . NO _ SORT ING , Ġ 0 , Ġnull , ĠDepth Mode . GRE ATER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , Ġ 0 , Ġp br Model Shader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }