From 008bc8799e49ee17f06b01ecf585fc5d2ed44c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 22 Mar 2022 02:26:34 +0000 Subject: [PATCH] Gltf animations (#3751) # Objective - Load informations for animations from GLTF - Make experimenting on animations easier # Non Objective - Implement a solutions for all animations in Bevy. This would need a discussion / RFC. The goal here is only to have the information available to try different APIs ## Solution - Load animations with a representation close to the GLTF spec - Add an example to display animations. There is an animation driver in the example, not in Bevy code, to show how it can be used. The example is cycling between examples from the official gltf sample ([AnimatedTriangle](https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AnimatedTriangle), [BoxAnimated](https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/BoxAnimated)), and one from me with some cases not present in the official examples. https://user-images.githubusercontent.com/8672791/150696656-073403f0-d921-43b6-beaf-099c7aee16ed.mp4 Co-authored-by: Carter Anderson --- CREDITS.md | 2 + Cargo.toml | 4 + assets/models/animated/AnimatedTriangle.gltf | 118 ++++ assets/models/animated/BoxAnimated.gltf | 327 ++++++++++ assets/models/animated/animations.gltf | 592 +++++++++++++++++++ crates/bevy_gltf/src/lib.rs | 59 +- crates/bevy_gltf/src/loader.rs | 95 ++- examples/3d/manual_gltf_animation_player.rs | 230 +++++++ examples/README.md | 1 + 9 files changed, 1422 insertions(+), 6 deletions(-) create mode 100644 assets/models/animated/AnimatedTriangle.gltf create mode 100644 assets/models/animated/BoxAnimated.gltf create mode 100644 assets/models/animated/animations.gltf create mode 100644 examples/3d/manual_gltf_animation_player.rs diff --git a/CREDITS.md b/CREDITS.md index da6c38d6a8ba1b..3261c2c534371c 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -21,3 +21,5 @@ * Ground tile from [Kenney's Tower Defense Kit](https://www.kenney.nl/assets/tower-defense-kit) (CC0 1.0 Universal) * Game icons from [Kenney's Game Icons](https://www.kenney.nl/assets/game-icons) (CC0 1.0 Universal) * Space ships from [Kenny's Simple Space Kit](https://www.kenney.nl/assets/simple-space) (CC0 1.0 Universal) +* glTF animated triangle from [glTF Sample Models](https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AnimatedTriangle) (CC0 1.0 Universal) +* glTF box animated from [glTF Sample Models](https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/BoxAnimated) ([CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) - by [Cesium](https://cesium.com)) diff --git a/Cargo.toml b/Cargo.toml index c082d3b985a043..6577c9317ea953 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -183,6 +183,10 @@ path = "examples/3d/lighting.rs" name = "load_gltf" path = "examples/3d/load_gltf.rs" +[[example]] +name = "manual_gltf_animation_player" +path = "examples/3d/manual_gltf_animation_player.rs" + [[example]] name = "many_cubes" path = "examples/3d/many_cubes.rs" diff --git a/assets/models/animated/AnimatedTriangle.gltf b/assets/models/animated/AnimatedTriangle.gltf new file mode 100644 index 00000000000000..d5c095492122b4 --- /dev/null +++ b/assets/models/animated/AnimatedTriangle.gltf @@ -0,0 +1,118 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0 ] + } + ], + + "nodes" : [ + { + "mesh" : 0, + "rotation" : [ 0.0, 0.0, 0.0, 1.0 ] + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 1 + }, + "indices" : 0 + } ] + } + ], + + "animations": [ + { + "samplers" : [ + { + "input" : 2, + "interpolation" : "LINEAR", + "output" : 3 + } + ], + "channels" : [ { + "sampler" : 0, + "target" : { + "node" : 0, + "path" : "rotation" + } + } ] + } + ], + + "buffers" : [ + { + "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", + "byteLength" : 44 + }, + { + "uri" : "data:application/octet-stream;base64,AAAAAAAAgD4AAAA/AABAPwAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAD0/TQ/9P00PwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAPT9ND/0/TS/AAAAAAAAAAAAAAAAAACAPw==", + "byteLength" : 100 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 6, + "target" : 34963 + }, + { + "buffer" : 0, + "byteOffset" : 8, + "byteLength" : 36, + "target" : 34962 + }, + { + "buffer" : 1, + "byteOffset" : 0, + "byteLength" : 100 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 3, + "type" : "SCALAR", + "max" : [ 2 ], + "min" : [ 0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + }, + { + "bufferView" : 2, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 5, + "type" : "SCALAR", + "max" : [ 1.0 ], + "min" : [ 0.0 ] + }, + { + "bufferView" : 2, + "byteOffset" : 20, + "componentType" : 5126, + "count" : 5, + "type" : "VEC4", + "max" : [ 0.0, 0.0, 1.0, 1.0 ], + "min" : [ 0.0, 0.0, 0.0, -0.707 ] + } + ], + + "asset" : { + "version" : "2.0" + } + +} \ No newline at end of file diff --git a/assets/models/animated/BoxAnimated.gltf b/assets/models/animated/BoxAnimated.gltf new file mode 100644 index 00000000000000..59a7c0c38f3b28 --- /dev/null +++ b/assets/models/animated/BoxAnimated.gltf @@ -0,0 +1,327 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 3, + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "rotation": [ + -0.0, + -0.0, + -0.0, + -1.0 + ] + }, + { + "children": [ + 2 + ] + }, + { + "mesh": 0, + "rotation": [ + -0.0, + -0.0, + -0.0, + -1.0 + ] + }, + { + "mesh": 1 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "inner_box" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 4, + "POSITION": 5 + }, + "indices": 3, + "mode": 4, + "material": 1 + } + ], + "name": "outer_box" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 2, + "path": "rotation" + } + }, + { + "sampler": 1, + "target": { + "node": 0, + "path": "translation" + } + } + ], + "samplers": [ + { + "input": 6, + "interpolation": "LINEAR", + "output": 7 + }, + { + "input": 8, + "interpolation": "LINEAR", + "output": 9 + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 186, + "max": [ + 95 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1152, + "componentType": 5126, + "count": 96, + "max": [ + 0.33504000306129458, + 0.5, + 0.33504000306129458 + ], + "min": [ + -0.33504000306129458, + -0.5, + -0.33504000306129458 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 372, + "componentType": 5123, + "count": 576, + "max": [ + 223 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 2304, + "componentType": 5126, + "count": 224, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 4992, + "componentType": 5126, + "count": 224, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5126, + "count": 2, + "max": [ + 2.5 + ], + "min": [ + 1.25 + ], + "type": "SCALAR" + }, + { + "bufferView": 3, + "byteOffset": 0, + "componentType": 5126, + "count": 2, + "max": [ + 1.0, + 0.0, + 0.0, + 4.4896593387466768e-11 + ], + "min": [ + -0.0, + 0.0, + 0.0, + -1.0 + ], + "type": "VEC4" + }, + { + "bufferView": 2, + "byteOffset": 8, + "componentType": 5126, + "count": 4, + "max": [ + 3.708329916000366 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 4, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 2.5199999809265138, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.4159420132637024, + 0.7952920198440552, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "inner" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.3016040027141571, + 0.5335419774055481, + 0.800000011920929, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "outer" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 7784, + "byteLength": 1524, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 80, + "byteLength": 7680, + "byteStride": 12, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 7760, + "byteLength": 24 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 32 + }, + { + "buffer": 0, + "byteOffset": 32, + "byteLength": 48 + } + ], + "buffers": [ + { + "byteLength": 9308, + "uri": "data:application/octet-stream;base64,AAAAgAAAAIAAAACAAACAvwAAgD8AAAAAAAAAABJ1RS4AAAAAAAAAAAAAAAAAAAAArkchQAAAAAAAAAAArkchQAAAAAAAAAAAAAAAAAAAAAAAAAAA9wQ1v/cENT8AAAAA9wQ1v/cENT8AAAAA9wQ1v/cENT8AAAAA9wQ1v/cENT/3BDW/AAAAgPcENb/3BDW/AAAAgPcENb/3BDW/AAAAgPcENb/3BDW/AAAAgPcENb/3BDU/9wQ1vwAAAAD3BDU/9wQ1vwAAAAD3BDU/9wQ1vwAAAAD3BDU/9wQ1vwAAAAD3BDW/9wQ1vwAAAID3BDW/9wQ1vwAAAID3BDW/9wQ1vwAAAID3BDW/9wQ1vwAAAIAAAACA9wQ1v/cENb8AAACA9wQ1v/cENb8AAACA9wQ1v/cENb8AAACA9wQ1v/cENb8AAACA9wQ1P/cENT8AAACA9wQ1P/cENT8AAACA9wQ1P/cENT8AAACA9wQ1P/cENT/3BDU/9wQ1PwAAAAD3BDU/9wQ1PwAAAAD3BDU/9wQ1PwAAAAD3BDU/9wQ1PwAAAAD3BDW/9wQ1PwAAAAD3BDW/9wQ1PwAAAAD3BDW/9wQ1PwAAAAD3BDW/9wQ1PwAAAAD3BDW/AAAAAPcENT/3BDW/AAAAAPcENT/3BDW/AAAAAPcENT/3BDW/AAAAAPcENT8AAAAA9wQ1P/cENb8AAAAA9wQ1P/cENb8AAAAA9wQ1P/cENb8AAAAA9wQ1P/cENb/3BDU/AAAAAPcENT/3BDU/AAAAAPcENT/3BDU/AAAAAPcENT/3BDU/AAAAAPcENT/3BDU/AAAAAPcENb/3BDU/AAAAAPcENb/3BDU/AAAAAPcENb/3BDU/AAAAAPcENb82zRO/Ns0TvzbNE782zRO/Ns0TvzbNE782zRO/Ns0TvzbNE782zRM/Ns0TvzbNE782zRM/Ns0TvzbNE782zRM/Ns0TvzbNE782zRM/Ns0TvzbNEz82zRM/Ns0TvzbNEz82zRM/Ns0TvzbNEz82zRO/Ns0TvzbNEz82zRO/Ns0TvzbNEz82zRO/Ns0TvzbNEz82zRO/Ns0TPzbNE782zRO/Ns0TPzbNE782zRO/Ns0TPzbNE782zRM/Ns0TPzbNE782zRM/Ns0TPzbNE782zRM/Ns0TPzbNE782zRM/Ns0TPzbNEz82zRM/Ns0TPzbNEz82zRM/Ns0TPzbNEz82zRO/Ns0TPzbNEz82zRO/Ns0TPzbNEz82zRO/Ns0TPzbNEz8AAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAIA/AAAAgAAAAAAAAIA/AAAAgAAAAAAAAIA/AAAAgAAAAAAAAIA/AAAAgAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAmAaq+AAAAvyYBqj4mAao+AAAAvyYBqj4mAao+yXb+vl2Kqz4mAaq+yXb+vl2Kqz4mAaq+yXb+Pl2Kq74mAaq+yXb+vl2Kq75diqu+yXb+viYBqr5diqu+yXb+PiYBqr4mAao+AAAAvyYBqj4mAao+AAAAvyYBqr5diqs+yXb+viYBqr5diqs+yXb+viYBqj5diqu+yXb+viYBqj5diqu+yXb+viYBqr4mAaq+AAAAvyYBqr4mAaq+AAAAvyYBqj4mAao+AAAAvyYBqr4mAaq+AAAAvyYBqr4mAaq+yXb+vl2Kq74mAao+yXb+vl2Kq74mAaq+yXb+Pl2Kqz4mAao+yXb+Pl2Kqz4mAao+AAAAPyYBqj4mAaq+AAAAPyYBqj5diqs+yXb+PiYBqj5diqs+yXb+PiYBqr4mAao+AAAAPyYBqr4mAao+AAAAPyYBqj4mAaq+AAAAPyYBqj4mAaq+AAAAPyYBqr5diqu+yXb+PiYBqr5diqu+yXb+PiYBqj5diqu+yXb+PiYBqj5diqu+yXb+viYBqj4mAaq+yXb+vl2Kqz4mAaq+yXb+Pl2Kqz4mAao+yXb+Pl2Kq74mAaq+yXb+Pl2Kq74mAaq+AAAAPyYBqr4mAao+AAAAPyYBqr4mAao+yXb+Pl2Kqz4mAao+yXb+vl2Kqz5diqs+yXb+viYBqj5diqs+yXb+PiYBqj5diqs+yXb+PiYBqr5diqs+yXb+viYBqr4mAao+yXb+vl2Kq74mAao+yXb+Pl2Kq74mAaq+yXb+vl2Kq74mAaq+AAAAvyYBqr5diqu+yXb+viYBqr5diqs+yXb+viYBqr4mAao+AAAAvyYBqr4mAao+yXb+vl2Kq74mAao+yXb+vl2Kqz4mAao+AAAAvyYBqj5diqs+yXb+viYBqj4mAaq+AAAAvyYBqj4mAaq+yXb+vl2Kqz5diqu+yXb+viYBqj4mAaq+AAAAPyYBqr4mAaq+yXb+Pl2Kq75diqu+yXb+PiYBqr4mAao+AAAAPyYBqr5diqs+yXb+PiYBqr4mAao+yXb+Pl2Kq74mAao+AAAAPyYBqj4mAao+yXb+Pl2Kqz5diqs+yXb+PiYBqj5diqu+yXb+PiYBqj4mAaq+yXb+Pl2Kqz4mAaq+AAAAPyYBqj5diqu+yXb+viYBqr5diqu+yXb+viYBqj5diqu+yXb+PiYBqj5diqu+yXb+PiYBqr4mAao+yXb+vl2Kq74mAaq+yXb+vl2Kq74mAaq+yXb+Pl2Kq74mAao+yXb+Pl2Kq75diqs+yXb+viYBqj5diqs+yXb+viYBqr5diqs+yXb+PiYBqr5diqs+yXb+PiYBqj4mAaq+yXb+vl2Kqz4mAao+yXb+vl2Kqz4mAao+yXb+Pl2Kqz4mAaq+yXb+Pl2Kqz4mAaq+AAAAPyYBqr4mAaq+AAAAPyYBqj4mAao+AAAAPyYBqj4mAao+AAAAPyYBqr4mAao+AAAAvyYBqr4mAao+AAAAvyYBqj4mAaq+AAAAvyYBqj4mAaq+AAAAvyYBqr4AAAAAu7gtv7cIPL8AAAAAu7gtv7cIPL8AAAAAu7gtv7cIPL8AAAAAu7gtv7cIPL8AAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAID3BDU/AAAAAPcENT/3BDU/AAAAAPcENT/3BDU/AAAAAPcENT/3BDU/AAAAAPcENT+3CDy/u7gtvwAAAIC3CDy/u7gtvwAAAIC3CDy/u7gtvwAAAIC3CDy/u7gtvwAAAIC3CDw/u7gtvwAAAAC3CDw/u7gtvwAAAAC3CDw/u7gtvwAAAAC3CDw/u7gtvwAAAAAAAAAAaM0Tv9EFUT8AAAAAaM0Tv9EFUT8AAAAAaM0Tv9EFUT8AAAAAaM0Tv9EFUT8AAAAAu7gtv7cIPD8AAAAAu7gtv7cIPD8AAAAAu7gtv7cIPD8AAAAAu7gtv7cIPD8AAAAAu7gtP7cIPL8AAAAAu7gtP7cIPL8AAAAAu7gtP7cIPL8AAAAAu7gtP7cIPL/RBVG/aM0TvwAAAIDRBVG/aM0TvwAAAIDRBVG/aM0TvwAAAIDRBVG/aM0TvwAAAIDRBVE/aM0TvwAAAADRBVE/aM0TvwAAAADRBVE/aM0TvwAAAADRBVE/aM0TvwAAAAAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIC3CDy/u7gtPwAAAAC3CDy/u7gtPwAAAAC3CDy/u7gtPwAAAAC3CDy/u7gtPwAAAAC3CDw/u7gtPwAAAAC3CDw/u7gtPwAAAAC3CDw/u7gtPwAAAAC3CDw/u7gtPwAAAAAAAAAAaM0Tv9EFUb8AAAAAaM0Tv9EFUb8AAAAAaM0Tv9EFUb8AAAAAaM0Tv9EFUb/3BDU/AAAAAPcENb/3BDU/AAAAAPcENb/3BDU/AAAAAPcENb/3BDU/AAAAAPcENb8AAAAAaM0TP9EFUT8AAAAAaM0TP9EFUT8AAAAAaM0TP9EFUT8AAAAAaM0TP9EFUT8AAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAACAu7gtP7cIPD8AAACAu7gtP7cIPD8AAACAu7gtP7cIPD8AAACAu7gtP7cIPD/3BDW/AAAAAPcENb/3BDW/AAAAAPcENb/3BDW/AAAAAPcENb/3BDW/AAAAAPcENb/RBVE/aM0TPwAAAIDRBVE/aM0TPwAAAIDRBVE/aM0TPwAAAIDRBVE/aM0TPwAAAIDRBVG/aM0TPwAAAADRBVG/aM0TPwAAAADRBVG/aM0TPwAAAADRBVG/aM0TPwAAAAAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAIAAAAAAAACAvwAAAID3BDW/AAAAAPcENT/3BDW/AAAAAPcENT/3BDW/AAAAAPcENT/3BDW/AAAAAPcENT8AAAAAaM0TP9EFUb8AAAAAaM0TP9EFUb8AAAAAaM0TP9EFUb8AAAAAaM0TP9EFUb+9//++GAU1v73//769//++GAU1v73//769//++GAU1v73//769//++GAU1v73//769//8+GAU1v73//769//8+GAU1v73//769//8+GAU1v73//769//8+GAU1v73//769//8+GAU1v73//z69//8+GAU1v73//z69//8+GAU1v73//z69//8+GAU1v73//z69//++GAU1v73//z69//++GAU1v73//z69//++GAU1v73//z69//++GAU1v73//z69//++GAU1P73//769//++GAU1P73//769//++GAU1P73//769//++GAU1P73//769//8+GAU1P73//769//8+GAU1P73//769//8+GAU1P73//769//8+GAU1P73//769//8+GAU1P73//z69//8+GAU1P73//z69//8+GAU1P73//z69//8+GAU1P73//z69//++GAU1P73//z69//++GAU1P73//z69//++GAU1P73//z69//++GAU1P73//z4/xvQ+lZ88vz/G9D4/xvQ+lZ88vz/G9D4/xvQ+lZ88vz/G9D4/xvQ+lZ88vz/G9D4/xvS+lZ88vz/G9D4/xvS+lZ88vz/G9D4/xvS+lZ88vz/G9D4/xvS+lZ88vz/G9D4/xvS+lZ88vz/G9L4/xvS+lZ88vz/G9L4/xvS+lZ88vz/G9L4/xvS+lZ88vz/G9L4/xvQ+lZ88vz/G9L4/xvQ+lZ88vz/G9L4/xvQ+lZ88vz/G9L4/xvQ+lZ88vz/G9L4/xvQ+lZ88Pz/G9D4/xvQ+lZ88Pz/G9D4/xvQ+lZ88Pz/G9D4/xvQ+lZ88Pz/G9D4/xvS+lZ88Pz/G9D4/xvS+lZ88Pz/G9D4/xvS+lZ88Pz/G9D4/xvS+lZ88Pz/G9D4/xvS+lZ88Pz/G9L4/xvS+lZ88Pz/G9L4/xvS+lZ88Pz/G9L4/xvS+lZ88Pz/G9L4/xvQ+lZ88Pz/G9L4/xvQ+lZ88Pz/G9L4/xvQ+lZ88Pz/G9L4/xvQ+lZ88Pz/G9L4AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAACAAAAAgAAAgL8AAACAAAAAgAAAgL8AAACAAAAAgAAAgL8AAACAAAAAgAAAgL8AAAAA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UABUAFUAVgBVAFYAVwBWAFcAVABYAFkAWgBZAFoAWwBaAFsAWABcAF0AXgBdAF4AXwBeAF8AXAAAAAEAAgABAAIAAwACAAMAAAAEAAUABgAFAAYABwAGAAcABAAIAAkACgAJAAoACwAKAAsACAAMAA0ADgANAA4ADwAOAA8ADAAQABEAEgARABIAEwASABMAEAAUABUAFgAVABYAFwAWABcAFAAYABkAGgAZABoAGwAaABsAGAAcAB0AHgAdAB4AHwAeAB8AHAAgACEAIgAhACIAIwAiACMAIAAkACUAJgAlACYAJwAmACcAJAAoACkAKgApACoAKwAqACsAKAAsAC0ALgAtAC4ALwAuAC8ALAAwADEAMgAxADIAMwAyADMAMAA0ADUANgA1ADYANwA2ADcANAA4ADkAOgA5ADoAOwA6ADsAOAA8AD0APgA9AD4APwA+AD8APABAAEEAQgBBAEIAQwBCAEMAQABEAEUARgBFAEYARwBGAEcARABIAEkASgBJAEoASwBKAEsASABMAE0ATgBNAE4ATwBOAE8ATABQAFEAUgBRAFIAUwBSAFMAUABUAFUAVgBVAFYAVwBWAFcAVABYAFkAWgBZAFoAWwBaAFsAWABcAF0AXgBdAF4AXwBeAF8AXABgAGEAYgBhAGIAYwBiAGMAYABkAGUAZgBlAGYAZwBmAGcAZABoAGkAagBpAGoAawBqAGsAaABsAG0AbgBtAG4AbwBuAG8AbABwAHEAcgBxAHIAcwByAHMAcAB0AHUAdgB1AHYAdwB2AHcAdAB4AHkAegB5AHoAewB6AHsAeAB8AH0AfgB9AH4AfwB+AH8AfACAAIEAggCBAIIAgwCCAIMAgACEAIUAhgCFAIYAhwCGAIcAhACIAIkAigCJAIoAiwCKAIsAiACMAI0AjgCNAI4AjwCOAI8AjACQAJEAkgCRAJIAkwCSAJMAkACUAJUAlgCVAJYAlwCWAJcAlACYAJkAmgCZAJoAmwCaAJsAmACcAJ0AngCdAJ4AnwCeAJ8AnAApACgAQwAoAEMAQgBDAEIAKQAFAAQAKwAEACsAKgArACoABQBVAFQABwBUAAcABgAHAAYAVQBBAEAAVwBAAFcAVgBXAFYAQQCgAKEAogChAKIAowCiAKMAoACkAKUApgClAKYApwCmAKcApACoAKkAqgCpAKoAqwCqAKsAqACsAK0ArgCtAK4ArwCuAK8ArACwALEAsgCxALIAswCyALMAsAC0ALUAtgC1ALYAtwC2ALcAtAC4ALAAswCwALMAuQCzALkAuAC6ALQAtwC0ALcAuwC3ALsAugC8ALgAuQC4ALkAvQC5AL0AvACxALoAuwC6ALsAsgC7ALIAsQC+ALwAvQC8AL0AvwC9AL8AvgC1AL4AvwC+AL8AtgC/ALYAtQDAAMEAwgDBAMIAwwDCAMMAwADEAMUAxgDFAMYAxwDGAMcAxADIAMkAygDJAMoAywDKAMsAyADMAM0AzgDNAM4AzwDOAM8AzADQANEA0gDRANIA0wDSANMA0ADUANUA1gDVANYA1wDWANcA1ADYANkA2gDZANoA2wDaANsA2ADcAN0A3gDdAN4A3wDeAN8A3AA=" + } + ] +} \ No newline at end of file diff --git a/assets/models/animated/animations.gltf b/assets/models/animated/animations.gltf new file mode 100644 index 00000000000000..b3f1955c4e8f05 --- /dev/null +++ b/assets/models/animated/animations.gltf @@ -0,0 +1,592 @@ +{ + "asset": { + "generator": "Khronos glTF Blender I/O v1.7.33", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "name": "Scene", + "nodes": [ + 0, + 1, + 2, + 3 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "name": "Translated" + }, + { + "mesh": 1, + "name": "Rotated", + "translation": [ + 0, + 0, + -3 + ] + }, + { + "mesh": 2, + "name": "Scaled", + "translation": [ + 0, + 0, + -6 + ] + }, + { + "mesh": 3, + "name": "All", + "translation": [ + -3, + 0, + 0 + ] + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "translation" + } + }, + { + "sampler": 1, + "target": { + "node": 1, + "path": "rotation" + } + }, + { + "sampler": 2, + "target": { + "node": 2, + "path": "scale" + } + }, + { + "sampler": 3, + "target": { + "node": 3, + "path": "translation" + } + }, + { + "sampler": 4, + "target": { + "node": 3, + "path": "rotation" + } + }, + { + "sampler": 5, + "target": { + "node": 3, + "path": "scale" + } + } + ], + "name": "MoveThemAll", + "samplers": [ + { + "input": 13, + "interpolation": "LINEAR", + "output": 14 + }, + { + "input": 13, + "interpolation": "LINEAR", + "output": 19 + }, + { + "input": 13, + "interpolation": "LINEAR", + "output": 23 + }, + { + "input": 13, + "interpolation": "LINEAR", + "output": 24 + }, + { + "input": 13, + "interpolation": "LINEAR", + "output": 25 + }, + { + "input": 13, + "interpolation": "LINEAR", + "output": 26 + } + ] + } + ], + "materials": [ + { + "doubleSided": true, + "name": "Material.002", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8000000715255737, + 0.03291596472263336, + 0.03291596472263336, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Material.003", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.04164114594459534, + 0.8000000715255737, + 0.03504977375268936, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Material.004", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.028427375480532646, + 0.025394577533006668, + 0.8000000715255737, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 0.5 + } + } + ], + "meshes": [ + { + "name": "Cube.002", + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0 + } + ] + }, + { + "name": "Cube.003", + "primitives": [ + { + "attributes": { + "POSITION": 4, + "NORMAL": 5, + "TEXCOORD_0": 6 + }, + "indices": 3, + "material": 1 + } + ] + }, + { + "name": "Cube.004", + "primitives": [ + { + "attributes": { + "POSITION": 7, + "NORMAL": 8, + "TEXCOORD_0": 9 + }, + "indices": 3, + "material": 2 + } + ] + }, + { + "name": "Cube.005", + "primitives": [ + { + "attributes": { + "POSITION": 10, + "NORMAL": 11, + "TEXCOORD_0": 12 + }, + "indices": 3 + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 24, + "type": "VEC2" + }, + { + "bufferView": 3, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 24, + "type": "VEC2" + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "bufferView": 9, + "componentType": 5126, + "count": 24, + "type": "VEC2" + }, + { + "bufferView": 10, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + { + "bufferView": 11, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "bufferView": 12, + "componentType": 5126, + "count": 24, + "type": "VEC2" + }, + { + "bufferView": 13, + "componentType": 5126, + "count": 501, + "max": [ + 20.833333333333332 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 14, + "componentType": 5126, + "count": 501, + "type": "VEC3" + }, + { + "bufferView": 15, + "componentType": 5126, + "count": 2, + "max": [ + 20.833333333333332 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 16, + "componentType": 5126, + "count": 2, + "type": "VEC4" + }, + { + "bufferView": 17, + "componentType": 5126, + "count": 2, + "type": "VEC3" + }, + { + "bufferView": 18, + "componentType": 5126, + "count": 2, + "type": "VEC3" + }, + { + "bufferView": 19, + "componentType": 5126, + "count": 501, + "type": "VEC4" + }, + { + "bufferView": 20, + "componentType": 5126, + "count": 2, + "type": "VEC3" + }, + { + "bufferView": 21, + "componentType": 5126, + "count": 2, + "type": "VEC3" + }, + { + "bufferView": 22, + "componentType": 5126, + "count": 2, + "type": "VEC4" + }, + { + "bufferView": 23, + "componentType": 5126, + "count": 501, + "type": "VEC3" + }, + { + "bufferView": 24, + "componentType": 5126, + "count": 501, + "type": "VEC3" + }, + { + "bufferView": 25, + "componentType": 5126, + "count": 501, + "type": "VEC4" + }, + { + "bufferView": 26, + "componentType": 5126, + "count": 501, + "type": "VEC3" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 0 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 288 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 576 + }, + { + "buffer": 0, + "byteLength": 72, + "byteOffset": 768 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 840 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 1128 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 1416 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 1608 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 1896 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 2184 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 2376 + }, + { + "buffer": 0, + "byteLength": 288, + "byteOffset": 2664 + }, + { + "buffer": 0, + "byteLength": 192, + "byteOffset": 2952 + }, + { + "buffer": 0, + "byteLength": 2004, + "byteOffset": 3144 + }, + { + "buffer": 0, + "byteLength": 6012, + "byteOffset": 5148 + }, + { + "buffer": 0, + "byteLength": 8, + "byteOffset": 11160 + }, + { + "buffer": 0, + "byteLength": 32, + "byteOffset": 11168 + }, + { + "buffer": 0, + "byteLength": 24, + "byteOffset": 11200 + }, + { + "buffer": 0, + "byteLength": 24, + "byteOffset": 11224 + }, + { + "buffer": 0, + "byteLength": 8016, + "byteOffset": 11248 + }, + { + "buffer": 0, + "byteLength": 24, + "byteOffset": 19264 + }, + { + "buffer": 0, + "byteLength": 24, + "byteOffset": 19288 + }, + { + "buffer": 0, + "byteLength": 32, + "byteOffset": 19312 + }, + { + "buffer": 0, + "byteLength": 6012, + "byteOffset": 19344 + }, + { + "buffer": 0, + "byteLength": 6012, + "byteOffset": 25356 + }, + { + "buffer": 0, + "byteLength": 8016, + "byteOffset": 31368 + }, + { + "buffer": 0, + "byteLength": 6012, + "byteOffset": 39384 + } + ], + "buffers": [ + { + "byteLength": 45396, + "uri": "data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAAAACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/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AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAA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KouCPyqLgj8qi4I/ICeCPyAngj8gJ4I/wMqBP8DKgT/AyoE/PnaBPz52gT8+doE/zCmBP8wpgT/MKYE/nOWAP5zlgD+c5YA/3qmAP96pgD/eqYA/yHaAP8h2gD/IdoA/jEyAP4xMgD+MTIA/WiuAP1orgD9aK4A/ZhOAP2YTgD9mE4A/4gSAP+IEgD/iBIA/AACAPwAAgD8AAIA/AABAwAAAAAAAAACAAABAwAAAAAAsy5a4AABAwAAAAACil5a5AABAwAAAAACaMCm6AABAwAAAAACNMJa6AABAwAAAAABTW+q6AABAwAAAAACogii7AABAwAAAAACUDWW7AABAwAAAAABlYpW7AABAwAAAAABKz7y7AABAwAAAAACsyOi7AABAwAAAAADZpAy8AABAwAAAAADDJie8AABAwAAAAACq50O8AABAwAAAAAAk5WK8AABAwAAAAABjDoK8AABAwAAAAAAUxpO8AABAwAAAAABtmKa8AABAwAAAAAA4hLq8AABAwAAAAABGiM+8AABAwAAAAABdo+W8AABAwAAAAABI1Py8AABAwAAAAADqjAq9AABAwAAAAABlORe9AABAwAAAAAD6biS9AABAwAAAAAAPLTK9AABAwAAAAAAJc0C9AABAwAAAAABOQE+9AABAwAAAAABClF69AABAwAAAAABNbm69AABAwAAAAADRzX69AABAwAAAAAAb2Ye9AABAwAAAAABxjZC9AABAwAAAAACbg5m9AABAwAAAAABPu6K9AABAwAAAAAA8NKy9AABAwAAAAAAZ7rW9AABAwAAAAACT6L+9AABAwAAAAABgI8q9AABAwAAAAAA0ntS9AABAwAAAAADAWN+9AABAwAAAAAC5Uuq9AABAwAAAAADLi/W9AABAwAAAAADZgQC+AABAwAAAAAANXQa+AABAwAAAAABdVwy+AABAwAAAAACgcBK+AABAwAAAAACxqBi+AABAwAAAAABo/x6+AABAwAAAAAChdCW+AABAwAAAAAAyCCy+AABAwAAAAAD2uTK+AABAwAAAAADHiTm+AABAwAAAAAB8d0C+AABAwAAAAADzgke+AABAwAAAAAD/q06+AABAwAAAAAB/8lW+AABAwAAAAABKVl2+AABAwAAAAAA512S+AABAwAAAAAAkdWy+AABAwAAAAADoL3S+AABAwAAAAABcB3y+AABAwAAAAACu/YG+AABAwAAAAADdBYa+AABAwAAAAAAtHIq+AABAwAAAAACHQI6+AABAwAAAAADWcpK+AABAwAAAAAAMs5a+AABAwAAAAAASAZu+AABAwAAAAADUXJ++AABAwAAAAABExqO+AABAwAAAAABJPai+AABAwAAAAADTway+AABAwAAAAADIU7G+AABAwAAAAAAg87W+AABAwAAAAAC/n7q+AABAwAAAAACVWb++AABAwAAAAACMIMS+AABAwAAAAACV9Mi+AABAwAAAAACb1c2+AABAwAAAAACIw9K+AABAwAAAAABKvte+AABAwAAAAADQxdy+AABAwAAAAAAF2uG+AABAwAAAAADT+ua+AABAwAAAAAAtKOy+AABAwAAAAAD6YfG+AABAwAAAAAArqPa+AABAwAAAAACn+vu+AABAwAAAAACwrAC/AABAwAAAAAAgYgO/AABAwAAAAACbHQa/AABAwAAAAAAV3wi/AABAwAAAAACGpgu/AABAwAAAAADncw6/AABAwAAAAAApRxG/AABAwAAAAABFIBS/AABAwAAAAAAx/xa/AABAwAAAAADl4xm/AABAwAAAAABUzhy/AABAwAAAAAB3vh+/AABAwAAAAABEtCK/AABAwAAAAACwryW/AABAwAAAAACzsCi/AABAwAAAAABCtyu/AABAwAAAAABWwy6/AABAwAAAAADi1DG/AABAwAAAAADb6zS/AABAwAAAAAA9CDi/AABAwAAAAAD6KTu/AABAwAAAAAALUT6/AABAwAAAAABifUG/AABAwAAAAAD6rkS/AABAwAAAAADI5Ue/AABAwAAAAADDIUu/AABAwAAAAADdYk6/AABAwAAAAAASqVG/AABAwAAAAABV9FS/AABAwAAAAACcRFi/AABAwAAAAADhmVu/AABAwAAAAAAX9F6/AABAwAAAAAA3U2K/AABAwAAAAAAyt2W/AABAwAAAAAAGIGm/AABAwAAAAACijWy/AABAwAAAAAAAAHC/AABAwAAAAAAXd3O/AABAwAAAAADc8na/AABAwAAAAABIc3q/AABAwAAAAABM+H2/AABAwAAAAADxwIC/AABAwAAAAAAAiIK/AABAwAAAAABNUYS/AABAwAAAAADVHIa/AABAwAAAAACT6oe/AABAwAAAAACAuom/AABAwAAAAACajIu/AABAwAAAAADaYI2/AABAwAAAAAA8N4+/AABAwAAAAAC7D5G/AABAwAAAAABU6pK/AABAwAAAAAD+xpS/AABAwAAAAAC4pZa/AABAwAAAAAB8hpi/AABAwAAAAABGaZq/AABAwAAAAAAPTpy/AABAwAAAAADUNJ6/AABAwAAAAACOHaC/AABAwAAAAAA6CKK/AABAwAAAAADU9KO/AABAwAAAAABV46W/AABAwAAAAAC506e/AABAwAAAAAD8xam/AABAwAAAAAAauqu/AABAwAAAAAALsK2/AABAwAAAAADKp6+/AABAwAAAAABWobG/AABAwAAAAAConLO/AABAwAAAAAC9mbW/AABAwAAAAACMmLe/AABAwAAAAAAUmbm/AABAwAAAAABQm7u/AABAwAAAAAA2n72/AABAwAAAAADKpL+/AABAwAAAAAAArMG/AABAwAAAAADWtMO/AABAwAAAAABGv8W/AABAwAAAAABMy8e/AABAwAAAAADk2Mm/AABAwAAAAAAJ6Mu/AABAwAAAAACy+M2/AABAwAAAAADgCtC/AABAwAAAAACKHtK/AABAwAAAAACvM9S/AABAwAAAAABISta/AABAwAAAAABQYti/AABAwAAAAADBe9q/AABAwAAAAACZlty/AABAwAAAAADQst6/AABAwAAAAABk0OC/AABAwAAAAABP7+K/AABAwAAAAACND+W/AABAwAAAAAAXMee/AABAwAAAAADqU+m/AABAwAAAAAACeOu/AABAwAAAAABWne2/AABAwAAAAADmw++/AABAwAAAAACs6/G/AABAwAAAAACiFPS/AABAwAAAAADDPva/AABAwAAAAAAKavi/AABAwAAAAAB0lvq/AABAwAAAAAD8w/y/AABAwAAAAACa8v6/AABAwAAAAAAmkQDAAABAwAAAAACGqQHAAABAwAAAAABtwgLAAABAwAAAAADU2wPAAABAwAAAAAC89QTAAABAwAAAAAAiEAbAAABAwAAAAAAEKwfAAABAwAAAAABcRgjAAABAwAAAAAAsYgnAAABAwAAAAABxfgrAAABAwAAAAAAlmwvAAABAwAAAAABKuAzAAABAwAAAAADc1Q3AAABAwAAAAADY8w7AAABAwAAAAAA6EhDAAABAwAAAAAAEMRHAAABAwAAAAAAwUBLAAABAwAAAAAC8bxPAAABAwAAAAACojxTAAABAwAAAAADurxXAAABAwAAAAACO0BbAAABAwAAAAACG8RfAAABAwAAAAADQEhnAAABAwAAAAABuNBrAAABAwAAAAABcVhvAAABAwAAAAACWeBzAAABAwAAAAAAdmx3AAABAwAAAAADrvR7AAABAwAAAAAD/4B/AAABAwAAAAABYBCHAAABAwAAAAADuJyLAAABAwAAAAADHSyPAAABAwAAAAADcbyTAAABAwAAAAAAqlCXAAABAwAAAAACwuCbAAABAwAAAAABr3SfAAABAwAAAAABaAinAAABAwAAAAAB2JyrAAABAwAAAAADCTCvAAABAwAAAAAA6cizAAABAwAAAAADaly3AAABAwAAAAACivS7AAABAwAAAAACM4y/AAABAwAAAAACaCTHAAABAwAAAAADHLzLAAABAwAAAAAARVjPAAABAwAAAAAB0fDTAAABAwAAAAADxojXAAABAwAAAAACEyTbAAABAwAAAAAAo8DfAAABAwAAAAADfFjnAAABAwAAAAACkPTrAAABAwAAAAAB2ZDvAAABAwAAAAABOizzAAABAwAAAAAAxsj3AAABAwAAAAAAX2T7AAABAwAAAAAACAEDAAABAwAAAAADrJkHAAABAwAAAAADQTULAAABAwAAAAAC0dEPAAABAwAAAAACMm0TAAABAwAAAAABfwkXAAABAwAAAAAAj6UbAAABAwAAAAADbD0jAAABAwAAAAAB/NknAAABAwAAAAAAPXUrAAABAwAAAAACOg0vAAABAwAAAAADxqUzAAABAwAAAAAA60E3AAABAwAAAAABn9k7AAABAwAAAAAB2HFDAAABAwAAAAABgQlHAAABAwAAAAAAnaFLAAABAwAAAAADIjVPAAABAwAAAAABAs1TAAABAwAAAAACM2FXAAABAwAAAAACp/VbAAABAwAAAAACYIljAAABAwAAAAABSR1nAAABAwAAAAADYa1rAAABAwAAAAAAmkFvAAABAwAAAAAA6tFzAAABAwAAAAAAS2F3AAABAwAAAAACr+17AAABAwAAAAAAFH2DAAABAwAAAAAAWQmHAAABAwAAAAADmZGLAAABAwAAAAABrh2PAAABAwAAAAAClqWTAAABAwAAAAACUy2XAAABAwAAAAAAw7WbAAABAwAAAAAB/DmjAAABAwAAAAABzL2nAAABAwAAAAAAVUGrAAABAwAAAAABccGvAAABAwAAAAABFkGzAAABAwAAAAADTr23AAABAwAAAAAD+zm7AAABAwAAAAADI7W/AAABAwAAAAAAqDHHAAABAwAAAAAAoKnLAAABAwAAAAAC2R3PAAABAwAAAAADeZHTAAABAwAAAAACSgXXAAABAwAAAAADWnXbAAABAwAAAAACmuXfAAABAwAAAAAD/1HjAAABAwAAAAADi73nAAABAwAAAAABFCnvAAABAwAAAAAAvJHzAAABAwAAAAACVPX3AAABAwAAAAAB8Vn7AAABAwAAAAADcbn/AAABAwAAAAABaQ4DAAABAwAAAAAACz4DAAABAwAAAAABkWoHAAABAwAAAAAB/5YHAAABAwAAAAABQcILAAABAwAAAAADY+oLAAABAwAAAAAAWhYPAAABAwAAAAAAGD4TAAABAwAAAAACsmITAAABAwAAAAAABIoXAAABAwAAAAAAGq4XAAABAwAAAAAC7M4bAAABAwAAAAAAevIbAAABAwAAAAAAtRIfAAABAwAAAAADoy4fAAABAwAAAAABNU4jAAABAwAAAAABb2ojAAABAwAAAAAAQYYnAAABAwAAAAABu54nAAABAwAAAAABwbYrAAABAwAAAAAAU84rAAABAwAAAAABeeIvAAABAwAAAAABJ/YvAAABAwAAAAADUgYzAAABAwAAAAAAABo3AAABAwAAAAADIiY3AAABAwAAAAAAuDY7AAABAwAAAAAAvkI7AAABAwAAAAADLEo/AAABAwAAAAAABlY/AAABAwAAAAADOFpDAAABAwAAAAAA0mJDAAABAwAAAAAAtGZHAAABAwAAAAAC8mZHAAABAwAAAAADeGZLAAABAwAAAAACSmZLAAABAwAAAAADYGJPAAABAwAAAAACql5PAAABAwAAAAAAOFpTAAABAwAAAAAD+k5TAAABAwAAAAAB8EZXAAABAwAAAAACCjpXAAABAwAAAAAAUC5bAAABAwAAAAAAsh5bAAABAwAAAAADLApfAAABAwAAAAADyfZfAAABAwAAAAACc+JfAAABAwAAAAADMcpjAAABAwAAAAAB87JjAAABAwAAAAACxZZnAAABAwAAAAABi3pnAAABAwAAAAACTVprAAABAwAAAAABAzprAAABAwAAAAABsRZvAAABAwAAAAAASvJvAAABAwAAAAAAyMpzAAABAwAAAAADMp5zAAABAwAAAAADaHJ3AAABAwAAAAABgkZ3AAABAwAAAAABbBZ7AAABAwAAAAADKeJ7AAABAwAAAAACt657AAABAwAAAAAAAXp/AAABAwAAAAADFz5/AAABAwAAAAAD2QKDAAABAwAAAAACYsaDAAABAwAAAAAClIaHAAABAwAAAAAAdkaHAAABAwAAAAAABAKLAAABAwAAAAABNbqLAAABAwAAAAAAA3KLAAABAwAAAAAAaSaPAAABAwAAAAACataPAAABAwAAAAAB9IaTAAABAwAAAAADEjKTAAABAwAAAAABs96TAAABAwAAAAAB3YaXAAABAwAAAAADfyqXAAABAwAAAAACmM6bAAABAwAAAAADIm6bAAABAwAAAAABJA6fAAABAwAAAAAAiaqfAAABAwAAAAABV0KfAAABAwAAAAADeNajAAABAwAAAAADCmqjAAABAwAAAAAD5/qjAAABAwAAAAACFYqnAAABAwAAAAABkxanAAABAwAAAAACXJ6rAAABAwAAAAAAYiarAAABAwAAAAADq6arAAABAwAAAAAAKSqvAAABAwAAAAAB4qavAAABAwAAAAAAyCKzAAABAwAAAAAA3ZqzAAABAwAAAAACEw6zAAABAwAAAAAAcIK3AAABAwAAAAAD4e63AAABAwAAAAAAd163AAABAwAAAAACFMa7AAABAwAAAAAAxi67AAABAwAAAAAAc5K7AAABAwAAAAABNPK/AAABAwAAAAAC8k6/AAABAwAAAAABq6q/AAABAwAAAAABWQLDAAABAwAAAAAB+lbDAAABAwAAAAADg6bDAAABAwAAAAAB+PbHAAABAwAAAAABUkLHAAABAwAAAAABi4rHAAABAwAAAAAClM7LAAABAwAAAAAAdhLLAAABAwAAAAADI07LAAABAwAAAAACoIrPAAABAwAAAAAC3cLPAAABAwAAAAAD6vbPAAABAwAAAAABoCrTAAABAwAAAAAAGVrTAAABAwAAAAADOoLTAAABAwAAAAADE6rTAAABAwAAAAADjM7XAAABAwAAAAAAsfLXAAABAwAAAAACcw7XAAABAwAAAAAAzCrbAAABAwAAAAADwT7bAAABAwAAAAADQlLbAAABAwAAAAADU2LbAAABAwAAAAAD5G7fAAABAwAAAAAA+XrfAAABAwAAAAACin7fAAABAwAAAAAAk4LfAAABAwAAAAADGH7jAAABAwAAAAACCXrjAAABAwAAAAABYnLjAAABAwAAAAABI2bjAAABAwAAAAABOFbnAAABAwAAAAABsULnAAABAwAAAAACgirnAAABAwAAAAADqw7nAAABAwAAAAABG/LnAAABAwAAAAAC0M7rAAABAwAAAAAAwarrAAABAwAAAAAC+n7rAAABAwAAAAABc1LrAAABAwAAAAAAECLvAAABAwAAAAAC6OrvAAABAwAAAAAB6bLvAAABAwAAAAABGnbvAAABAwAAAAAAYzbvAAABAwAAAAADw+7vAAABAwAAAAADQKbzAAABAwAAAAAC0VrzAAABAwAAAAACegrzAAABAwAAAAACIrbzAAABAwAAAAABy17zAAABAwAAAAABgAL3AAABAwAAAAABIKL3AAABAwAAAAAAuT73AAABAwAAAAAAUdb3AAABAwAAAAADymb3AAABAwAAAAADKvb3AAABAwAAAAACc4L3AAABAwAAAAABkAr7AAABAwAAAAAAiI77AAABAwAAAAADWQr7AAABAwAAAAACAYb7AAABAwAAAAAAaf77AAABAwAAAAACkm77AAABAwAAAAAAgt77AAABAwAAAAACM0b7AAABAwAAAAADm6r7AAABAwAAAAAAsA7/AAABAwAAAAABcGr/AAABAwAAAAAB2ML/AAABAwAAAAAB8Rb/AAABAwAAAAABoWb/AAABAwAAAAAA6bL/AAABAwAAAAADyfb/AAABAwAAAAACMjr/AAABAwAAAAAAKnr/AAABAwAAAAABsrL/AAABAwAAAAACsub/AAABAwAAAAADOxb/AAABAwAAAAADM0L/AAABAwAAAAACo2r/AAABAwAAAAABg47/AAABAwAAAAADu6r/AAABAwAAAAABc8b/AAABAwAAAAACc9r/AAABAwAAAAAC4+r/AAABAwAAAAACk/b/AAABAwAAAAABs/7/AAABAwAAAAAAAAMDAAAAAAAAAAAAAAACAAACAP8ToHTfE6B03hukdtwAAgD+nsR04p7EdOLG0HbgAAIA/BCmxOAQpsTiuMLG4AACAPzRBHTk0QR05SE0duQAAgD9CXHU5QVx1Oap5dbn//38/fWewOXxnsDnlhbC5/f9/PwbB7zkGwe85Nvnvufv/fz9uVxw6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" + } + ] +} \ No newline at end of file diff --git a/crates/bevy_gltf/src/lib.rs b/crates/bevy_gltf/src/lib.rs index 24901f02503837..1710cc59267ce8 100644 --- a/crates/bevy_gltf/src/lib.rs +++ b/crates/bevy_gltf/src/lib.rs @@ -1,3 +1,5 @@ +use bevy_ecs::{prelude::Component, reflect::ReflectComponent}; +use bevy_math::{Quat, Vec3}; use bevy_utils::HashMap; mod loader; @@ -6,7 +8,7 @@ pub use loader::*; use bevy_app::prelude::*; use bevy_asset::{AddAsset, Handle}; use bevy_pbr::StandardMaterial; -use bevy_reflect::TypeUuid; +use bevy_reflect::{Reflect, TypeUuid}; use bevy_render::mesh::Mesh; use bevy_scene::Scene; @@ -20,7 +22,9 @@ impl Plugin for GltfPlugin { .add_asset::() .add_asset::() .add_asset::() - .add_asset::(); + .add_asset::() + .add_asset::() + .register_type::(); } } @@ -37,6 +41,8 @@ pub struct Gltf { pub nodes: Vec>, pub named_nodes: HashMap>, pub default_scene: Option>, + pub animations: Vec>, + pub named_animations: HashMap>, } /// A glTF node with all of its child nodes, its [`GltfMesh`] and @@ -63,3 +69,52 @@ pub struct GltfPrimitive { pub mesh: Handle, pub material: Option>, } + +/// Interpolation method for an animation. Part of a [`GltfNodeAnimation`]. +#[derive(Clone, Debug)] +pub enum GltfAnimationInterpolation { + Linear, + Step, + CubicSpline, +} + +/// How a property of a glTF node should be animated. The property and its value can be found +/// through the [`GltfNodeAnimationKeyframes`] attribute. +#[derive(Clone, Debug)] +pub struct GltfNodeAnimation { + pub keyframe_timestamps: Vec, + pub keyframes: GltfNodeAnimationKeyframes, + pub interpolation: GltfAnimationInterpolation, +} + +/// A glTF animation, listing how each node (by its index) that is part of it should be animated. +#[derive(Default, Clone, TypeUuid, Debug)] +#[uuid = "d81b7179-0448-4eb0-89fe-c067222725bf"] +pub struct GltfAnimation { + pub node_animations: HashMap>, +} + +/// Key frames of an animation. +#[derive(Clone, Debug)] +pub enum GltfNodeAnimationKeyframes { + Rotation(Vec), + Translation(Vec), + Scale(Vec), +} + +impl Default for GltfNodeAnimation { + fn default() -> Self { + Self { + keyframe_timestamps: Default::default(), + keyframes: GltfNodeAnimationKeyframes::Translation(Default::default()), + interpolation: GltfAnimationInterpolation::Linear, + } + } +} + +/// A glTF node that is part of an animation, with its index. +#[derive(Component, Debug, Clone, Reflect, Default)] +#[reflect(Component)] +pub struct GltfAnimatedNode { + pub index: usize, +} diff --git a/crates/bevy_gltf/src/loader.rs b/crates/bevy_gltf/src/loader.rs index 4bf665ffdf973d..3a8bcda3a7d975 100644 --- a/crates/bevy_gltf/src/loader.rs +++ b/crates/bevy_gltf/src/loader.rs @@ -6,7 +6,7 @@ use bevy_core::Name; use bevy_ecs::{prelude::FromWorld, world::World}; use bevy_hierarchy::{BuildWorldChildren, WorldChildBuilder}; use bevy_log::warn; -use bevy_math::{Mat4, Vec3}; +use bevy_math::{Mat4, Quat, Vec3}; use bevy_pbr::{ AlphaMode, DirectionalLight, DirectionalLightBundle, PbrBundle, PointLight, PointLightBundle, StandardMaterial, @@ -35,7 +35,10 @@ use gltf::{ use std::{collections::VecDeque, path::Path}; use thiserror::Error; -use crate::{Gltf, GltfNode}; +use crate::{ + Gltf, GltfAnimatedNode, GltfAnimation, GltfAnimationInterpolation, GltfNode, GltfNodeAnimation, + GltfNodeAnimationKeyframes, +}; /// An error that occurs when loading a glTF file. #[derive(Error, Debug)] @@ -56,6 +59,8 @@ pub enum GltfError { ImageError(#[from] TextureError), #[error("failed to load an asset path: {0}")] AssetIoError(#[from] AssetIoError), + #[error("Missing sampler for animation {0}")] + MissingAnimationSampler(usize), } /// Loads glTF files with all of their data as their corresponding bevy representations. @@ -121,6 +126,78 @@ async fn load_gltf<'a, 'b>( } } + let mut animations = vec![]; + let mut named_animations = HashMap::default(); + let mut animated_nodes = HashSet::default(); + for animation in gltf.animations() { + let mut gltf_animation = GltfAnimation::default(); + for channel in animation.channels() { + let interpolation = match channel.sampler().interpolation() { + gltf::animation::Interpolation::Linear => GltfAnimationInterpolation::Linear, + gltf::animation::Interpolation::Step => GltfAnimationInterpolation::Step, + gltf::animation::Interpolation::CubicSpline => { + GltfAnimationInterpolation::CubicSpline + } + }; + let node = channel.target().node(); + let reader = channel.reader(|buffer| Some(&buffer_data[buffer.index()])); + let keyframe_timestamps: Vec = if let Some(inputs) = reader.read_inputs() { + match inputs { + gltf::accessor::Iter::Standard(times) => times.collect(), + gltf::accessor::Iter::Sparse(_) => { + warn!("sparse accessor not supported for animation sampler input"); + continue; + } + } + } else { + warn!("animations without a sampler input are not supported"); + return Err(GltfError::MissingAnimationSampler(animation.index())); + }; + + let keyframes = if let Some(outputs) = reader.read_outputs() { + match outputs { + gltf::animation::util::ReadOutputs::Translations(tr) => { + GltfNodeAnimationKeyframes::Translation(tr.map(Vec3::from).collect()) + } + gltf::animation::util::ReadOutputs::Rotations(rots) => { + GltfNodeAnimationKeyframes::Rotation( + rots.into_f32().map(Quat::from_array).collect(), + ) + } + gltf::animation::util::ReadOutputs::Scales(scale) => { + GltfNodeAnimationKeyframes::Scale(scale.map(Vec3::from).collect()) + } + gltf::animation::util::ReadOutputs::MorphTargetWeights(_) => { + warn!("Morph animation property not yet supported"); + continue; + } + } + } else { + warn!("animations without a sampler output are not supported"); + return Err(GltfError::MissingAnimationSampler(animation.index())); + }; + + gltf_animation + .node_animations + .entry(node.index()) + .or_default() + .push(GltfNodeAnimation { + keyframe_timestamps, + keyframes, + interpolation, + }); + animated_nodes.insert(node.index()); + } + let handle = load_context.set_labeled_asset( + &format!("Animation{}", animation.index()), + LoadedAsset::new(gltf_animation), + ); + if let Some(name) = animation.name() { + named_animations.insert(name.to_string(), handle.clone()); + } + animations.push(handle); + } + let mut meshes = vec![]; let mut named_meshes = HashMap::default(); for mesh in gltf.meshes() { @@ -317,7 +394,8 @@ async fn load_gltf<'a, 'b>( .insert_bundle(TransformBundle::identity()) .with_children(|parent| { for node in scene.nodes() { - let result = load_node(&node, parent, load_context, &buffer_data); + let result = + load_node(&node, parent, load_context, &buffer_data, &animated_nodes); if result.is_err() { err = Some(result); return; @@ -349,6 +427,8 @@ async fn load_gltf<'a, 'b>( named_materials, nodes, named_nodes, + animations, + named_animations, })); Ok(()) @@ -494,6 +574,7 @@ fn load_node( world_builder: &mut WorldChildBuilder, load_context: &mut LoadContext, buffer_data: &[Vec], + animated_nodes: &HashSet, ) -> Result<(), GltfError> { let transform = gltf_node.transform(); let mut gltf_error = None; @@ -501,6 +582,12 @@ fn load_node( Mat4::from_cols_array_2d(&transform.matrix()), ))); + if animated_nodes.contains(&gltf_node.index()) { + node.insert(GltfAnimatedNode { + index: gltf_node.index(), + }); + } + if let Some(name) = gltf_node.name() { node.insert(Name::new(name.to_string())); } @@ -636,7 +723,7 @@ fn load_node( // append other nodes for child in gltf_node.children() { - if let Err(err) = load_node(&child, parent, load_context, buffer_data) { + if let Err(err) = load_node(&child, parent, load_context, buffer_data, animated_nodes) { gltf_error = Some(err); return; } diff --git a/examples/3d/manual_gltf_animation_player.rs b/examples/3d/manual_gltf_animation_player.rs new file mode 100644 index 00000000000000..efd4b03210a7aa --- /dev/null +++ b/examples/3d/manual_gltf_animation_player.rs @@ -0,0 +1,230 @@ +use bevy::{ + core::FixedTimestep, + gltf::*, + math::{const_quat, const_vec3}, + prelude::*, + scene::InstanceId, +}; + +/// This illustrates loading animations from GLTF files and manually playing them. +/// Note that a higher level animation api is in the works. This exists to illustrate how to +/// read and build a custom GLTF animator, not to illustrate a final Bevy animation api. +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .insert_resource(AmbientLight { + color: Color::WHITE, + brightness: 1.0, + }) + .add_startup_system(setup) + .add_system_set( + SystemSet::new() + .with_run_criteria(FixedTimestep::step(10.0)) + .with_system(switch_scene), + ) + .add_system(setup_scene_once_loaded) + .add_system(gltf_animation_driver) + .run(); +} + +struct Example { + model_name: &'static str, + camera_transform: Transform, + speed: f32, +} +impl Example { + const fn new(model_name: &'static str, camera_transform: Transform, speed: f32) -> Self { + Self { + model_name, + camera_transform, + speed, + } + } +} + +// const ANIMATIONS: [(&str, Transform, f32); 3] = [ +const ANIMATIONS: [Example; 3] = [ + // https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AnimatedTriangle + Example::new( + "models/animated/AnimatedTriangle.gltf", + Transform { + translation: const_vec3!([0.0, 0.0, 3.0]), + rotation: const_quat!([0.0, 0.0, 0.0, 1.0]), + scale: const_vec3!([1.0; 3]), + }, + 0.12, + ), + // https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/BoxAnimated + Example::new( + "models/animated/BoxAnimated.gltf", + Transform { + translation: const_vec3!([4.0, 2.0, 4.0]), + rotation: const_quat!([-0.08, 0.38, 0.03, 0.92]), + scale: const_vec3!([1.0; 3]), + }, + 0.4, + ), + Example::new( + "models/animated/animations.gltf", + Transform { + translation: const_vec3!([-10.0, 5.0, -3.0]), + rotation: const_quat!([0.16, 0.69, 0.16, -0.69]), + scale: const_vec3!([1.0; 3]), + }, + 2.5, + ), +]; + +struct CurrentScene { + instance_id: InstanceId, + animation: Handle, + speed: f32, +} + +struct CurrentAnimation { + start_time: f64, + animation: GltfAnimation, +} + +fn setup( + mut commands: Commands, + asset_server: Res, + mut scene_spawner: ResMut, +) { + // Insert a resource with the current scene information + commands.insert_resource(CurrentScene { + // Its instance id, to be able to check that it's loaded + instance_id: scene_spawner + .spawn(asset_server.load(&format!("{}#Scene0", ANIMATIONS[0].model_name))), + // The handle to the first animation + animation: asset_server.load(&format!("{}#Animation0", ANIMATIONS[0].model_name)), + // The animation speed modifier + speed: ANIMATIONS[0].speed, + }); + + // Add a camera + commands.spawn_bundle(PerspectiveCameraBundle { + transform: ANIMATIONS[0].camera_transform, + ..Default::default() + }); + + // Add a directional light + commands.spawn_bundle(DirectionalLightBundle::default()); +} + +// Switch the scene to the next one every 10 seconds +fn switch_scene( + mut commands: Commands, + scene_root: Query, Without, Without)>, + mut camera: Query<&mut Transform, With>, + mut current: Local, + mut current_scene: ResMut, + asset_server: Res, + mut scene_spawner: ResMut, +) { + *current = (*current + 1) % ANIMATIONS.len(); + + // Despawn the existing scene, then start loading the next one + commands.entity(scene_root.single()).despawn_recursive(); + current_scene.instance_id = scene_spawner + .spawn(asset_server.load(&format!("{}#Scene0", ANIMATIONS[*current].model_name))); + current_scene.animation = + asset_server.load(&format!("{}#Animation0", ANIMATIONS[*current].model_name)); + current_scene.speed = ANIMATIONS[*current].speed; + + // Update the camera position + *camera.single_mut() = ANIMATIONS[*current].camera_transform; + + // Reset the current animation + commands.remove_resource::(); +} + +// Setup the scene for animation once it is loaded, by adding the animation to a resource with +// the start time. +fn setup_scene_once_loaded( + mut commands: Commands, + scene_spawner: Res, + current_scene: Res, + time: Res