示例#1
0
文件: RLETree.cs 项目: Uzere/nlctest
        public override uint getBlock(int x, int y, int z) {
            var ind = index(x, y, z);
            var node = tree.FindGreatestNotGreater(ind);
            var offset = node.key;
            var runLen = 0;

            using(var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) {
                while(true) {
                    if(runLen == 0) {
                        runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT;
                    } else if(runLen>0) {
                        var runId = reader.ReadUInt32();
                        // blocks in range [offset...offset+runLen) is runId
                        offset = offset + runLen;
                        if(ind < offset) {
                            return runId;
                        }
                        runLen = 0;
                    } else if(runLen<0) {
                        var blockId = reader.ReadUInt32();
                        if(offset==ind) {
                            return blockId;
                        }
                        runLen++;
                        offset++;
                    }
                }
            }
        }
示例#2
0
文件: RLETree.cs 项目: Uzere/nlctest
        public override uint getBlock(int x, int y, int z)
        {
            var ind    = index(x, y, z);
            var node   = tree.FindGreatestNotGreater(ind);
            var offset = node.key;
            var runLen = 0;

            using (var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) {
                while (true)
                {
                    if (runLen == 0)
                    {
                        runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT;
                    }
                    else if (runLen > 0)
                    {
                        var runId = reader.ReadUInt32();
                        // blocks in range [offset...offset+runLen) is runId
                        offset = offset + runLen;
                        if (ind < offset)
                        {
                            return(runId);
                        }
                        runLen = 0;
                    }
                    else if (runLen < 0)
                    {
                        var blockId = reader.ReadUInt32();
                        if (offset == ind)
                        {
                            return(blockId);
                        }
                        runLen++;
                        offset++;
                    }
                }
            }
        }
示例#3
0
文件: RLETree.cs 项目: Uzere/nlctest
        public override void setBlock(int x, int y, int z, uint block) {
            var ind = index(x, y, z);
            var node = tree.FindGreatestNotGreater(ind);
            var offset = node.key;

            var runLen = 0;
            var runLenWrited = false;

            MemoryStream output = null;
            using (var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) {
                using(var writer = new BinaryWriter7(output = new MemoryStream())) {
                    while (reader.BaseStream.Position != reader.BaseStream.Length) {
                        if (runLen == 0) {
                            runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT;
                            runLenWrited = false;
                        } else if (runLen > 0) {
                            var runId = reader.ReadUInt32();
                            // blocks in range [offset...offset+runLen) is runId
                            offset = offset + runLen;
                            if (ind < offset) {
                                writer.Write7BitEncodedInt(ind - (offset - runLen) + RUN_LENGTH_SHIFT);
                                writer.Write(runId);
                                writer.Write7BitEncodedInt(1 + RUN_LENGTH_SHIFT);
                                writer.Write(block);
                                if (offset - ind -1 > 0) {
                                    writer.Write7BitEncodedInt(offset - ind -1 + RUN_LENGTH_SHIFT);
                                    writer.Write(runId);
                                }
                            } else {
                                writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT);
                                writer.Write(runId);
                            }
                            runLen = 0;
                        } else if (runLen < 0) {
                            var blockId = reader.ReadUInt32();

                            if(!runLenWrited) {
                                writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT);
                                runLenWrited = true;
                            }
                            if (offset == ind) {
                                writer.Write(block);
                            } else {
                                writer.Write(blockId);
                            }
                            runLen++;
                            offset++;
                        }
                    }
                }
            }

            var newdata = output.ToArray();
            node.data = output.ToArray();
        }
示例#4
0
文件: RLETree.cs 项目: Uzere/nlctest
        public override void setBlock(int x, int y, int z, uint block)
        {
            var ind    = index(x, y, z);
            var node   = tree.FindGreatestNotGreater(ind);
            var offset = node.key;

            var runLen       = 0;
            var runLenWrited = false;

            MemoryStream output = null;

            using (var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) {
                using (var writer = new BinaryWriter7(output = new MemoryStream())) {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        if (runLen == 0)
                        {
                            runLen       = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT;
                            runLenWrited = false;
                        }
                        else if (runLen > 0)
                        {
                            var runId = reader.ReadUInt32();
                            // blocks in range [offset...offset+runLen) is runId
                            offset = offset + runLen;
                            if (ind < offset)
                            {
                                writer.Write7BitEncodedInt(ind - (offset - runLen) + RUN_LENGTH_SHIFT);
                                writer.Write(runId);
                                writer.Write7BitEncodedInt(1 + RUN_LENGTH_SHIFT);
                                writer.Write(block);
                                if (offset - ind - 1 > 0)
                                {
                                    writer.Write7BitEncodedInt(offset - ind - 1 + RUN_LENGTH_SHIFT);
                                    writer.Write(runId);
                                }
                            }
                            else
                            {
                                writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT);
                                writer.Write(runId);
                            }
                            runLen = 0;
                        }
                        else if (runLen < 0)
                        {
                            var blockId = reader.ReadUInt32();

                            if (!runLenWrited)
                            {
                                writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT);
                                runLenWrited = true;
                            }
                            if (offset == ind)
                            {
                                writer.Write(block);
                            }
                            else
                            {
                                writer.Write(blockId);
                            }
                            runLen++;
                            offset++;
                        }
                    }
                }
            }

            var newdata = output.ToArray();

            node.data = output.ToArray();
        }