metaverse_environment 0.3.0

metaverse environment data handler
Documentation
use bitreader::BitReader;
use glam::U16Vec2;
use metaverse_environment::{land::parse_heightmap, layer_handler::TerrainHeader};
use metaverse_messages::{
    packet::packet::PacketData,
    udp::environment::layer_data::{LayerData, LayerType},
};
const TEST_BYTES: [u8; 999] = [
    76, 228, 3, 8, 1, 16, 76, 139, 178, 157, 166, 65, 1, 0, 105, 122, 237, 120, 112, 49, 160, 56,
    248, 48, 88, 48, 56, 56, 16, 56, 56, 56, 64, 48, 168, 56, 128, 48, 48, 48, 40, 48, 16, 12, 2,
    14, 2, 14, 8, 14, 10, 12, 24, 14, 20, 12, 8, 12, 6, 12, 2, 0, 28, 4, 28, 12, 28, 12, 24, 32,
    28, 24, 24, 8, 24, 8, 24, 4, 0, 1, 192, 129, 192, 129, 129, 65, 193, 1, 128, 65, 128, 64, 0, 0,
    224, 32, 224, 32, 192, 96, 224, 64, 192, 32, 192, 32, 0, 0, 1, 128, 65, 192, 65, 69, 0, 0, 84,
    32, 130, 128, 98, 28, 2, 117, 121, 114, 65, 237, 163, 167, 7, 52, 135, 180, 12, 132, 30, 100,
    49, 112, 97, 176, 232, 1, 132, 3, 37, 135, 50, 14, 62, 24, 8, 49, 48, 113, 96, 97, 176, 225,
    129, 131, 195, 147, 7, 50, 12, 6, 24, 24, 48, 16, 112, 96, 224, 97, 129, 195, 134, 135, 19, 14,
    24, 12, 10, 28, 28, 56, 8, 96, 80, 224, 33, 128, 131, 129, 7, 1, 7, 3, 14, 8, 12, 4, 14, 4, 28,
    20, 28, 8, 56, 8, 112, 32, 112, 32, 192, 33, 192, 67, 0, 134, 2, 1, 192, 67, 129, 1, 128, 195,
    1, 3, 0, 134, 1, 14, 4, 24, 4, 7, 1, 0, 224, 96, 96, 16, 192, 32, 3, 0, 129, 192, 130, 136,
    207, 247, 146, 65, 7, 0, 135, 117, 167, 236, 207, 184, 246, 151, 137, 156, 224, 200, 71, 58,
    48, 177, 130, 14, 64, 98, 227, 131, 24, 216, 229, 198, 14, 57, 1, 196, 142, 84, 96, 113, 195,
    78, 22, 96, 99, 129, 152, 68, 192, 167, 4, 48, 17, 192, 142, 8, 96, 179, 129, 152, 12, 56, 48,
    224, 131, 130, 140, 2, 56, 17, 128, 71, 1, 48, 9, 128, 70, 1, 7, 1, 48, 8, 192, 32, 28, 4, 56,
    9, 128, 134, 1, 0, 12, 2, 12, 2, 81, 36, 123, 114, 232, 32, 192, 1, 111, 88, 24, 210, 109, 129,
    250, 199, 13, 63, 240, 112, 33, 211, 7, 161, 29, 112, 115, 241, 128, 70, 36, 25, 20, 114, 17,
    192, 135, 34, 24, 8, 98, 113, 193, 198, 5, 12, 28, 48, 216, 225, 67, 12, 140, 6, 48, 24, 112,
    177, 128, 135, 9, 24, 8, 112, 32, 112, 32, 192, 35, 131, 12, 18, 56, 24, 192, 35, 2, 12, 6, 28,
    4, 96, 49, 128, 134, 1, 24, 4, 3, 0, 140, 2, 6, 2, 28, 8, 28, 4, 56, 16, 112, 33, 192, 70, 1,
    12, 2, 0, 112, 17, 128, 67, 0, 142, 2, 56, 16, 192, 64, 3, 128, 128, 0, 24, 4, 64, 0, 0, 20,
    136, 32, 32, 16, 229, 19, 210, 77, 66, 130, 8, 0, 6, 254, 47, 131, 199, 69, 123, 28, 107, 145,
    197, 135, 24, 25, 176, 124, 65, 211, 134, 4, 24, 196, 117, 113, 141, 198, 10, 28, 100, 96, 33,
    198, 7, 1, 28, 64, 97, 49, 194, 70, 11, 24, 20, 113, 32, 195, 67, 0, 142, 10, 56, 8, 224, 99,
    131, 12, 10, 48, 8, 96, 81, 193, 3, 0, 135, 5, 28, 24, 96, 17, 129, 7, 2, 28, 4, 96, 32, 192,
    35, 0, 140, 6, 48, 8, 48, 16, 224, 35, 0, 128, 224, 99, 128, 142, 2, 1, 128, 70, 1, 14, 2, 24,
    4, 0, 56, 8, 224, 32, 0, 224, 34, 136, 188, 116, 137, 65, 9, 0, 43, 120, 109, 235, 46, 5, 114,
    131, 7, 31, 80, 206, 135, 56, 57, 137, 198, 14, 58, 96, 83, 21, 28, 80, 228, 198, 1, 49, 41,
    192, 78, 18, 96, 163, 6, 14, 8, 97, 35, 3, 152, 68, 193, 166, 2, 48, 17, 129, 204, 32, 96, 83,
    135, 28, 8, 192, 134, 2, 24, 4, 192, 38, 5, 48, 32, 96, 48, 192, 35, 128, 142, 4, 112, 17, 128,
    140, 2, 24, 4, 14, 2, 112, 19, 1, 3, 0, 135, 1, 14, 2, 0, 6, 1, 40, 143, 79, 216, 84, 16, 176,
    14, 179, 237, 28, 43, 228, 143, 120, 56, 97, 236, 12, 158, 112, 195, 29, 29, 104, 98, 163, 142,
    28, 124, 232, 103, 27, 56, 241, 199, 140, 28, 96, 99, 6, 152, 12, 224, 198, 1, 56, 201, 133,
    140, 20, 112, 19, 129, 24, 12, 224, 38, 8, 56, 17, 128, 140, 2, 96, 19, 0, 140, 2, 96, 83, 2,
    152, 4, 96, 49, 192, 129, 128, 64, 192, 32, 96, 16, 48, 8, 96, 19, 0, 128, 1, 128, 74, 30, 176,
    114, 65, 4, 20, 3, 140, 237, 140, 12, 239, 44, 28, 252, 44, 49, 224, 77, 76, 193, 236, 46, 196,
    236, 88, 234, 140, 154, 193, 14, 46, 227, 12, 122, 230, 12, 28, 194, 44, 10, 192, 78, 40, 226,
    140, 6, 225, 108, 4, 224, 78, 4, 224, 172, 28, 226, 78, 6, 192, 38, 2, 56, 19, 132, 24, 16,
    192, 46, 2, 224, 46, 6, 48, 24, 48, 11, 0, 156, 4, 48, 9, 192, 64, 96, 23, 2, 96, 19, 128, 128,
    224, 35, 129, 48, 8, 0, 192, 42, 38, 37, 6, 5, 4, 32, 0, 141, 215, 83, 125, 29, 162, 58, 64,
    234, 135, 132, 140, 10, 48, 56, 205, 67, 3, 140, 26, 48, 16, 112, 49, 139, 135, 26, 28, 184,
    56, 48, 227, 3, 133, 12, 6, 48, 112, 192, 227, 1, 12, 46, 48, 192, 192, 163, 129, 14, 10, 56,
    48, 224, 163, 128, 142, 6, 56, 32, 96, 17, 128, 65, 192, 135, 2, 24, 4, 96, 32, 224, 64, 96,
    49, 128, 129, 192, 71, 1, 12, 2, 7, 1, 3, 1, 12, 2, 28, 4, 112, 16, 0, 3, 0, 129, 128, 68, 194,
];
#[test]
fn test_headers() {
    let layer_data = <LayerData as PacketData>::from_bytes(&TEST_BYTES).unwrap();
    assert_eq!(layer_data.layer_type, LayerType::Land);
    assert_eq!(layer_data.stride, 264);
    assert_eq!(layer_data.patch_size, 16);
    let mut reader = BitReader::new(&layer_data.layer_content);
    let header = TerrainHeader::from_bytes(&mut reader, false).unwrap();
    assert_eq!(header.quantized_world_bits, 139);
    assert_eq!(header.world_bits, 13);
    assert_eq!(header.dc_offset, 20.827);
    assert_eq!(header.range, 1);
    assert_eq!(header.location, U16Vec2 { x: 11, y: 9 });
    assert_eq!(header.filename, "");
}

