diff --git a/Cargo.toml b/Cargo.toml index 7a92bd5..3f479f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ bevy = { version = "0.12", default-features = false, features = ["bevy_pbr", "be serde = { version = "1", features = ["derive"] } csv = "1.3" serde_json = "1" +itertools = "0.12" [dev-dependencies] bevy = { version = "0.12", default-features = true } diff --git a/assets/example.bin b/assets/example.bin index db1a136..38561ec 100644 Binary files a/assets/example.bin and b/assets/example.bin differ diff --git a/assets/example.glb b/assets/example.glb deleted file mode 100644 index f66a041..0000000 Binary files a/assets/example.glb and /dev/null differ diff --git a/assets/example.gltf b/assets/example.gltf index 96f7b39..283232f 100644 --- a/assets/example.gltf +++ b/assets/example.gltf @@ -20,11 +20,6 @@ 0.99998539686203, 0.99998539686203, 0.99998539686203 - ], - "translation":[ - 0, - -1.6296021938323975, - 0 ] } ], @@ -855,12 +850,12 @@ "count":818, "max":[ 0.1495724618434906, - 1.809733510017395, + 0.2767115831375122, 0.1419345587491989 ], "min":[ -0.1495724618434906, - 1.5412360429763794, + 0.008214116096496582, -0.16554026305675507 ], "type":"VEC3" @@ -2498,22 +2493,22 @@ { "bufferView":161, "componentType":5123, - "count":7102, + "count":7110, "normalized":true, "type":"VEC4" }, { "bufferView":162, "componentType":5126, - "count":7102, + "count":7110, "max":[ 0.16268186271190643, - 2.042179584503174, + 0.509157657623291, 0.1323217898607254 ], "min":[ -0.17960037291049957, - 1.544281005859375, + 0.011259078979492188, -0.17231248319149017 ], "type":"VEC3" @@ -2521,13 +2516,13 @@ { "bufferView":163, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "bufferView":164, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC2" }, { @@ -2538,7 +2533,7 @@ }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2564,12 +2559,12 @@ { "bufferView":168, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2595,12 +2590,12 @@ { "bufferView":171, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2626,12 +2621,12 @@ { "bufferView":174, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2657,12 +2652,12 @@ { "bufferView":177, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2688,12 +2683,12 @@ { "bufferView":180, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2719,12 +2714,12 @@ { "bufferView":183, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2750,12 +2745,12 @@ { "bufferView":186, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2781,12 +2776,12 @@ { "bufferView":189, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2812,12 +2807,12 @@ { "bufferView":192, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2843,12 +2838,12 @@ { "bufferView":195, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2874,12 +2869,12 @@ { "bufferView":198, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2905,12 +2900,12 @@ { "bufferView":201, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2936,12 +2931,12 @@ { "bufferView":204, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2967,12 +2962,12 @@ { "bufferView":207, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -2998,12 +2993,12 @@ { "bufferView":210, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3029,12 +3024,12 @@ { "bufferView":213, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3060,12 +3055,12 @@ { "bufferView":216, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3091,12 +3086,12 @@ { "bufferView":219, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3122,12 +3117,12 @@ { "bufferView":222, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3153,12 +3148,12 @@ { "bufferView":225, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3184,12 +3179,12 @@ { "bufferView":228, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3215,12 +3210,12 @@ { "bufferView":231, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3246,12 +3241,12 @@ { "bufferView":234, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3277,12 +3272,12 @@ { "bufferView":237, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3308,12 +3303,12 @@ { "bufferView":240, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3339,12 +3334,12 @@ { "bufferView":243, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3370,12 +3365,12 @@ { "bufferView":246, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3401,12 +3396,12 @@ { "bufferView":249, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3432,12 +3427,12 @@ { "bufferView":252, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3463,12 +3458,12 @@ { "bufferView":255, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3494,12 +3489,12 @@ { "bufferView":258, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3525,12 +3520,12 @@ { "bufferView":261, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3556,12 +3551,12 @@ { "bufferView":264, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3587,12 +3582,12 @@ { "bufferView":267, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3618,12 +3613,12 @@ { "bufferView":270, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3649,12 +3644,12 @@ { "bufferView":273, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3680,12 +3675,12 @@ { "bufferView":276, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3711,12 +3706,12 @@ { "bufferView":279, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3742,12 +3737,12 @@ { "bufferView":282, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3773,12 +3768,12 @@ { "bufferView":285, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3804,12 +3799,12 @@ { "bufferView":288, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3835,12 +3830,12 @@ { "bufferView":291, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3866,12 +3861,12 @@ { "bufferView":294, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3897,12 +3892,12 @@ { "bufferView":297, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3928,12 +3923,12 @@ { "bufferView":300, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3959,12 +3954,12 @@ { "bufferView":303, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -3990,12 +3985,12 @@ { "bufferView":306, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -4021,12 +4016,12 @@ { "bufferView":309, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -4052,12 +4047,12 @@ { "bufferView":312, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -4083,12 +4078,12 @@ { "bufferView":315, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -4114,12 +4109,12 @@ { "bufferView":318, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { "componentType":5126, - "count":7102, + "count":7110, "max":[ 0, 0, @@ -4145,7 +4140,7 @@ { "bufferView":321, "componentType":5126, - "count":7102, + "count":7110, "type":"VEC3" }, { @@ -4161,12 +4156,12 @@ "count":1031, "max":[ 0.46760454773902893, - 1.751298189163208, + 0.2182762622833252, 0.13316982984542847 ], "min":[ -0.16014094650745392, - 1.6209526062011719, + 0.08793067932128906, -0.12538738548755646 ], "type":"VEC3" @@ -7135,1940 +7130,1940 @@ }, { "buffer":0, - "byteLength":56816, + "byteLength":56880, "byteOffset":550344, "target":34962 }, { "buffer":0, - "byteLength":85224, - "byteOffset":607160, + "byteLength":85320, + "byteOffset":607224, "target":34962 }, { "buffer":0, - "byteLength":85224, - "byteOffset":692384, + "byteLength":85320, + "byteOffset":692544, "target":34962 }, { "buffer":0, - "byteLength":56816, - "byteOffset":777608, + "byteLength":56880, + "byteOffset":777864, "target":34962 }, { "buffer":0, "byteLength":62856, - "byteOffset":834424, + "byteOffset":834744, "target":34963 }, { "buffer":0, "byteLength":1, - "byteOffset":897280 + "byteOffset":897600 }, { "buffer":0, "byteLength":12, - "byteOffset":897284 + "byteOffset":897604 }, { "buffer":0, - "byteLength":85224, - "byteOffset":897296, + "byteLength":85320, + "byteOffset":897616, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":982520 + "byteOffset":982936 }, { "buffer":0, "byteLength":12, - "byteOffset":982524 + "byteOffset":982940 }, { "buffer":0, - "byteLength":85224, - "byteOffset":982536, + "byteLength":85320, + "byteOffset":982952, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1067760 + "byteOffset":1068272 }, { "buffer":0, "byteLength":12, - "byteOffset":1067764 + "byteOffset":1068276 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1067776, + "byteLength":85320, + "byteOffset":1068288, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1153000 + "byteOffset":1153608 }, { "buffer":0, "byteLength":12, - "byteOffset":1153004 + "byteOffset":1153612 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1153016, + "byteLength":85320, + "byteOffset":1153624, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1238240 + "byteOffset":1238944 }, { "buffer":0, "byteLength":12, - "byteOffset":1238244 + "byteOffset":1238948 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1238256, + "byteLength":85320, + "byteOffset":1238960, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1323480 + "byteOffset":1324280 }, { "buffer":0, "byteLength":12, - "byteOffset":1323484 + "byteOffset":1324284 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1323496, + "byteLength":85320, + "byteOffset":1324296, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1408720 + "byteOffset":1409616 }, { "buffer":0, "byteLength":12, - "byteOffset":1408724 + "byteOffset":1409620 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1408736, + "byteLength":85320, + "byteOffset":1409632, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1493960 + "byteOffset":1494952 }, { "buffer":0, "byteLength":12, - "byteOffset":1493964 + "byteOffset":1494956 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1493976, + "byteLength":85320, + "byteOffset":1494968, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1579200 + "byteOffset":1580288 }, { "buffer":0, "byteLength":12, - "byteOffset":1579204 + "byteOffset":1580292 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1579216, + "byteLength":85320, + "byteOffset":1580304, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1664440 + "byteOffset":1665624 }, { "buffer":0, "byteLength":12, - "byteOffset":1664444 + "byteOffset":1665628 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1664456, + "byteLength":85320, + "byteOffset":1665640, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1749680 + "byteOffset":1750960 }, { "buffer":0, "byteLength":12, - "byteOffset":1749684 + "byteOffset":1750964 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1749696, + "byteLength":85320, + "byteOffset":1750976, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1834920 + "byteOffset":1836296 }, { "buffer":0, "byteLength":12, - "byteOffset":1834924 + "byteOffset":1836300 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1834936, + "byteLength":85320, + "byteOffset":1836312, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":1920160 + "byteOffset":1921632 }, { "buffer":0, "byteLength":12, - "byteOffset":1920164 + "byteOffset":1921636 }, { "buffer":0, - "byteLength":85224, - "byteOffset":1920176, + "byteLength":85320, + "byteOffset":1921648, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2005400 + "byteOffset":2006968 }, { "buffer":0, "byteLength":12, - "byteOffset":2005404 + "byteOffset":2006972 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2005416, + "byteLength":85320, + "byteOffset":2006984, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2090640 + "byteOffset":2092304 }, { "buffer":0, "byteLength":12, - "byteOffset":2090644 + "byteOffset":2092308 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2090656, + "byteLength":85320, + "byteOffset":2092320, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2175880 + "byteOffset":2177640 }, { "buffer":0, "byteLength":12, - "byteOffset":2175884 + "byteOffset":2177644 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2175896, + "byteLength":85320, + "byteOffset":2177656, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2261120 + "byteOffset":2262976 }, { "buffer":0, "byteLength":12, - "byteOffset":2261124 + "byteOffset":2262980 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2261136, + "byteLength":85320, + "byteOffset":2262992, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2346360 + "byteOffset":2348312 }, { "buffer":0, "byteLength":12, - "byteOffset":2346364 + "byteOffset":2348316 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2346376, + "byteLength":85320, + "byteOffset":2348328, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2431600 + "byteOffset":2433648 }, { "buffer":0, "byteLength":12, - "byteOffset":2431604 + "byteOffset":2433652 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2431616, + "byteLength":85320, + "byteOffset":2433664, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2516840 + "byteOffset":2518984 }, { "buffer":0, "byteLength":12, - "byteOffset":2516844 + "byteOffset":2518988 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2516856, + "byteLength":85320, + "byteOffset":2519000, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2602080 + "byteOffset":2604320 }, { "buffer":0, "byteLength":12, - "byteOffset":2602084 + "byteOffset":2604324 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2602096, + "byteLength":85320, + "byteOffset":2604336, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2687320 + "byteOffset":2689656 }, { "buffer":0, "byteLength":12, - "byteOffset":2687324 + "byteOffset":2689660 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2687336, + "byteLength":85320, + "byteOffset":2689672, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2772560 + "byteOffset":2774992 }, { "buffer":0, "byteLength":12, - "byteOffset":2772564 + "byteOffset":2774996 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2772576, + "byteLength":85320, + "byteOffset":2775008, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2857800 + "byteOffset":2860328 }, { "buffer":0, "byteLength":12, - "byteOffset":2857804 + "byteOffset":2860332 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2857816, + "byteLength":85320, + "byteOffset":2860344, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":2943040 + "byteOffset":2945664 }, { "buffer":0, "byteLength":12, - "byteOffset":2943044 + "byteOffset":2945668 }, { "buffer":0, - "byteLength":85224, - "byteOffset":2943056, + "byteLength":85320, + "byteOffset":2945680, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3028280 + "byteOffset":3031000 }, { "buffer":0, "byteLength":12, - "byteOffset":3028284 + "byteOffset":3031004 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3028296, + "byteLength":85320, + "byteOffset":3031016, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3113520 + "byteOffset":3116336 }, { "buffer":0, "byteLength":12, - "byteOffset":3113524 + "byteOffset":3116340 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3113536, + "byteLength":85320, + "byteOffset":3116352, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3198760 + "byteOffset":3201672 }, { "buffer":0, "byteLength":12, - "byteOffset":3198764 + "byteOffset":3201676 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3198776, + "byteLength":85320, + "byteOffset":3201688, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3284000 + "byteOffset":3287008 }, { "buffer":0, "byteLength":12, - "byteOffset":3284004 + "byteOffset":3287012 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3284016, + "byteLength":85320, + "byteOffset":3287024, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3369240 + "byteOffset":3372344 }, { "buffer":0, "byteLength":12, - "byteOffset":3369244 + "byteOffset":3372348 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3369256, + "byteLength":85320, + "byteOffset":3372360, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3454480 + "byteOffset":3457680 }, { "buffer":0, "byteLength":12, - "byteOffset":3454484 + "byteOffset":3457684 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3454496, + "byteLength":85320, + "byteOffset":3457696, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3539720 + "byteOffset":3543016 }, { "buffer":0, "byteLength":12, - "byteOffset":3539724 + "byteOffset":3543020 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3539736, + "byteLength":85320, + "byteOffset":3543032, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3624960 + "byteOffset":3628352 }, { "buffer":0, "byteLength":12, - "byteOffset":3624964 + "byteOffset":3628356 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3624976, + "byteLength":85320, + "byteOffset":3628368, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3710200 + "byteOffset":3713688 }, { "buffer":0, "byteLength":12, - "byteOffset":3710204 + "byteOffset":3713692 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3710216, + "byteLength":85320, + "byteOffset":3713704, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3795440 + "byteOffset":3799024 }, { "buffer":0, "byteLength":12, - "byteOffset":3795444 + "byteOffset":3799028 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3795456, + "byteLength":85320, + "byteOffset":3799040, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3880680 + "byteOffset":3884360 }, { "buffer":0, "byteLength":12, - "byteOffset":3880684 + "byteOffset":3884364 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3880696, + "byteLength":85320, + "byteOffset":3884376, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":3965920 + "byteOffset":3969696 }, { "buffer":0, "byteLength":12, - "byteOffset":3965924 + "byteOffset":3969700 }, { "buffer":0, - "byteLength":85224, - "byteOffset":3965936, + "byteLength":85320, + "byteOffset":3969712, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4051160 + "byteOffset":4055032 }, { "buffer":0, "byteLength":12, - "byteOffset":4051164 + "byteOffset":4055036 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4051176, + "byteLength":85320, + "byteOffset":4055048, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4136400 + "byteOffset":4140368 }, { "buffer":0, "byteLength":12, - "byteOffset":4136404 + "byteOffset":4140372 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4136416, + "byteLength":85320, + "byteOffset":4140384, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4221640 + "byteOffset":4225704 }, { "buffer":0, "byteLength":12, - "byteOffset":4221644 + "byteOffset":4225708 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4221656, + "byteLength":85320, + "byteOffset":4225720, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4306880 + "byteOffset":4311040 }, { "buffer":0, "byteLength":12, - "byteOffset":4306884 + "byteOffset":4311044 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4306896, + "byteLength":85320, + "byteOffset":4311056, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4392120 + "byteOffset":4396376 }, { "buffer":0, "byteLength":12, - "byteOffset":4392124 + "byteOffset":4396380 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4392136, + "byteLength":85320, + "byteOffset":4396392, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4477360 + "byteOffset":4481712 }, { "buffer":0, "byteLength":12, - "byteOffset":4477364 + "byteOffset":4481716 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4477376, + "byteLength":85320, + "byteOffset":4481728, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4562600 + "byteOffset":4567048 }, { "buffer":0, "byteLength":12, - "byteOffset":4562604 + "byteOffset":4567052 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4562616, + "byteLength":85320, + "byteOffset":4567064, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4647840 + "byteOffset":4652384 }, { "buffer":0, "byteLength":12, - "byteOffset":4647844 + "byteOffset":4652388 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4647856, + "byteLength":85320, + "byteOffset":4652400, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4733080 + "byteOffset":4737720 }, { "buffer":0, "byteLength":12, - "byteOffset":4733084 + "byteOffset":4737724 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4733096, + "byteLength":85320, + "byteOffset":4737736, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4818320 + "byteOffset":4823056 }, { "buffer":0, "byteLength":12, - "byteOffset":4818324 + "byteOffset":4823060 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4818336, + "byteLength":85320, + "byteOffset":4823072, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4903560 + "byteOffset":4908392 }, { "buffer":0, "byteLength":12, - "byteOffset":4903564 + "byteOffset":4908396 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4903576, + "byteLength":85320, + "byteOffset":4908408, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":4988800 + "byteOffset":4993728 }, { "buffer":0, "byteLength":12, - "byteOffset":4988804 + "byteOffset":4993732 }, { "buffer":0, - "byteLength":85224, - "byteOffset":4988816, + "byteLength":85320, + "byteOffset":4993744, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":5074040 + "byteOffset":5079064 }, { "buffer":0, "byteLength":12, - "byteOffset":5074044 + "byteOffset":5079068 }, { "buffer":0, - "byteLength":85224, - "byteOffset":5074056, + "byteLength":85320, + "byteOffset":5079080, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":5159280 + "byteOffset":5164400 }, { "buffer":0, "byteLength":12, - "byteOffset":5159284 + "byteOffset":5164404 }, { "buffer":0, - "byteLength":85224, - "byteOffset":5159296, + "byteLength":85320, + "byteOffset":5164416, "target":34962 }, { "buffer":0, "byteLength":1, - "byteOffset":5244520 + "byteOffset":5249736 }, { "buffer":0, "byteLength":12, - "byteOffset":5244524 + "byteOffset":5249740 }, { "buffer":0, - "byteLength":85224, - "byteOffset":5244536, + "byteLength":85320, + "byteOffset":5249752, "target":34962 }, { "buffer":0, "byteLength":8248, - "byteOffset":5329760, + "byteOffset":5335072, "target":34962 }, { "buffer":0, "byteLength":12372, - "byteOffset":5338008, + "byteOffset":5343320, "target":34962 }, { "buffer":0, "byteLength":12372, - "byteOffset":5350380, + "byteOffset":5355692, "target":34962 }, { "buffer":0, "byteLength":8248, - "byteOffset":5362752, + "byteOffset":5368064, "target":34962 }, { "buffer":0, "byteLength":6144, - "byteOffset":5371000, + "byteOffset":5376312, "target":34963 }, { "buffer":0, "byteLength":1550, - "byteOffset":5377144 + "byteOffset":5382456 }, { "buffer":0, "byteLength":9300, - "byteOffset":5378696 + "byteOffset":5384008 }, { "buffer":0, "byteLength":18, - "byteOffset":5387996 + "byteOffset":5393308 }, { "buffer":0, "byteLength":108, - "byteOffset":5388016 + "byteOffset":5393328 }, { "buffer":0, "byteLength":1550, - "byteOffset":5388124 + "byteOffset":5393436 }, { "buffer":0, "byteLength":9300, - "byteOffset":5389676 + "byteOffset":5394988 }, { "buffer":0, "byteLength":1, - "byteOffset":5398976 + "byteOffset":5404288 }, { "buffer":0, "byteLength":12, - "byteOffset":5398980 + "byteOffset":5404292 }, { "buffer":0, "byteLength":1550, - "byteOffset":5398992 + "byteOffset":5404304 }, { "buffer":0, "byteLength":9300, - "byteOffset":5400544 + "byteOffset":5405856 }, { "buffer":0, "byteLength":1, - "byteOffset":5409844 + "byteOffset":5415156 }, { "buffer":0, "byteLength":12, - "byteOffset":5409848 + "byteOffset":5415160 }, { "buffer":0, "byteLength":1550, - "byteOffset":5409860 + "byteOffset":5415172 }, { "buffer":0, "byteLength":9300, - "byteOffset":5411412 + "byteOffset":5416724 }, { "buffer":0, "byteLength":1, - "byteOffset":5420712 + "byteOffset":5426024 }, { "buffer":0, "byteLength":12, - "byteOffset":5420716 + "byteOffset":5426028 }, { "buffer":0, "byteLength":1550, - "byteOffset":5420728 + "byteOffset":5426040 }, { "buffer":0, "byteLength":9300, - "byteOffset":5422280 + "byteOffset":5427592 }, { "buffer":0, "byteLength":1, - "byteOffset":5431580 + "byteOffset":5436892 }, { "buffer":0, "byteLength":12, - "byteOffset":5431584 + "byteOffset":5436896 }, { "buffer":0, "byteLength":1550, - "byteOffset":5431596 + "byteOffset":5436908 }, { "buffer":0, "byteLength":9300, - "byteOffset":5433148 + "byteOffset":5438460 }, { "buffer":0, "byteLength":1, - "byteOffset":5442448 + "byteOffset":5447760 }, { "buffer":0, "byteLength":12, - "byteOffset":5442452 + "byteOffset":5447764 }, { "buffer":0, "byteLength":1550, - "byteOffset":5442464 + "byteOffset":5447776 }, { "buffer":0, "byteLength":9300, - "byteOffset":5444016 + "byteOffset":5449328 }, { "buffer":0, "byteLength":1, - "byteOffset":5453316 + "byteOffset":5458628 }, { "buffer":0, "byteLength":12, - "byteOffset":5453320 + "byteOffset":5458632 }, { "buffer":0, "byteLength":1550, - "byteOffset":5453332 + "byteOffset":5458644 }, { "buffer":0, "byteLength":9300, - "byteOffset":5454884 + "byteOffset":5460196 }, { "buffer":0, "byteLength":12, - "byteOffset":5464184 + "byteOffset":5469496 }, { "buffer":0, "byteLength":72, - "byteOffset":5464196 + "byteOffset":5469508 }, { "buffer":0, "byteLength":1550, - "byteOffset":5464268 + "byteOffset":5469580 }, { "buffer":0, "byteLength":9300, - "byteOffset":5465820 + "byteOffset":5471132 }, { "buffer":0, "byteLength":1, - "byteOffset":5475120 + "byteOffset":5480432 }, { "buffer":0, "byteLength":12, - "byteOffset":5475124 + "byteOffset":5480436 }, { "buffer":0, "byteLength":1550, - "byteOffset":5475136 + "byteOffset":5480448 }, { "buffer":0, "byteLength":9300, - "byteOffset":5476688 + "byteOffset":5482000 }, { "buffer":0, "byteLength":1, - "byteOffset":5485988 + "byteOffset":5491300 }, { "buffer":0, "byteLength":12, - "byteOffset":5485992 + "byteOffset":5491304 }, { "buffer":0, "byteLength":1550, - "byteOffset":5486004 + "byteOffset":5491316 }, { "buffer":0, "byteLength":9300, - "byteOffset":5487556 + "byteOffset":5492868 }, { "buffer":0, "byteLength":1, - "byteOffset":5496856 + "byteOffset":5502168 }, { "buffer":0, "byteLength":12, - "byteOffset":5496860 + "byteOffset":5502172 }, { "buffer":0, "byteLength":1550, - "byteOffset":5496872 + "byteOffset":5502184 }, { "buffer":0, "byteLength":9300, - "byteOffset":5498424 + "byteOffset":5503736 }, { "buffer":0, "byteLength":1, - "byteOffset":5507724 + "byteOffset":5513036 }, { "buffer":0, "byteLength":12, - "byteOffset":5507728 + "byteOffset":5513040 }, { "buffer":0, "byteLength":1550, - "byteOffset":5507740 + "byteOffset":5513052 }, { "buffer":0, "byteLength":9300, - "byteOffset":5509292 + "byteOffset":5514604 }, { "buffer":0, "byteLength":1, - "byteOffset":5518592 + "byteOffset":5523904 }, { "buffer":0, "byteLength":12, - "byteOffset":5518596 + "byteOffset":5523908 }, { "buffer":0, "byteLength":1550, - "byteOffset":5518608 + "byteOffset":5523920 }, { "buffer":0, "byteLength":9300, - "byteOffset":5520160 + "byteOffset":5525472 }, { "buffer":0, "byteLength":1, - "byteOffset":5529460 + "byteOffset":5534772 }, { "buffer":0, "byteLength":12, - "byteOffset":5529464 + "byteOffset":5534776 }, { "buffer":0, "byteLength":1550, - "byteOffset":5529476 + "byteOffset":5534788 }, { "buffer":0, "byteLength":9300, - "byteOffset":5531028 + "byteOffset":5536340 }, { "buffer":0, "byteLength":1, - "byteOffset":5540328 + "byteOffset":5545640 }, { "buffer":0, "byteLength":12, - "byteOffset":5540332 + "byteOffset":5545644 }, { "buffer":0, "byteLength":1550, - "byteOffset":5540344 + "byteOffset":5545656 }, { "buffer":0, "byteLength":9300, - "byteOffset":5541896 + "byteOffset":5547208 }, { "buffer":0, "byteLength":1, - "byteOffset":5551196 + "byteOffset":5556508 }, { "buffer":0, "byteLength":12, - "byteOffset":5551200 + "byteOffset":5556512 }, { "buffer":0, "byteLength":1550, - "byteOffset":5551212 + "byteOffset":5556524 }, { "buffer":0, "byteLength":9300, - "byteOffset":5552764 + "byteOffset":5558076 }, { "buffer":0, "byteLength":1, - "byteOffset":5562064 + "byteOffset":5567376 }, { "buffer":0, "byteLength":12, - "byteOffset":5562068 + "byteOffset":5567380 }, { "buffer":0, "byteLength":1550, - "byteOffset":5562080 + "byteOffset":5567392 }, { "buffer":0, "byteLength":9300, - "byteOffset":5563632 + "byteOffset":5568944 }, { "buffer":0, "byteLength":1, - "byteOffset":5572932 + "byteOffset":5578244 }, { "buffer":0, "byteLength":12, - "byteOffset":5572936 + "byteOffset":5578248 }, { "buffer":0, "byteLength":1550, - "byteOffset":5572948 + "byteOffset":5578260 }, { "buffer":0, "byteLength":9300, - "byteOffset":5574500 + "byteOffset":5579812 }, { "buffer":0, "byteLength":1, - "byteOffset":5583800 + "byteOffset":5589112 }, { "buffer":0, "byteLength":12, - "byteOffset":5583804 + "byteOffset":5589116 }, { "buffer":0, "byteLength":1550, - "byteOffset":5583816 + "byteOffset":5589128 }, { "buffer":0, "byteLength":9300, - "byteOffset":5585368 + "byteOffset":5590680 }, { "buffer":0, "byteLength":1, - "byteOffset":5594668 + "byteOffset":5599980 }, { "buffer":0, "byteLength":12, - "byteOffset":5594672 + "byteOffset":5599984 }, { "buffer":0, "byteLength":1550, - "byteOffset":5594684 + "byteOffset":5599996 }, { "buffer":0, "byteLength":9300, - "byteOffset":5596236 + "byteOffset":5601548 }, { "buffer":0, "byteLength":16, - "byteOffset":5605536 + "byteOffset":5610848 }, { "buffer":0, "byteLength":96, - "byteOffset":5605552 + "byteOffset":5610864 }, { "buffer":0, "byteLength":1550, - "byteOffset":5605648 + "byteOffset":5610960 }, { "buffer":0, "byteLength":9300, - "byteOffset":5607200 + "byteOffset":5612512 }, { "buffer":0, "byteLength":1, - "byteOffset":5616500 + "byteOffset":5621812 }, { "buffer":0, "byteLength":12, - "byteOffset":5616504 + "byteOffset":5621816 }, { "buffer":0, "byteLength":1550, - "byteOffset":5616516 + "byteOffset":5621828 }, { "buffer":0, "byteLength":9300, - "byteOffset":5618068 + "byteOffset":5623380 }, { "buffer":0, "byteLength":1, - "byteOffset":5627368 + "byteOffset":5632680 }, { "buffer":0, "byteLength":12, - "byteOffset":5627372 + "byteOffset":5632684 }, { "buffer":0, "byteLength":1550, - "byteOffset":5627384 + "byteOffset":5632696 }, { "buffer":0, "byteLength":9300, - "byteOffset":5628936 + "byteOffset":5634248 }, { "buffer":0, "byteLength":1, - "byteOffset":5638236 + "byteOffset":5643548 }, { "buffer":0, "byteLength":12, - "byteOffset":5638240 + "byteOffset":5643552 }, { "buffer":0, "byteLength":1550, - "byteOffset":5638252 + "byteOffset":5643564 }, { "buffer":0, "byteLength":9300, - "byteOffset":5639804 + "byteOffset":5645116 }, { "buffer":0, "byteLength":1, - "byteOffset":5649104 + "byteOffset":5654416 }, { "buffer":0, "byteLength":12, - "byteOffset":5649108 + "byteOffset":5654420 }, { "buffer":0, "byteLength":1550, - "byteOffset":5649120 + "byteOffset":5654432 }, { "buffer":0, "byteLength":9300, - "byteOffset":5650672 + "byteOffset":5655984 }, { "buffer":0, "byteLength":1, - "byteOffset":5659972 + "byteOffset":5665284 }, { "buffer":0, "byteLength":12, - "byteOffset":5659976 + "byteOffset":5665288 }, { "buffer":0, "byteLength":1550, - "byteOffset":5659988 + "byteOffset":5665300 }, { "buffer":0, "byteLength":9300, - "byteOffset":5661540 + "byteOffset":5666852 }, { "buffer":0, "byteLength":1, - "byteOffset":5670840 + "byteOffset":5676152 }, { "buffer":0, "byteLength":12, - "byteOffset":5670844 + "byteOffset":5676156 }, { "buffer":0, "byteLength":1550, - "byteOffset":5670856 + "byteOffset":5676168 }, { "buffer":0, "byteLength":9300, - "byteOffset":5672408 + "byteOffset":5677720 }, { "buffer":0, "byteLength":30, - "byteOffset":5681708 + "byteOffset":5687020 }, { "buffer":0, "byteLength":180, - "byteOffset":5681740 + "byteOffset":5687052 }, { "buffer":0, "byteLength":1550, - "byteOffset":5681920 + "byteOffset":5687232 }, { "buffer":0, "byteLength":9300, - "byteOffset":5683472 + "byteOffset":5688784 }, { "buffer":0, "byteLength":58, - "byteOffset":5692772 + "byteOffset":5698084 }, { "buffer":0, "byteLength":348, - "byteOffset":5692832 + "byteOffset":5698144 }, { "buffer":0, "byteLength":1550, - "byteOffset":5693180 + "byteOffset":5698492 }, { "buffer":0, "byteLength":9300, - "byteOffset":5694732 + "byteOffset":5700044 }, { "buffer":0, "byteLength":66, - "byteOffset":5704032 + "byteOffset":5709344 }, { "buffer":0, "byteLength":396, - "byteOffset":5704100 + "byteOffset":5709412 }, { "buffer":0, "byteLength":1550, - "byteOffset":5704496 + "byteOffset":5709808 }, { "buffer":0, "byteLength":9300, - "byteOffset":5706048 + "byteOffset":5711360 }, { "buffer":0, "byteLength":34, - "byteOffset":5715348 + "byteOffset":5720660 }, { "buffer":0, "byteLength":204, - "byteOffset":5715384 + "byteOffset":5720696 }, { "buffer":0, "byteLength":1550, - "byteOffset":5715588 + "byteOffset":5720900 }, { "buffer":0, "byteLength":9300, - "byteOffset":5717140 + "byteOffset":5722452 }, { "buffer":0, "byteLength":130, - "byteOffset":5726440 + "byteOffset":5731752 }, { "buffer":0, "byteLength":780, - "byteOffset":5726572 + "byteOffset":5731884 }, { "buffer":0, "byteLength":1550, - "byteOffset":5727352 + "byteOffset":5732664 }, { "buffer":0, "byteLength":9300, - "byteOffset":5728904 + "byteOffset":5734216 }, { "buffer":0, "byteLength":6, - "byteOffset":5738204 + "byteOffset":5743516 }, { "buffer":0, "byteLength":36, - "byteOffset":5738212 + "byteOffset":5743524 }, { "buffer":0, "byteLength":1550, - "byteOffset":5738248 + "byteOffset":5743560 }, { "buffer":0, "byteLength":9300, - "byteOffset":5739800 + "byteOffset":5745112 }, { "buffer":0, "byteLength":1, - "byteOffset":5749100 + "byteOffset":5754412 }, { "buffer":0, "byteLength":12, - "byteOffset":5749104 + "byteOffset":5754416 }, { "buffer":0, "byteLength":1550, - "byteOffset":5749116 + "byteOffset":5754428 }, { "buffer":0, "byteLength":9300, - "byteOffset":5750668 + "byteOffset":5755980 }, { "buffer":0, "byteLength":1, - "byteOffset":5759968 + "byteOffset":5765280 }, { "buffer":0, "byteLength":12, - "byteOffset":5759972 + "byteOffset":5765284 }, { "buffer":0, "byteLength":1550, - "byteOffset":5759984 + "byteOffset":5765296 }, { "buffer":0, "byteLength":9300, - "byteOffset":5761536 + "byteOffset":5766848 }, { "buffer":0, "byteLength":1, - "byteOffset":5770836 + "byteOffset":5776148 }, { "buffer":0, "byteLength":12, - "byteOffset":5770840 + "byteOffset":5776152 }, { "buffer":0, "byteLength":1550, - "byteOffset":5770852 + "byteOffset":5776164 }, { "buffer":0, "byteLength":9300, - "byteOffset":5772404 + "byteOffset":5777716 }, { "buffer":0, "byteLength":1, - "byteOffset":5781704 + "byteOffset":5787016 }, { "buffer":0, "byteLength":12, - "byteOffset":5781708 + "byteOffset":5787020 }, { "buffer":0, "byteLength":1550, - "byteOffset":5781720 + "byteOffset":5787032 }, { "buffer":0, "byteLength":9300, - "byteOffset":5783272 + "byteOffset":5788584 }, { "buffer":0, "byteLength":1, - "byteOffset":5792572 + "byteOffset":5797884 }, { "buffer":0, "byteLength":12, - "byteOffset":5792576 + "byteOffset":5797888 }, { "buffer":0, "byteLength":1550, - "byteOffset":5792588 + "byteOffset":5797900 }, { "buffer":0, "byteLength":9300, - "byteOffset":5794140 + "byteOffset":5799452 }, { "buffer":0, "byteLength":6, - "byteOffset":5803440 + "byteOffset":5808752 }, { "buffer":0, "byteLength":36, - "byteOffset":5803448 + "byteOffset":5808760 }, { "buffer":0, "byteLength":1550, - "byteOffset":5803484 + "byteOffset":5808796 }, { "buffer":0, "byteLength":9300, - "byteOffset":5805036 + "byteOffset":5810348 }, { "buffer":0, "byteLength":1, - "byteOffset":5814336 + "byteOffset":5819648 }, { "buffer":0, "byteLength":12, - "byteOffset":5814340 + "byteOffset":5819652 }, { "buffer":0, "byteLength":1550, - "byteOffset":5814352 + "byteOffset":5819664 }, { "buffer":0, "byteLength":9300, - "byteOffset":5815904 + "byteOffset":5821216 }, { "buffer":0, "byteLength":1, - "byteOffset":5825204 + "byteOffset":5830516 }, { "buffer":0, "byteLength":12, - "byteOffset":5825208 + "byteOffset":5830520 }, { "buffer":0, "byteLength":1550, - "byteOffset":5825220 + "byteOffset":5830532 }, { "buffer":0, "byteLength":9300, - "byteOffset":5826772 + "byteOffset":5832084 }, { "buffer":0, "byteLength":1, - "byteOffset":5836072 + "byteOffset":5841384 }, { "buffer":0, "byteLength":12, - "byteOffset":5836076 + "byteOffset":5841388 }, { "buffer":0, "byteLength":1550, - "byteOffset":5836088 + "byteOffset":5841400 }, { "buffer":0, "byteLength":9300, - "byteOffset":5837640 + "byteOffset":5842952 }, { "buffer":0, "byteLength":1, - "byteOffset":5846940 + "byteOffset":5852252 }, { "buffer":0, "byteLength":12, - "byteOffset":5846944 + "byteOffset":5852256 }, { "buffer":0, "byteLength":1550, - "byteOffset":5846956 + "byteOffset":5852268 }, { "buffer":0, "byteLength":9300, - "byteOffset":5848508 + "byteOffset":5853820 }, { "buffer":0, "byteLength":1, - "byteOffset":5857808 + "byteOffset":5863120 }, { "buffer":0, "byteLength":12, - "byteOffset":5857812 + "byteOffset":5863124 }, { "buffer":0, "byteLength":1550, - "byteOffset":5857824 + "byteOffset":5863136 }, { "buffer":0, "byteLength":9300, - "byteOffset":5859376 + "byteOffset":5864688 }, { "buffer":0, "byteLength":1, - "byteOffset":5868676 + "byteOffset":5873988 }, { "buffer":0, "byteLength":12, - "byteOffset":5868680 + "byteOffset":5873992 }, { "buffer":0, "byteLength":1550, - "byteOffset":5868692 + "byteOffset":5874004 }, { "buffer":0, "byteLength":9300, - "byteOffset":5870244 + "byteOffset":5875556 }, { "buffer":0, "byteLength":1, - "byteOffset":5879544 + "byteOffset":5884856 }, { "buffer":0, "byteLength":12, - "byteOffset":5879548 + "byteOffset":5884860 }, { "buffer":0, "byteLength":1550, - "byteOffset":5879560 + "byteOffset":5884872 }, { "buffer":0, "byteLength":9300, - "byteOffset":5881112 + "byteOffset":5886424 }, { "buffer":0, "byteLength":6, - "byteOffset":5890412 + "byteOffset":5895724 }, { "buffer":0, "byteLength":36, - "byteOffset":5890420 + "byteOffset":5895732 }, { "buffer":0, "byteLength":1550, - "byteOffset":5890456 + "byteOffset":5895768 }, { "buffer":0, "byteLength":9300, - "byteOffset":5892008 + "byteOffset":5897320 }, { "buffer":0, "byteLength":1, - "byteOffset":5901308 + "byteOffset":5906620 }, { "buffer":0, "byteLength":12, - "byteOffset":5901312 + "byteOffset":5906624 }, { "buffer":0, "byteLength":1550, - "byteOffset":5901324 + "byteOffset":5906636 }, { "buffer":0, "byteLength":9300, - "byteOffset":5902876 + "byteOffset":5908188 }, { "buffer":0, "byteLength":1, - "byteOffset":5912176 + "byteOffset":5917488 }, { "buffer":0, "byteLength":12, - "byteOffset":5912180 + "byteOffset":5917492 }, { "buffer":0, "byteLength":1550, - "byteOffset":5912192 + "byteOffset":5917504 }, { "buffer":0, "byteLength":9300, - "byteOffset":5913744 + "byteOffset":5919056 }, { "buffer":0, "byteLength":1, - "byteOffset":5923044 + "byteOffset":5928356 }, { "buffer":0, "byteLength":12, - "byteOffset":5923048 + "byteOffset":5928360 }, { "buffer":0, "byteLength":1550, - "byteOffset":5923060 + "byteOffset":5928372 }, { "buffer":0, "byteLength":9300, - "byteOffset":5924612 + "byteOffset":5929924 }, { "buffer":0, "byteLength":1, - "byteOffset":5933912 + "byteOffset":5939224 }, { "buffer":0, "byteLength":12, - "byteOffset":5933916 + "byteOffset":5939228 }, { "buffer":0, "byteLength":1550, - "byteOffset":5933928 + "byteOffset":5939240 }, { "buffer":0, "byteLength":9300, - "byteOffset":5935480 + "byteOffset":5940792 }, { "buffer":0, "byteLength":1, - "byteOffset":5944780 + "byteOffset":5950092 }, { "buffer":0, "byteLength":12, - "byteOffset":5944784 + "byteOffset":5950096 } ], "buffers":[ { - "byteLength":5944796, + "byteLength":5950108, "uri":"example.bin" } ] diff --git a/assets/example_mapping.json b/assets/example_mapping.json index 73878a7..7924568 100644 --- a/assets/example_mapping.json +++ b/assets/example_mapping.json @@ -50,5 +50,18 @@ ["cheekSquintRight", "CheekSquintRight"], ["noseSneerLeft", "NoseSneerLeft"], ["noseSneerRight", "NoseSneerRight"], - ["tongueOut", "TongueOut"] + ["tongueOut", "TongueOut"], + [{ + "path": ["pascal_Head"], + "axis": "Y" + }, "HeadYaw"], + [{ + "path": ["pascal_Head"], + "axis": "X", + "offset": -45 + }, "HeadPitch"], + [{ + "path": ["pascal_Head"], + "axis": "Z" + }, "HeadRoll"] ] \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index b16a495..328ed7f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,9 @@ use std::{num::ParseFloatError, path::PathBuf, str::FromStr, string::FromUtf8Error}; use bevy::{ - animation::{AnimationClip, EntityPath, Keyframes, VariableCurve}, - app::Plugin, - asset::{Asset, AssetApp, AssetLoader, AsyncReadExt, ReadAssetBytesError}, - core::Name, - log::info, - reflect::Reflect, - utils::hashbrown::HashMap, + animation::{AnimationClip, EntityPath, Keyframes, VariableCurve}, app::Plugin, asset::{Asset, AssetApp, AssetLoader, AsyncReadExt, ReadAssetBytesError}, core::Name, log::info, math::{Quat, Vec3}, reflect::Reflect, transform::components::Transform, utils::hashbrown::HashMap }; +use itertools::Itertools; use serde::{Deserialize, Serialize}; #[derive( @@ -210,34 +205,112 @@ impl CSVAnimation { fn generate_clip( self, name: &str, - mapping: Option<&[(impl ToString, impl ToString)]>, + mapping: Option<&CSVAnimationMapping>, ) -> AnimationClip { let path = EntityPath { parts: vec![Name::new(name.to_owned())], }; let mut clip = AnimationClip::default(); - clip.add_curve_to_path(path, self.generate_animation_curve(mapping)); - clip - } - - fn generate_animation_curve( - self, - mapping: Option<&[(impl ToString, impl ToString)]>, - ) -> VariableCurve { + let csv_morph_order: HashMap<&str, usize> = self .morph_names .iter() .enumerate() .map(|(i, val)| (val.as_str(), i)) .collect(); + + clip.add_curve_to_path(path, self.generate_morph_curve(mapping, &csv_morph_order)); + + if let Some(mapping) = mapping { + self.generate_bone_curves(&mut clip, mapping, &csv_morph_order); + } + + clip + } + + fn generate_bone_curves(&self, clip: &mut AnimationClip, mapping: &CSVAnimationMapping, csv_morph_order: &HashMap<&str, usize>) { + let bones = mapping.0.iter().filter_map(|(k, v)| { + match k { + MappingType::Morph(_) => None, + MappingType::Bone(mapping) => Some((mapping.path.clone(), (mapping.clone(), v.clone()))), + } + }).group_by(|(key, _)| key.clone()); + + for (bone, mappings) in bones.into_iter() { + let curve = self.generate_bone_curve(mappings.map(|(_, v)| v), csv_morph_order); + let path = EntityPath { + parts: bone.into_iter().map(Name::new).collect() + }; + clip.add_curve_to_path(path, curve); + } + } + + fn generate_bone_curve(&self, mappings: impl Iterator, csv_morph_order: &HashMap<&str, usize>) -> VariableCurve { + let mut keyframe_timestamps = Vec::with_capacity(self.frames.len()); + let mut keyframes = Vec::with_capacity(self.frames.len()); + let mappings = mappings.collect::>(); + + let seconds_per_frame = 1.0 / self.fps; + for (frame, data) in self.frames.iter().enumerate() { + let time = (frame as f32) * seconds_per_frame; + keyframe_timestamps.push(time); + + let mut transform = Transform::from_rotation(Quat::from_euler(bevy::math::EulerRot::XYZ, 0., 0., 0.)); + + + println!("TIME: {time}"); + for (mapping, csv_key) in mappings.iter() { + let result = csv_morph_order + .get(csv_key.as_str()) + .copied() + .and_then(|i| data.morphs.get(i)) + .copied() + .unwrap_or(0f32); + println!("Mapping {csv_key} - {mapping:?} -> {result}"); + + let axis = match mapping.axis { + Axis::X => Vec3::X, + Axis::Y => Vec3::Y, + Axis::Z => Vec3::Z, + Axis::Vec(v) => v, + }; + let offset = mapping.offset.unwrap_or(0f32).to_radians(); + + let result = result * 180f32.to_radians() + offset; + + println!("Rotating {axis:?} by {result:?}"); + println!("From {}", transform.rotation.xyz()); + transform.rotate_axis(axis, result); + println!("To {}", transform.rotation.xyz()); + } + + + keyframes.push(transform.rotation) + } + + VariableCurve { + keyframe_timestamps, + keyframes: Keyframes::Rotation(keyframes), + } + } + + fn generate_morph_curve( + &self, + mapping: Option<&CSVAnimationMapping>, + csv_morph_order: &HashMap<&str, usize> + ) -> VariableCurve { let (num_mesh_morphs, mesh_to_csv_morph_order) = match mapping { Some(mapping) => { - let num_mesh_morphs: usize = mapping.len(); let mesh_to_csv_morph_order: Vec> = mapping + .0 .iter() - .map(|(_, v)| csv_morph_order.get(v.to_string().as_str()).copied()) + .filter_map(|(mapping, v)| match mapping { + MappingType::Morph(_) => Some(csv_morph_order.get(v.to_string().as_str()).copied()), + _ => None + }) .collect(); + let num_mesh_morphs: usize = mesh_to_csv_morph_order.len(); (num_mesh_morphs, mesh_to_csv_morph_order) } None => ( @@ -282,7 +355,30 @@ struct ClipInfo { } #[derive(Serialize, Deserialize, Debug, Clone)] -struct CSVAnimationMapping(Vec<(String, String)>); +struct CSVAnimationMapping(Vec<(MappingType, String)>); + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(untagged)] +pub enum MappingType { + Morph(String), + Bone(BoneMapping) +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BoneMapping { + path: Vec, + axis: Axis, + offset: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum Axis { + X, + Y, + Z, + #[serde(untagged)] + Vec(Vec3) +} #[derive(Default)] pub struct CSVAnimationLoader; @@ -354,12 +450,12 @@ impl AssetLoader for CSVAnimationLoader { .map_err(CSVAnimationLoaderError::MappingReadBytesError)?; let mapping: CSVAnimationMapping = serde_json::from_slice(&mapping) .map_err(CSVAnimationLoaderError::MappingParseError)?; - Some(mapping.0) + Some(mapping) } else { None }; - Ok(csv_animation.generate_clip(&clip_info.root_name, mapping.as_deref())) + Ok(csv_animation.generate_clip(&clip_info.root_name, mapping.as_ref())) }) } @@ -382,10 +478,10 @@ mod tests { use bevy::{ animation::{AnimationClip, EntityPath, Keyframes}, - core::Name, + core::Name, math::Vec3, }; - use crate::{CSVAnimation, CSVParseError, Timestamp, TimestampParseError}; + use crate::{CSVAnimation, CSVAnimationMapping, CSVParseError, Timestamp, TimestampParseError}; #[test] fn given_an_empty_timestamp_it_returns_an_empty_timestamp_error() { let timestamp = "" @@ -526,7 +622,7 @@ mod tests { .unwrap(); let clip: AnimationClip = - animation.generate_clip("my_node", Option::<&[(&str, &str)]>::None); + animation.generate_clip("my_node", None); assert!(clip.duration() - 1.33333 < 0.1); @@ -571,11 +667,9 @@ mod tests { ) .unwrap(); - let mapping = vec![ - ("shape_2", "shape_2"), - ("shape_1", "shape_1"), - ("shape_extra", "shape_extra"), - ]; + let mapping = CSVAnimationMapping([("\"shape_2\"", "shape_2"), + ("\"shape_1\"", "shape_1"), + ("\"shape_extra\"", "shape_extra")].iter().map(|(key, value)| (serde_json::from_str(key).unwrap(), value.to_string())).collect()); let clip: AnimationClip = animation.generate_clip("my_node", Some(&mapping)); @@ -609,4 +703,78 @@ mod tests { assert!((keyframes[3] + 0.4).abs() < 0.0001); assert!((keyframes[5] - 0.0).abs() < 0.0001); } + + #[test] + fn can_convert_an_animation_into_an_animation_clip_with_bone_mapping() { + let animation = CSVAnimation::parse( + "timecode, blendshapecount, shape_1, shape_2, bone_x +00:00:00:00.00, 0, 0, 1.0, 0 +00:00:00:01.00, 0, -0.5, -0.4, 0.5 +00:00:00:02.00, 0, 0, 0, 0.4 +00:00:01:00.00, 0, 0, 0, 1 +00:00:01:01.00, 0, 0, 0, -2", + ) + .unwrap(); + + let mapping: CSVAnimationMapping = CSVAnimationMapping([("\"shape_2\"", "shape_2"), + ("{ \"path\": [\"bone\"], \"axis\": [0, 0, 1] }", "shape_1"), + ("{ \"path\": [\"bone\"], \"axis\": \"X\" }", "bone_x")].iter().map(|(key, value)| { + println!("Attempting to convert {key}"); + (serde_json::from_str(key).unwrap(), value.to_string()) + }).collect()); + + + let clip: AnimationClip = animation.generate_clip("my_node", Some(&mapping)); + + assert!(clip.duration() - 1.33333 < 0.1); + + let curves = clip + .get_curves_by_path(&EntityPath { + parts: vec![Name::new("my_node")], + }) + .unwrap() + .first() + .unwrap(); + assert_eq!(curves.keyframe_timestamps.len(), 5); + + assert!((curves.keyframe_timestamps[0] - 0.0).abs() < 0.001); + assert!((curves.keyframe_timestamps[1] - 0.33333).abs() < 0.001); + assert!((curves.keyframe_timestamps[2] - 0.66666).abs() < 0.01); + assert!((curves.keyframe_timestamps[3] - 1.0).abs() < 0.01); + assert!((curves.keyframe_timestamps[4] - 1.33333).abs() < 0.01); + + let Keyframes::Weights(keyframes) = &curves.keyframes else { + panic!("Keyframes aren't weights") + }; + + assert_eq!(keyframes.len(), 5); + + assert!((keyframes[0] - 1.0).abs() < 0.0001); + assert!((keyframes[1] + 0.4).abs() < 0.0001); + + let curves = clip + .get_curves_by_path(&EntityPath { + parts: vec![ Name::new("bone")], + }) + .unwrap() + .first() + .unwrap(); + assert_eq!(curves.keyframe_timestamps.len(), 5); + + assert!((curves.keyframe_timestamps[0] - 0.0).abs() < 0.001); + assert!((curves.keyframe_timestamps[1] - 0.33333).abs() < 0.001); + assert!((curves.keyframe_timestamps[2] - 0.66666).abs() < 0.01); + assert!((curves.keyframe_timestamps[3] - 1.0).abs() < 0.01); + assert!((curves.keyframe_timestamps[4] - 1.33333).abs() < 0.01); + + let Keyframes::Rotation(keyframes) = &curves.keyframes else { + panic!("Keyframes aren't rotations") + }; + + assert_eq!(keyframes.len(), 5); + + println!("Rotations: {:?}", keyframes.iter().map(|v| v.xyz()).collect::>()); + assert!((keyframes[0].xyz() - Vec3::new(0., 0., 0.)).length() < 0.0001); + assert!((keyframes[1].xyz() - Vec3::new(0.5, 0.5, -0.5)).length() < 0.01); + } }