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); } }
/// <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); }
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); } }
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); }
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; }
public bool GetChunk(string regionKey, IntVector3 position, ChunkData data) { return false; }
public void AddChunk(string regionKey, IntVector3 position, ChunkData data) { }
/// <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); }
/// <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(); }
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; } } }
public bool GetChunk(string regionKey, IntVector3 position, ChunkData data) { return(false); }