const _CORRECT_PATCH: [i32; 1024] = [
    -5469, -14, 52, -31, 11, 7, -2, -7, -8, 21, -16, 6, 5, 2, 0, 0, 1, -1, -4, -5, 12, -10, 4, 3,
    1, 0, 0, 0, 0, 0, 0, 0, -1, -3, -3, 8, -6, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2,
    5, -4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 3, -2, 1, 1, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
];

const MODIFIED_PATCH: [f32; 256] = [
    -5469.0, -14.0, 52.0, -31.0, 11.0, 7.0, -2.0, -7.0, -8.0, 21.0, -16.0, 6.0, 5.0, 2.0, 0.0, 0.0,
    1.0, -1.0, -4.0, -5.0, 12.0, -10.0, 4.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0,
    -3.0, -3.0, 8.0, -6.0, 2.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, -2.0, -2.0, 5.0, -4.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0, 3.0, -2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
];
const _CORRECT_DECODE: [f32; 256] = [
    20.99907, 20.99819, 20.99697, 20.99616, 20.99637, 20.99767, 20.99961, 21.00141, 21.00238,
    21.00228, 21.00132, 21.00007, 20.99907, 20.99861, 20.99858, 20.99869, 20.99991, 20.99933,
    20.99859, 20.99825, 20.99872, 20.99995, 21.00148, 21.00264, 21.00297, 21.00238, 21.00127,
    21.00024, 20.99976, 20.99994, 21.0005, 21.00095, 21.0035, 21.00262, 21.00123, 20.99983,
    20.99881, 20.99823, 20.99784, 20.9973, 20.99644, 20.99541, 20.99468, 20.99474, 20.99579,
    20.99759, 20.99948, 21.00069, 21.00287, 21.00238, 21.00168, 21.00115, 21.00104, 21.00134,
    21.00176, 21.00196, 21.00178, 21.00135, 21.0011, 21.00146, 21.00265, 21.00443, 21.00623,
    21.00735, 20.99479, 20.99478, 20.99498, 20.99568, 20.99702, 20.99884, 21.00072, 21.00213,
    21.0027, 21.00239, 21.00149, 21.00046, 20.99971, 20.99941, 20.99944, 20.99955, 21.00571,
    21.0049, 21.0036, 21.00229, 21.0014, 21.00108, 21.00121, 21.00145, 21.00146, 21.00107,
    21.00034, 20.99947, 20.99873, 20.99824, 20.99802, 20.99795, 21.00128, 21.00056, 20.99935,
    20.99804, 20.99699, 20.99641, 20.99632, 20.99658, 20.99698, 20.9974, 20.99781, 20.99824,
    20.99874, 20.99928, 20.99976, 21.00005, 20.99589, 20.99648, 20.99757, 20.99896, 21.00041,
    21.00166, 21.0025, 21.00285, 21.00272, 21.00228, 21.00174, 21.0013, 21.00107, 21.00106,
    21.00117, 21.00126, 20.99959, 21.00043, 21.00179, 21.00321, 21.00415, 21.00429, 21.00356,
    21.00218, 21.00058, 20.99921, 20.99843, 20.99838, 20.99897, 20.9999, 21.00082, 21.00138,
    20.99772, 20.99836, 20.99933, 21.00014, 21.00036, 20.99983, 20.9987, 20.99741, 20.9965,
    20.99639, 20.99726, 20.99899, 21.0012, 21.00343, 21.00521, 21.00619, 20.99696, 20.99758,
    20.99855, 20.99947, 20.99999, 21.0, 20.99966, 20.99925, 20.99905, 20.99916, 20.99947, 20.99976,
    20.99983, 20.99965, 20.99933, 20.9991, 21.00488, 21.00467, 21.00416, 21.00326, 21.00201,
    21.00068, 20.99964, 20.99924, 20.99957, 21.00037, 21.00115, 21.00142, 21.0009, 20.99975,
    20.99845, 20.9976, 20.99865, 20.99858, 20.99829, 20.9976, 20.99654, 20.99537, 20.99456,
    20.99456, 20.99552, 20.99718, 20.99897, 21.00024, 21.0006, 21.0001, 20.99923, 20.99858,
    20.99911, 21.00085, 21.00367, 21.00653, 21.00849, 21.00904, 21.00826, 21.00664, 21.00477,
    21.00302, 21.00143, 20.99985, 20.99811, 20.99628, 20.99467, 20.99372, 20.98869, 20.99045,
    20.99306, 20.99514, 20.99552, 20.9938, 20.99056, 20.98717, 20.98521, 20.98584, 20.98943,
    20.99544, 21.00269, 21.00973, 21.01523, 21.01823, 20.87374, 20.87342, 20.87216, 20.86916,
    20.86418, 20.85804, 20.85272, 20.85092, 20.85522, 20.86713, 20.88652, 20.91143, 20.9385,
    20.96367, 20.98302, 20.99352,
];
#[test]
fn test_decode() {
    let layer_data = <LayerData as PacketData>::from_bytes(&TEST_BYTES).unwrap();
    let mut reader = BitReader::new(&layer_data.layer_content);
    let mut terrain_header = TerrainHeader::from_bytes(&mut reader, false).unwrap();
    terrain_header.stride = layer_data.stride;
    terrain_header.patch_size = layer_data.patch_size;
    let patch = parse_heightmap(&mut reader, &terrain_header).unwrap();
    //assert_eq!(patch, MODIFIED_PATCH);
}

