Ejemplo n.º 1
0
        public void AddChunk(string regionKey, IntVector3 position, ChunkData data)
        {
            var storageContainer = StorageManager.RequiredCurrentStorageContainer;

            if (!storageContainer.DirectoryExists(rootDirectory))
                storageContainer.CreateDirectory(rootDirectory);

            var regionPath = ResolveRegionPath(regionKey);

            if (!storageContainer.DirectoryExists(regionPath))
                storageContainer.CreateDirectory(regionPath);

            var filePath = ResolveFilePath(regionKey, position);
            using (var stream = storageContainer.CreateFile(filePath))
            using (var writer = new BinaryWriter(stream))
            {
                data.Write(writer);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// インスタンスを生成します。
        /// </summary>
        /// <param name="settings">チャンク設定。</param>
        /// <param name="graphicsDevice">グラフィックス デバイス。</param>
        /// <param name="regionManager">リージョン マネージャ。</param>
        /// <param name="sceneManager">シーン マネージャ。</param>
        public ChunkManager(
            ChunkSettings settings,
            GraphicsDevice graphicsDevice,
            RegionManager regionManager,
            SceneManager sceneManager)
            : base(settings.PartitionManager)
        {
            if (graphicsDevice == null)
            {
                throw new ArgumentNullException("graphicsDevice");
            }
            if (regionManager == null)
            {
                throw new ArgumentNullException("regionManager");
            }

            ChunkSize           = settings.ChunkSize;
            this.graphicsDevice = graphicsDevice;
            this.regionManager  = regionManager;
            SceneManager        = sceneManager;

            switch (settings.ChunkStoreType)
            {
            case ChunkStoreType.Storage:
                ChunkStore = StorageChunkStore.Instance;
                break;

            default:
                ChunkStore = NullChunkStore.Instance;
                break;
            }

            EmptyData = new ChunkData(this);

            BaseNode = sceneManager.CreateSceneNode("ChunkRoot");
            sceneManager.RootNode.Children.Add(BaseNode);

            meshManager = new ChunkMeshManager(this, settings.VertexBuildConcurrencyLevel, settings.UpdateBufferCountPerFrame);
        }
Ejemplo n.º 3
0
        public void AddChunk(string regionKey, IntVector3 position, ChunkData data)
        {
            var storageContainer = StorageManager.RequiredCurrentStorageContainer;

            if (!storageContainer.DirectoryExists(rootDirectory))
            {
                storageContainer.CreateDirectory(rootDirectory);
            }

            var regionPath = ResolveRegionPath(regionKey);

            if (!storageContainer.DirectoryExists(regionPath))
            {
                storageContainer.CreateDirectory(regionPath);
            }

            var filePath = ResolveFilePath(regionKey, position);

            using (var stream = storageContainer.CreateFile(filePath))
                using (var writer = new BinaryWriter(stream))
                {
                    data.Write(writer);
                }
        }
Ejemplo n.º 4
0
        public bool GetChunk(string regionKey, IntVector3 position, ChunkData data)
        {
            var storageContainer = StorageManager.RequiredCurrentStorageContainer;
            var filePath         = ResolveFilePath(regionKey, position);

            bool result;

            if (!storageContainer.FileExists(filePath))
            {
                result = false;
            }
            else
            {
                using (var stream = storageContainer.OpenFile(filePath, FileMode.Open))
                    using (var reader = new BinaryReader(stream))
                    {
                        data.Read(reader);
                    }

                result = true;
            }

            return(result);
        }
Ejemplo n.º 5
0
        public bool GetChunk(string regionKey, IntVector3 position, ChunkData data)
        {
            var storageContainer = StorageManager.RequiredCurrentStorageContainer;
            var filePath = ResolveFilePath(regionKey, position);

            bool result;
            if (!storageContainer.FileExists(filePath))
            {
                result = false;
            }
            else
            {
                using (var stream = storageContainer.OpenFile(filePath, FileMode.Open))
                using (var reader = new BinaryReader(stream))
                {
                    data.Read(reader);
                }

                result = true;
            }

            return result;
        }
Ejemplo n.º 6
0
 public bool GetChunk(string regionKey, IntVector3 position, ChunkData data)
 {
     return false;
 }
Ejemplo n.º 7
0
 public void AddChunk(string regionKey, IntVector3 position, ChunkData data)
 {
 }
Ejemplo n.º 8
0
        /// <summary>
        /// インスタンスを生成します。
        /// </summary>
        /// <param name="settings">チャンク設定。</param>
        /// <param name="graphicsDevice">グラフィックス デバイス。</param>
        /// <param name="regionManager">リージョン マネージャ。</param>
        /// <param name="sceneManager">シーン マネージャ。</param>
        public ChunkManager(
            ChunkSettings settings,
            GraphicsDevice graphicsDevice,
            RegionManager regionManager,
            SceneManager sceneManager)
            : base(settings.PartitionManager)
        {
            if (graphicsDevice == null) throw new ArgumentNullException("graphicsDevice");
            if (regionManager == null) throw new ArgumentNullException("regionManager");

            ChunkSize = settings.ChunkSize;
            this.graphicsDevice = graphicsDevice;
            this.regionManager = regionManager;
            SceneManager = sceneManager;

            switch (settings.ChunkStoreType)
            {
                case ChunkStoreType.Storage:
                    ChunkStore = StorageChunkStore.Instance;
                    break;
                default:
                    ChunkStore = NullChunkStore.Instance;
                    break;
            }

            EmptyData = new ChunkData(this);

            BaseNode = sceneManager.CreateSceneNode("ChunkRoot");
            sceneManager.RootNode.Children.Add(BaseNode);

            meshManager = new ChunkMeshManager(this, settings.VertexBuildConcurrencyLevel, settings.UpdateBufferCountPerFrame);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// リージョンが提供するチャンク ストアに永続化されている場合、
        /// チャンク ストアからチャンクをロードします。
        /// リージョンが提供するチャンク ストアに永続化されていない場合、
        /// リージョンが提供するチャンク プロシージャから自動生成します。
        /// </summary>
        protected override void Activate()
        {
            var newData = new ChunkData(chunkManager);

            if (chunkManager.ChunkStore.GetChunk(region.ChunkStoreKey, Position, newData))
            {
                if (newData.SolidCount == 0)
                {
                    // 全てが空ブロックならば GC 回収。
                }
                else
                {
                    data = newData;
                }
            }
            else
            {
                // 永続化されていないならば自動生成。
                for (int i = 0; i < region.ChunkProcesures.Count; i++)
                    region.ChunkProcesures[i].Generate(this);
            }

            base.Activate();
        }
Ejemplo n.º 10
0
        public void SetBlockIndex(int x, int y, int z, byte blockIndex)
        {
            lock (blockIndexLock)
            {
                if (data == null)
                {
                    // データが null で空ブロックを設定しようとする場合は、
                    // データに変更がないため、即座に処理を終えます。
                    if (blockIndex == Block.EmptyIndex) return;

                    // 非空ブロックを設定しようとする場合はデータを新規生成。
                    data = new ChunkData(chunkManager);
                }

                // 同じインデックスならば更新しない。
                if (data.GetBlockIndex(x, y, z) == blockIndex) return;

                data.SetBlockIndex(x, y, z, blockIndex);

                if (data.SolidCount == 0)
                {
                    // 空になったならば GC へ。
                    // なお、頻繁に非空と空の状態を繰り返すことが稀であることを前提とし、
                    // これによる GC 負荷は少ないと判断する。
                    data = null;
                }
            }
        }
Ejemplo n.º 11
0
 public void AddChunk(string regionKey, IntVector3 position, ChunkData data)
 {
 }
Ejemplo n.º 12
0
 public bool GetChunk(string regionKey, IntVector3 position, ChunkData data)
 {
     return(false);
 }