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); }
public static LayerData ToLayerMessage(List <LayerPatch> patches, LayerData.LayerDataType type) { int outlength; return(ToLayerMessage(patches, type, 0, patches.Count, out outlength)); }