/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . liv emap . fragment Ċ Ċ import Ġjet brains . liv emap . core . ecs . Abstract System Ċ import Ġjet brains . liv emap . core . ecs . E cs Component Manager Ċ import Ġjet brains . liv emap . core . rendering . layers . Parent Layer Component Ċ import Ġjet brains . liv emap . map engine . Live Map Context Ċ Ċ class ĠRegion Emit System ( component Manager : ĠE cs Component Manager ) Ġ: ĠAbstract System < Live Map Context >( component Manager ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmy Region Index : ĠUtils . Regions Index Ġ= ĠUtils . Regions Index ( component Manager ) ĊĠĠĠ Ġprivate Ġval Ġmy Pending Fragments Ġ= ĠHashMap < String , ĠPending Fragments >() ĊĠĠĠ Ġprivate Ġvar Ġmy Pending Zoom Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġinit Impl ( context : ĠLive Map Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Entity (" emit ted _ regions "). add ( Emit ted Regions Component ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Impl ( context : ĠLive Map Context , Ġdt : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . camera . is Zoom Fraction Changed Ġ&& Ġcontext . camera . is Zoom Level Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Pending Zoom Ġ= Ġcontext . camera . zoom . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Pending Fragments . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Singleton < Changed Fragments Component >(). requested . forEach (:: wait ) ĊĠĠĠĠĠĠĠ Ġget Singleton < Changed Fragments Component >(). ob solete . forEach (:: remove ) ĊĠĠĠĠĠĠĠ Ġget Singleton < Emit ted Fragments Component >(). keys (). forEach (:: accept ) ĊĊĠĠĠĠĠĠĠ Ġval Ġemitted Regions Component Ġ= Ġget Singleton < Emit ted Regions Component >() ĊĠĠĠĠĠĠĠ Ġemitted Regions Component . keys (). clear () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( ready Region Ġin Ġcheck Ready Regions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitted Regions Component . keys (). add ( ready Region ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Region ( ready Region ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Region ( region Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregion Ġ= Ġmy Region Index . find ( region Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragments Cache Ġ= Ġget Singleton < Cached Fragments Component >() ĊĊĠĠĠĠĠĠĠ Ġregion . get < Region Fragments Component >(). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Ġ= Ġmy Pending Fragments [ region Id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ready Fragments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( fragments Cache :: get ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠParent Layer Component . tag Dirty Parent Layer ( region ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwait ( fragment Key : ĠFragment Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Pending Zoom Ġ!= Ġfragment Key . zoom ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmy Pending Fragments . get Or Put ( fragment Key . region Id , Ġ:: Pending Fragments ). wait Fragment ( fragment Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaccept ( fragment Key : ĠFragment Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Pending Zoom Ġ!= Ġfragment Key . zoom ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmy Pending Fragments [ fragment Key . region Id ]?. accept ( fragment Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove ( fragment Key : ĠFragment Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Pending Zoom Ġ!= Ġfragment Key . zoom ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmy Pending Fragments [ fragment Key . region Id ]?. remove ( fragment Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Ready Regions (): ĠCollection < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġready Regions Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠ Ġmy Pending Fragments . forEach Ġ{ Ġ( region Id , Ġpending Fragments ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Fragments . check Done ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġready Regions . add ( region Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġready Regions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠPending Fragments Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Waiting Fragments Ġ= ĠHashSet < Fragment Key >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Ready Fragments Ġ= ĠHashSet < Fragment Key >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmy Is Done Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġwait Fragment ( fragment Key : ĠFragment Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Waiting Fragments . add ( fragment Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Is Done Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġaccept ( fragment Key : ĠFragment Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Ready Fragments . add ( fragment Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( fragment Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġremove ( fragment Key : ĠFragment Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Waiting Fragments . remove ( fragment Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Waiting Fragments . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Is Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Done (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Is Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Is Done Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġready Fragments (): ĠCollection < Fragment Key > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Ready Fragments ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }