Пример #1
0
    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;
            }
        }
    }
Пример #2
0
    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;
    }
Пример #3
0
    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);
    }