@@ -493,7 +493,12 @@ func resetRenderedTextureIndex() {
493493
494494func reloadRenderedTextureIndex (cacheDir string ) (int , error ) {
495495 resetRenderedTextureIndex ()
496- return LoadRenderedTextureIndex (cacheDir )
496+ loaded , err := LoadRenderedTextureIndex (cacheDir )
497+ if err != nil {
498+ return 0 , err
499+ }
500+ recordRenderedTextureIndexDirectoryState (cacheDir )
501+ return loaded , nil
497502}
498503
499504func LoadRenderedTextureIndex (cacheDir string ) (int , error ) {
@@ -515,6 +520,7 @@ func LoadRenderedTextureIndex(cacheDir string) (int, error) {
515520 return 0 , err
516521 }
517522
523+ knownPacks := knownResourcePackAliases ()
518524 loaded := 0
519525 for _ , file := range files {
520526 if file .IsDir () || ! strings .EqualFold (filepath .Ext (file .Name ()), ".webp" ) {
@@ -540,7 +546,7 @@ func LoadRenderedTextureIndex(cacheDir string) (int, error) {
540546 texturePack = strings .TrimSpace (strings .TrimPrefix (part , "pack=" ))
541547 }
542548 }
543- if packSegments != 1 || ! validRenderedTexturePackID (texturePack ) {
549+ if packSegments != 1 || ! validRenderedTexturePackID (texturePack , knownPacks ) {
544550 continue
545551 }
546552
@@ -568,15 +574,15 @@ func LoadRenderedTextureIndex(cacheDir string) (int, error) {
568574 return loaded , nil
569575}
570576
571- func validRenderedTexturePackID (packID string ) bool {
577+ func validRenderedTexturePackID (packID string , knownPacks map [ string ] struct {} ) bool {
572578 packID = strings .TrimSpace (packID )
573579 if packID == "" {
574580 return false
575581 }
576582 if strings .EqualFold (packID , "vanilla" ) {
577583 return true
578584 }
579- _ , known := knownResourcePackAliases () [canonicalPackAlias (packID )]
585+ _ , known := knownPacks [canonicalPackAlias (packID )]
580586 return known
581587}
582588
@@ -590,20 +596,78 @@ func rememberRenderedTextureIndexCacheDir(cacheDir string) {
590596 renderedTextureIndexReloadMu .Unlock ()
591597}
592598
593- func lazyReloadRenderedTextureIndex () bool {
599+ func recordRenderedTextureIndexDirectoryState (cacheDir string ) {
600+ cacheDir = strings .TrimSpace (cacheDir )
601+ modTime := time.Time {}
602+ if cacheDir != "" {
603+ if info , err := os .Stat (filepath .Join (cacheDir , "rendered" )); err == nil {
604+ modTime = info .ModTime ()
605+ }
606+ }
607+
594608 renderedTextureIndexReloadMu .Lock ()
609+ if cacheDir != "" {
610+ renderedTextureIndexCacheDir = cacheDir
611+ }
612+ renderedTextureIndexLastDirModTime = modTime
613+ renderedTextureIndexLastLazyReload = time .Now ()
614+ renderedTextureIndexReloadInFlight = false
615+ renderedTextureIndexReloadMu .Unlock ()
616+ }
617+
618+ func scheduleRenderedTextureIndexRefresh () {
595619 now := time .Now ()
596- if ! renderedTextureIndexLastLazyReload .IsZero () && now .Sub (renderedTextureIndexLastLazyReload ) < renderedTextureIndexLazyReloadInterval {
620+ renderedTextureIndexReloadMu .Lock ()
621+ if renderedTextureIndexReloadInFlight ||
622+ (! renderedTextureIndexLastLazyReload .IsZero () && now .Sub (renderedTextureIndexLastLazyReload ) < renderedTextureIndexLazyReloadInterval ) {
597623 renderedTextureIndexReloadMu .Unlock ()
598- return false
624+ return
599625 }
600626 cacheDir := renderedTextureIndexCacheDir
627+ lastModTime := renderedTextureIndexLastDirModTime
601628 renderedTextureIndexLastLazyReload = now
602629 renderedTextureIndexReloadMu .Unlock ()
603630
604- loaded , err := reloadRenderedTextureIndex (cacheDir )
605- if err != nil {
606- return false
631+ if strings .TrimSpace (cacheDir ) == "" {
632+ return
607633 }
608- return loaded > 0
634+ renderedDir := filepath .Join (cacheDir , "rendered" )
635+ info , err := os .Stat (renderedDir )
636+ if err != nil || ! info .IsDir () || ! info .ModTime ().After (lastModTime ) {
637+ return
638+ }
639+
640+ renderedTextureIndexReloadMu .Lock ()
641+ if renderedTextureIndexReloadInFlight {
642+ renderedTextureIndexReloadMu .Unlock ()
643+ return
644+ }
645+ renderedTextureIndexReloadInFlight = true
646+ renderedTextureIndexReloadMu .Unlock ()
647+
648+ go func () {
649+ defer func () {
650+ if recovered := recover (); recovered != nil && (utility .IsVerboseLogging () || strings .EqualFold (os .Getenv ("VERBOSE_LOGGING" ), "true" )) {
651+ logCustomResourceRoutine ("[CUSTOM_RESOURCES] Rendered texture index refresh panicked: %v" , recovered )
652+ }
653+ renderedTextureIndexReloadMu .Lock ()
654+ renderedTextureIndexReloadInFlight = false
655+ renderedTextureIndexReloadMu .Unlock ()
656+ }()
657+
658+ if _ , err := loadRenderedTextureIndexForRefresh (cacheDir ); err != nil {
659+ if utility .IsVerboseLogging () || strings .EqualFold (os .Getenv ("VERBOSE_LOGGING" ), "true" ) {
660+ logCustomResourceRoutine ("[CUSTOM_RESOURCES] Failed to refresh rendered texture index: %v" , err )
661+ }
662+ return
663+ }
664+
665+ modTime := info .ModTime ()
666+ if refreshedInfo , err := os .Stat (renderedDir ); err == nil {
667+ modTime = refreshedInfo .ModTime ()
668+ }
669+ renderedTextureIndexReloadMu .Lock ()
670+ renderedTextureIndexLastDirModTime = modTime
671+ renderedTextureIndexReloadMu .Unlock ()
672+ }()
609673}
0 commit comments