package Ġme . hy dos . ro sell a . render . texture Ċ Ċ import Ġit . un imi . ds i . fast util . ints . IntArray Priority Queue Ċ import Ġit . un imi . ds i . fast util . ints . Int Priority Queues Ċ import Ġme . hy dos . ro sell a . memory . Memory Ċ Ċ import Ġme . hy dos . ro sell a . render .* Ċ import Ġme . hy dos . ro sell a . render . renderer . Renderer Ċ import Ġorg . lwjgl . v ulkan . VK 1 0 Ċ import Ġme . hy dos . ro sell a . vk objects . Vk Common Ċ Ċ /** Ċ Ġ* ĠCache s ĠText ures Ġand Ġother Ġtexture Ġrelated Ġobjects Ċ Ġ*/ Ċ class ĠTexture Manager ( val Ġcommon : ĠVk Common ) Ġ{ Ġ// ĠTODO : Ġadd Ġlayers , Ġmaybe Ġnot Ġin Ġthis Ġclass Ġbut Ġsomewhere ĊĊ ĉ private Ġval Ġtexture Map Ġ= ĠHashMap < Int , ĠTexture >() Ċ ĉ private Ġval Ġsampler Cache Ġ= ĠHashMap < Sampler CreateInfo , ĠHashMap < Int , ĠTexture Sampler >>() ĊĊ ĉ private Ġval Ġprepared Textures Ġ= ĠHashSet < Texture >() ĊĊ ĉ private Ġval Ġre usable Tex Ids Ġ= ĠInt Priority Queues . synchron ize ( IntArray Priority Queue ()) Ċ ĉ private Ġvar Ġnext Tex Id Ġ: ĠInt Ġ= Ġ 0 ; ĊĊ ĉ fun Ġgenerate Texture Id (): ĠInt Ġ{ Ċĉ ĉ return Ġif Ġ(! reusable Tex Ids . isEmpty ) Ġ{ Ċĉĉ ĉ reusable Tex Ids . de queue Int () Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ next Tex Id ++ Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġdelete Texture ( texture Id : ĠInt ) Ġ{ Ċĉ ĉ val Ġremoved Tex Ġ= Ġtexture Map . remove ( texture Id ) Ċĉ ĉ prepared Textures . remove ( removed Tex ) Ċĉ ĉ reusable Tex Ids . enqueue ( texture Id ) Ċ ĉ } ĊĊ ĉ fun Ġget Texture ( texture Id : ĠInt ): ĠTexture ? Ġ{ Ċĉ ĉ return Ġtexture Map [ texture Id ]; Ċ ĉ } ĊĊ ĉ fun Ġcreate Texture ( Ċĉ ĉ renderer : ĠRenderer , Ċĉ ĉ texture Id : ĠInt , Ċĉ ĉ width : ĠInt , Ċĉ ĉ height : ĠInt , Ċĉ ĉ img Format : ĠInt Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġtexture Image Ġ= ĠTexture Image ( 0 , Ġ 0 , Ġ 0 ) ĊĊĉ ĉ create Texture Image ( renderer , Ġcommon . device , Ġwidth , Ġheight , Ġimg Format , Ġtexture Image ) Ċĉ ĉ texture Image . view Ġ= Ġcreate Texture ImageView ( common . device , Ġimg Format , Ġtexture Image . texture Image ) ĊĊĉ ĉ texture Map [ texture Id ] Ġ= ĠTexture ( img Format , Ġwidth , Ġheight , Ġtexture Image , Ġnull ) Ċ ĉ } ĊĊ ĉ fun Ġset Texture Sampler ( Ċĉ ĉ texture Id : ĠInt , Ċĉ ĉ texture No : ĠInt , Ċĉ ĉ sampler CreateInfo : ĠSampler CreateInfo Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġtexture No Map Ġ= Ġsampler Cache . compute If Absent ( sampler CreateInfo ) Ġ{ Ċĉĉ ĉ HashMap () Ċĉ ĉ } ĊĊĉ ĉ val Ġtexture Sampler Ġ= Ġtexture No Map . compute If Absent ( texture No ) Ġ{ Ċĉĉ ĉ Texture Sampler ( sampler CreateInfo , Ġcommon . device ) Ċĉ ĉ } ĊĊĉ ĉ texture Map [ texture Id ]?. texture Sampler Ġ= Ġtexture Sampler . pointer Ċ ĉ } ĊĊ ĉ fun Ġset Texture Sampler No Cache ( Ċĉ ĉ texture Id : ĠInt , Ċĉ ĉ sampler CreateInfo : ĠSampler CreateInfo Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġtexture Sampler Ġ= ĠTexture Sampler ( sampler CreateInfo , Ġcommon . device ) Ċĉ ĉ texture Map [ texture Id ]?. texture Sampler Ġ= Ġtexture Sampler . pointer Ċ ĉ } ĊĊ ĉ fun Ġdraw To Existing Texture ( Ċĉ ĉ renderer : ĠRenderer , Ċĉ ĉ memory : ĠMemory , Ċĉ ĉ texture Id : ĠInt , Ċĉ ĉ image : ĠUpload able Image , Ċĉ ĉ src Region : ĠImage Region , Ċĉ ĉ dst Region : ĠImage Region , Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġtexture Ġ= Ġget Texture ( texture Id ) !! Ċĉ ĉ if Ġ( prepared Textures . contains ( texture )) Ġ{ Ċĉĉ ĉ transition Image Layout ( Ċĉĉĉ ĉ renderer , Ċĉĉĉ ĉ common . device , Ċĉĉĉ ĉ renderer . depth Buffer , Ċĉĉĉ ĉ texture . texture Image . texture Image , Ċĉĉĉ ĉ texture . img Format , Ċĉĉĉ ĉ VK 1 0 . VK _ IMAGE _ LAYOUT _ SHADER _ READ _ ONLY _ OP TIM AL , Ċĉĉĉ ĉ VK 1 0 . VK _ IMAGE _ LAYOUT _ TRANSFER _ DST _ OP TIM AL Ċĉĉ ĉ ) Ċĉĉ ĉ prepared Textures . remove ( texture ) Ċĉ ĉ } Ċĉ ĉ copy To Texture ( Ċĉĉ ĉ renderer , Ċĉĉ ĉ common . device , Ċĉĉ ĉ memory , Ċĉĉ ĉ image , Ċĉĉ ĉ src Region , Ċĉĉ ĉ dst Region , Ċĉĉ ĉ texture ) Ċ ĉ } ĊĊ ĉ fun Ġdraw To Existing Texture ( Ċĉ ĉ renderer : ĠRenderer , Ċĉ ĉ memory : ĠMemory , Ċĉ ĉ texture Id : ĠInt , Ċĉ ĉ image : ĠUpload able Image Ċ ĉ ) Ġ{ Ċĉ ĉ val Ġregion Ġ= ĠImage Region ( image . getWidth (), Ġimage . getHeight (), Ġ 0 , Ġ 0 ) Ċĉ ĉ draw To Existing Texture ( renderer , Ġmemory , Ġtexture Id , Ġimage , Ġregion , Ġregion ) Ċ ĉ } ĊĊ ĉ fun Ġprepare Texture ( Ċĉ ĉ renderer : ĠRenderer , Ċĉ ĉ texture : ĠTexture Ċ ĉ ) Ġ{ Ċĉ ĉ if Ġ(! prepared Textures . contains ( texture )) Ġ{ Ċĉĉ ĉ transition Image Layout ( Ċĉĉĉ ĉ renderer , Ċĉĉĉ ĉ common . device , Ċĉĉĉ ĉ renderer . depth Buffer , Ċĉĉĉ ĉ texture . texture Image . texture Image , Ċĉĉĉ ĉ texture . img Format , Ċĉĉĉ ĉ VK 1 0 . VK _ IMAGE _ LAYOUT _ TRANSFER _ DST _ OP TIM AL , Ċĉĉĉ ĉ VK 1 0 . VK _ IMAGE _ LAYOUT _ SHADER _ READ _ ONLY _ OP TIM AL Ċĉĉ ĉ ) Ċĉĉ ĉ prepared Textures . add ( texture ) Ċĉ ĉ } Ċ ĉ } Ċ }