Exemplo n.º 1
0
        public static LayerData ToLayerMessage(List <LayerPatch> patches, LayerData.LayerDataType type, int offset, int length, out int outlength)
        {
            outlength = 0;
            var layer = new LayerData
            {
                LayerType = type
            };
            bool extended = false;

            switch (type)
            {
            case LayerData.LayerDataType.CloudExtended:
            case LayerData.LayerDataType.LandExtended:
            case LayerData.LayerDataType.WaterExtended:
            case LayerData.LayerDataType.WindExtended:
                extended = true;
                break;
            }

            var header = new GroupHeader
            {
                Stride    = STRIDE,
                PatchSize = LAYER_PATCH_NUM_XY_ENTRIES,
                Type      = type
            };
            var data    = new byte[1500];
            var bitpack = new BitPacker(data, 0);

            bitpack.PackBits(header.Stride, 16);
            bitpack.PackBits(header.PatchSize, 8);
            bitpack.PackBits((uint)header.Type, 8);
            int remainingbits = 1300 * 8; /* 1300 is a bit more than 2 perfectly bad compressed layer patches, wind needs two per packet */

            for (int i = 0; i < length; i++)
            {
                int patchno = i + offset;
                if (patches[patchno].Data.Length != LAYER_PATCH_NUM_XY_ENTRIES * LAYER_PATCH_NUM_XY_ENTRIES)
                {
                    throw new ArgumentException("Patch data must be a 16x16 array");
                }

                if (CompressPatch(bitpack, patches[patchno], extended, ref remainingbits))
                {
                    ++outlength;
                }
                else
                {
                    break;
                }
            }

            bitpack.PackBits(END_OF_PATCHES, 8);

            layer.Data = new byte[bitpack.NumBytes];
            Buffer.BlockCopy(bitpack.Data, 0, layer.Data, 0, bitpack.NumBytes);

            return(layer);
        }
Exemplo n.º 2
0
        public static LayerData ToLayerMessage(List <LayerPatch> patches, LayerData.LayerDataType type)
        {
            int outlength;

            return(ToLayerMessage(patches, type, 0, patches.Count, out outlength));
        }