#[test]
fn test_decode_heightmap() {
    let layer_data = <LayerData as PacketData>::from_bytes(&TEST_BYTES).unwrap();
    let mut reader = BitReader::new(&layer_data.layer_content);
    let mut terrain_header = TerrainHeader::from_bytes(&mut reader, false).unwrap();
    let patch = parse_heightmap(&mut reader, &terrain_header).unwrap();
    //assert_eq!(patch, MODIFIED_PATCH);
}

const TEST_BYTES_2: [u8; 1002] = [
    76, 231, 3, 8, 1, 16, 76, 137, 76, 55, 139, 65, 6, 0, 12, 121, 228, 246, 35, 75, 140, 228, 53,
    137, 216, 99, 147, 141, 18, 48, 152, 225, 131, 20, 14, 64, 60, 104, 232, 195, 8, 140, 24, 48,
    168, 229, 195, 1, 12, 40, 48, 32, 192, 99, 131, 12, 12, 49, 224, 195, 227, 3, 12, 8, 48, 8, 96,
    49, 133, 6, 5, 28, 40, 96, 64, 192, 64, 112, 193, 192, 70, 1, 28, 4, 96, 17, 128, 71, 1, 12, 4,
    56, 32, 192, 33, 192, 134, 1, 24, 4, 96, 16, 14, 2, 0, 96, 17, 192, 71, 1, 12, 2, 28, 4, 1,
    192, 67, 0, 140, 2, 0, 28, 4, 14, 2, 40, 163, 189, 249, 116, 16, 48, 6, 183, 37, 199, 34, 28,
    26, 61, 88, 54, 64, 119, 144, 230, 33, 152, 3, 164, 134, 18, 14, 4, 24, 52, 56, 240, 98, 96,
    226, 129, 194, 131, 7, 7, 6, 14, 2, 12, 2, 28, 4, 24, 24, 56, 64, 96, 16, 192, 225, 193, 131,
    130, 6, 5, 12, 2, 28, 32, 48, 64, 112, 32, 224, 33, 128, 65, 128, 65, 192, 195, 3, 7, 4, 6, 3,
    14, 4, 28, 4, 48, 16, 56, 16, 96, 48, 224, 65, 128, 64, 3, 128, 134, 1, 14, 2, 12, 2, 1, 192,
    67, 0, 128, 0, 12, 2, 20, 78, 41, 4, 82, 8, 48, 5, 89, 204, 7, 115, 158, 216, 99, 97, 150, 199,
    29, 24, 212, 114, 129, 128, 199, 31, 28, 52, 113, 113, 208, 135, 10, 24, 160, 113, 81, 192, 71,
    28, 24, 4, 112, 209, 192, 198, 3, 28, 4, 96, 33, 129, 7, 12, 28, 4, 112, 65, 128, 67, 3, 142,
    6, 28, 32, 112, 33, 192, 67, 129, 14, 8, 56, 48, 96, 49, 129, 6, 2, 24, 12, 112, 33, 128, 198,
    1, 28, 4, 56, 8, 224, 99, 129, 0, 224, 35, 129, 14, 2, 56, 8, 96, 17, 128, 65, 192, 67, 1, 6,
    2, 24, 4, 0, 1, 192, 69, 22, 0, 1, 80, 130, 4, 0, 4, 241, 142, 240, 128, 100, 240, 234, 240,
    112, 112, 116, 224, 112, 192, 116, 160, 112, 64, 102, 48, 99, 112, 112, 48, 115, 0, 112, 208,
    97, 240, 49, 8, 56, 72, 56, 224, 56, 16, 48, 224, 48, 104, 56, 8, 56, 104, 56, 48, 48, 184, 28,
    12, 14, 6, 6, 13, 7, 4, 7, 4, 3, 2, 131, 1, 0, 224, 64, 192, 160, 112, 32, 56, 16, 28, 8, 3, 0,
    129, 128, 64, 192, 32, 192, 32, 28, 4, 3, 129, 0, 28, 8, 3, 129, 0, 96, 16, 7, 1, 0, 224, 32,
    0, 112, 16, 3, 128, 130, 136, 164, 112, 142, 65, 6, 0, 99, 124, 221, 189, 124, 202, 224, 67,
    48, 28, 232, 233, 199, 179, 56, 233, 135, 78, 6, 112, 67, 16, 152, 244, 199, 71, 1, 56, 145,
    194, 142, 12, 112, 147, 6, 24, 12, 192, 231, 2, 48, 65, 197, 78, 6, 96, 163, 129, 24, 16, 193,
    102, 2, 56, 81, 193, 198, 2, 48, 9, 128, 71, 4, 56, 56, 224, 35, 1, 140, 4, 96, 32, 112, 19,
    129, 12, 2, 14, 2, 112, 16, 112, 33, 128, 65, 192, 64, 224, 37, 21, 236, 81, 74, 130, 2, 1, 70,
    117, 169, 227, 1, 130, 67, 131, 6, 20, 12, 70, 28, 56, 57, 24, 112, 208, 192, 161, 193, 67, 4,
    6, 26, 12, 30, 14, 6, 14, 24, 28, 80, 56, 40, 96, 64, 224, 129, 128, 195, 7, 134, 9, 6, 3, 12,
    12, 28, 12, 56, 56, 112, 32, 112, 96, 225, 129, 192, 131, 2, 7, 3, 12, 2, 24, 36, 48, 40, 112,
    16, 192, 65, 129, 131, 2, 6, 1, 14, 2, 28, 8, 56, 24, 112, 80, 224, 33, 128, 67, 129, 135, 7,
    6, 3, 14, 4, 12, 10, 24, 8, 56, 8, 48, 32, 96, 48, 192, 33, 128, 64, 112, 16, 224, 33, 192,
    131, 129, 131, 1, 7, 1, 14, 8, 12, 4, 28, 4, 24, 12, 48, 8, 112, 32, 96, 32, 192, 32, 192, 32,
    0, 224, 33, 192, 65, 128, 65, 192, 129, 128, 64, 192, 32, 224, 32, 192, 32, 0, 0, 48, 8, 56, 8,
    3, 128, 133, 23, 101, 59, 6, 130, 10, 1, 20, 224, 168, 255, 144, 243, 161, 107, 240, 125, 144,
    106, 32, 100, 176, 101, 64, 101, 160, 110, 192, 100, 176, 103, 16, 114, 96, 98, 64, 115, 16,
    113, 176, 113, 224, 113, 128, 115, 112, 98, 0, 112, 64, 112, 96, 112, 64, 113, 96, 113, 112,
    96, 224, 112, 208, 112, 16, 112, 64, 48, 104, 48, 184, 56, 24, 56, 8, 56, 16, 48, 8, 48, 16, 6,
    9, 6, 12, 6, 3, 7, 2, 3, 0, 129, 128, 129, 128, 129, 128, 65, 192, 64, 224, 32, 96, 16, 48, 8,
    56, 16, 6, 1, 6, 3, 6, 1, 6, 1, 0, 48, 16, 48, 8, 48, 8, 48, 24, 3, 0, 128, 224, 32, 192, 32,
    28, 4, 28, 4, 0, 56, 8, 14, 4, 0, 0, 224, 32, 162, 169, 166, 226, 80, 65, 128, 42, 29, 239, 92,
    28, 117, 176, 114, 80, 213, 33, 230, 67, 143, 6, 7, 12, 206, 28, 52, 48, 96, 114, 96, 225, 33,
    138, 3, 146, 7, 12, 12, 54, 24, 44, 57, 80, 98, 192, 224, 192, 192, 193, 133, 67, 139, 6, 9,
    12, 32, 28, 48, 56, 32, 96, 96, 192, 129, 195, 131, 2, 134, 2, 6, 1, 12, 4, 24, 4, 28, 8, 48,
    72, 112, 112, 192, 97, 128, 195, 128, 129, 128, 67, 129, 134, 5, 7, 1, 6, 2, 3, 0, 134, 1, 1,
    128, 67, 128, 128, 0, 0, 192, 33, 192, 67, 0, 128, 1, 192, 64, 96, 16, 152, 64,
];
const CORRECT_DECODED: [f32; 256] = [
    -1084.0, -177.0, 151.0, 114.0, 433.0, 195.0, -39.0, 137.0, 19.0, -12.0, 40.0, -32.0, -141.0,
    -70.0, 17.0, 12.0, 21.0, -46.0, 2.0, 20.0, 4.0, 3.0, -6.0, 6.0, 60.0, 31.0, 6.0, 4.0, 1.0, 0.0,
    3.0, 20.0, 5.0, -10.0, 4.0, 0.0, 2.0, 0.0, 0.0, 0.0, -12.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0,
    0.0, 2.0, -4.0, 1.0, 0.0, -2.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 1.0, -1.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0,
];
const CORRECT_DECOMPRESSED: [f32; 256] = [
    22.61927, 22.20115, 21.64377, 21.29442, 21.28542, 21.45196, 21.5203, 21.30404, 20.76047,
    20.01574, 19.3418, 18.98948, 19.04571, 19.46067, 20.06426, 20.52613, 22.35172, 21.93731,
    21.40558, 21.08234, 21.07212, 21.21653, 21.22444, 20.87838, 20.20092, 19.44031, 18.88698,
    18.71607, 18.9624, 19.53398, 20.20182, 20.65286, 21.93918, 21.59413, 21.19124, 20.97394,
    20.97079, 21.03827, 20.90727, 20.3653, 19.53265, 18.78827, 18.40493, 18.44817, 18.91116,
    19.66968, 20.41422, 20.84626, 21.5065, 21.2852, 21.08089, 21.01541, 21.0143, 20.94533,
    20.61443, 19.88811, 18.9816, 18.32401, 18.11771, 18.33247, 18.94645, 19.8213, 20.59101,
    20.98311, 21.17494, 21.06143, 21.00271, 21.02313, 20.97922, 20.74393, 20.21414, 19.38076,
    18.52308, 18.03251, 18.02771, 18.41838, 19.14507, 20.03371, 20.72352, 21.02673, 21.0145,
    20.98701, 20.99209, 20.97986, 20.80579, 20.37982, 19.70222, 18.8914, 18.23069, 17.99765,
    18.23401, 18.81693, 19.60839, 20.38452, 20.87551, 21.041, 20.96596, 21.0178, 21.03424,
    20.88806, 20.48913, 19.84868, 19.09848, 18.45691, 18.13894, 18.24853, 18.74063, 19.46492,
    20.21055, 20.75677, 20.99862, 21.03585, 20.96152, 21.0022, 20.91605, 20.55775, 19.92186,
    19.13754, 18.44133, 18.0803, 18.15922, 18.6183, 19.32548, 20.09266, 20.68495, 20.9706,
    21.02478, 21.00686, 20.94914, 20.8, 20.44481, 19.86324, 19.12995, 18.41684, 17.95664, 17.92376,
    18.32071, 19.01706, 19.8347, 20.54557, 20.9427, 21.02904, 21.00286, 20.99725, 20.73216,
    20.30434, 19.65615, 18.97693, 18.36342, 17.93664, 17.8434, 18.12648, 18.71128, 19.48368,
    20.27139, 20.83487, 21.04174, 21.01451, 20.97582, 20.99169, 20.12041, 19.52763, 18.78964,
    18.23103, 17.88726, 17.8038, 18.06541, 18.6044, 19.27713, 19.99721, 20.63046, 20.98611,
    21.04177, 20.97989, 20.95206, 20.9615, 19.2166, 18.66626, 18.10132, 17.84223, 17.82499,
    18.04202, 18.56213, 19.25554, 19.91919, 20.4814, 20.88004, 21.03354, 21.01715, 20.98802,
    20.97656, 20.95609, 18.30676, 17.9536, 17.71675, 17.8295, 18.15691, 18.64063, 19.31154,
    20.01373, 20.5383, 20.85386, 21.00219, 21.01872, 21.00534, 21.02867, 21.0235, 20.97265,
    17.64482, 17.57491, 17.72206, 18.19001, 18.81298, 19.47068, 20.12775, 20.66222, 20.95104,
    21.02933, 21.01113, 20.97952, 20.98763, 21.02326, 21.01399, 20.96467, 17.37293, 17.61435,
    18.13845, 18.88101, 19.65399, 20.29325, 20.73803, 20.98248, 21.05104, 21.02051, 20.98398,
    20.97928, 20.98811, 20.99109, 20.99012, 20.9903, 17.37416, 17.83631, 18.61345, 19.50391,
    20.29825, 20.8202, 21.02947, 21.03913, 20.98899, 20.9595, 20.98013, 21.02083, 21.01919,
    20.98839, 21.00688, 21.06378,
];
// failing test
//#[test]
//fn test_decode_2() {
//    let layer_data = <LayerData as PacketData>::from_bytes(&TEST_BYTES_2).unwrap();
//    let mut reader = BitReader::new(&layer_data.layer_content);
//    let mut terrain_header = TerrainHeader::from_bytes(&mut reader, false).unwrap();
//    terrain_header.stride = layer_data.stride;
//    terrain_header.patch_size = layer_data.patch_size;
//    assert_eq!(terrain_header.location, U16Vec2 { x: 8, y: 12 });
//    let patch = parse_heightmap(&mut reader, &terrain_header).unwrap();
//    //assert_eq!(patch, CORRECT_DECODED);
//    let decompressed = decompress_patch(&terrain_header, &patch);
//    assert_eq!(decompressed, CORRECT_DECOMPRESSED);
//}