public ITilePromise GetTile(Vector3d tile, ITileMeta tileMeta, Action <ITilePromise> callback)
        {
            if (!tileCache.ContainsKey(tileMeta))
            {
                tileCache[tileMeta] = new Dictionary <Vector3d, ITilePromise>();
            }

            if (tileCache[tileMeta].ContainsKey(tile))
            {
                callback(tileCache[tileMeta][tile]);
                return(tileCache[tileMeta][tile]);
            }

            foreach (var tileLoader in tileLoaders)
            {
                if (tileLoader.CanLoadTile(tile, tileMeta))
                {
                    var tilePromise = tileLoader.LoadTile(tile, tileMeta, (tp) =>
                    {
                        if (tp.Data == null)
                        {
                            tileCache[tp.Meta].Remove(tp.Tile);
                        }
                        callback(tp);
                    });
                    tileCache[tileMeta][tile] = tilePromise;
                    return(tilePromise);
                }
            }

            Debug.LogWarning("Couldn't load tile " + tile + " with metatype " + tileMeta.GetType().ToString());

            return(null);
        }
        // ##################################
        #endregion

        #region Metas
        // ##################################

        public void PublishMeta(ITileMeta meta)
        {
            var newMetaType = meta.GetType();

            if (publicMeta.All(m => m.GetType() != newMetaType))
            {
                publicMeta.Add(meta);
                publicMetaArray = publicMeta.ToArray();
            }
        }
Esempio n. 3
0
 public bool CanLoadTile(Vector3d tile, ITileMeta tileMeta)
 {
     return(tileMeta == this.tileMeta || tileMeta.Identifier == this.tileMeta.Identifier ||
            tileMeta.GetType() == this.tileMeta.GetType());
 }