public void AddRequest(VFVoxelChunkData chunkData) { IntVector4 chunkPos = chunkData.ChunkPosLod; // Req to chunks out of range will return, these chunks will be null and can not be write according to WriteVoxelAtIdx's code if (chunkPos.x < 0 || chunkPos.x >= VoxelTerrainConstants._worldMaxCX || chunkPos.y < 0 || chunkPos.y >= VoxelTerrainConstants.WorldMaxCY(chunkPos.w) || chunkPos.z < 0 || chunkPos.z >= VoxelTerrainConstants._worldMaxCZ) { chunkData.OnDataLoaded(VFVoxelChunkData.S_ChunkDataAir); return; } if (_bImmMode) // no caching { int px, py, pz; VFFileUtil.WorldChunkPosToPiecePos(chunkPos, out px, out py, out pz); ReadPieceDataToBuff(px, py, pz, chunkPos.w); _buff.Decompress(px, py, pz, chunkPos.w); _buff.SetChunkData(chunkData, _chunkDataProc); } else { ReqValue reqValue; if (!_chunkReqList.TryGetValue(chunkData, out reqValue) || !chunkData.IsStampIdentical(reqValue.stamp)) { VFFileUtil.WorldChunkPosToPiecePos(chunkPos, out reqValue.px, out reqValue.py, out reqValue.pz); reqValue.pw = chunkPos.w; reqValue.stamp = chunkData.StampOfUpdating; _chunkReqList[chunkData] = reqValue; } } }
public static void AddReadRequest(VFVoxelChunkData chunkData) { IntVector4 chunkPos = chunkData.ChunkPosLod; // Req to chunks out of range will return, these chunks will be null and can not be write according to WriteVoxelAtIdx's code if (chunkPos.x < 0 || chunkPos.x >= VoxelTerrainConstants._worldMaxCX) { return; } if (chunkPos.y < 0 || chunkPos.y >= VoxelTerrainConstants.WorldMaxCY(chunkPos.w)) { return; } if (chunkPos.z < 0 || chunkPos.z >= VoxelTerrainConstants._worldMaxCZ) { return; } // no caching IntVector4 piecePos; VFFileDataClone.WorldChunkPosToPiecePos(chunkPos, out piecePos); IntVector4 fileIndex; VFFileDataClone.PiecePos2FileIndex(piecePos, out fileIndex); VFPieceDataClone pieceData = GetPieceDataSub(piecePos, GetFileSetSub(fileIndex)); pieceData.Decompress(); pieceData.SetChunkData(chunkData); pieceData._data = null; pieceData = null; }
public VFVoxelChunkData ReadChunkImm(IntVector4 cpos) // Read Chunk Data immediately { VFVoxelChunkData chunkData = new VFVoxelChunkData(null); chunkData.ChunkPosLod_w = cpos; // Req to chunks out of range will return, these chunks will be null and can not be write according to WriteVoxelAtIdx's code if (cpos.x < 0 || cpos.x >= VoxelTerrainConstants._worldMaxCX || cpos.y < 0 || cpos.y >= VoxelTerrainConstants.WorldMaxCY(cpos.w) || cpos.z < 0 || cpos.z >= VoxelTerrainConstants._worldMaxCZ) { chunkData.OnDataLoaded(VFVoxelChunkData.S_ChunkDataAir); return(chunkData); } int px, py, pz; VFFileUtil.WorldChunkPosToPiecePos(cpos, out px, out py, out pz); ReadPieceDataToBuff(px, py, pz, cpos.w); _buff.Decompress(px, py, pz, cpos.w); _buff.SetChunkData(chunkData, _chunkDataProc); return(chunkData); }