Skip to content

Commit 242e7d9

Browse files
committed
Implement mesh skinning
1 parent 00d8d5d commit 242e7d9

File tree

16 files changed

+843
-6
lines changed

16 files changed

+843
-6
lines changed

Cargo.toml

+11
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ members = ["crates/*", "examples/ios", "tools/ci"]
2121

2222
[features]
2323
default = [
24+
"bevy_animation_rig",
2425
"bevy_audio",
2526
"bevy_dynamic_plugin",
2627
"bevy_gilrs",
@@ -41,6 +42,7 @@ dynamic = ["bevy_dylib"]
4142
render = ["bevy_internal/bevy_pbr", "bevy_internal/bevy_render", "bevy_internal/bevy_sprite", "bevy_internal/bevy_text", "bevy_internal/bevy_ui"]
4243

4344
# Optional bevy crates
45+
bevy_animation_rig = ["bevy_internal/bevy_animation_rig"]
4446
bevy_audio = ["bevy_internal/bevy_audio"]
4547
bevy_dynamic_plugin = ["bevy_internal/bevy_dynamic_plugin"]
4648
bevy_gilrs = ["bevy_internal/bevy_gilrs"]
@@ -176,6 +178,15 @@ path = "examples/3d/wireframe.rs"
176178
name = "z_sort_debug"
177179
path = "examples/3d/z_sort_debug.rs"
178180

181+
# Animation
182+
[[example]]
183+
name = "custom_skinned_mesh"
184+
path = "examples/animation/custom_skinned_mesh.rs"
185+
186+
[[example]]
187+
name = "gltf_skinned_mesh"
188+
path = "examples/animation/gltf_skinned_mesh.rs"
189+
179190
# Application
180191
[[example]]
181192
name = "custom_loop"
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"scenes":[{"nodes":[0]}],"nodes":[{"skin":0,"mesh":0,"children":[1]},{"children":[2],"translation":[0,1,0]},{"rotation":[0,0,0,1]}],"meshes":[{"primitives":[{"attributes":{"POSITION":1,"JOINTS_0":2,"WEIGHTS_0":3},"indices":0}]}],"skins":[{"inverseBindMatrices":4,"joints":[1,2]}],"animations":[{"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}],"samplers":[{"input":5,"interpolation":"LINEAR","output":6}]}],"buffers":[{"uri":"data:application/gltf-buffer;base64,AAABAAMAAAADAAIAAgADAAUAAgAFAAQABAAFAAcABAAHAAYABgAHAAkABgAJAAgAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAD8AAAAAAACAPwAAAD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAAAAAAAAwD8AAAAAAACAPwAAwD8AAAAAAAAAAAAAAEAAAAAAAACAPwAAAEAAAAAA","byteLength":168},{"uri":"data:application/gltf-buffer;base64,AAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAABAPwAAgD4AAAAAAAAAAAAAQD8AAIA+AAAAAAAAAAAAAAA/AAAAPwAAAAAAAAAAAAAAPwAAAD8AAAAAAAAAAAAAgD4AAEA/AAAAAAAAAAAAAIA+AABAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAA=","byteLength":320},{"uri":"data:application/gltf-buffer;base64,AACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAvwAAgL8AAAAAAACAPwAAgD8AAAAAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAL8AAIC/AAAAAAAAgD8=","byteLength":128},{"uri":"data:application/gltf-buffer;base64,AAAAAAAAAD8AAIA/AADAPwAAAEAAACBAAABAQAAAYEAAAIBAAACQQAAAoEAAALBAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAPT9ND/0/TQ/AAAAAAAAAAD0/TQ/9P00PwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAPT9NL/0/TQ/AAAAAAAAAAD0/TS/9P00PwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAAAAAAAAAIA/","byteLength":240}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":48,"target":34963},{"buffer":0,"byteOffset":48,"byteLength":120,"target":34962},{"buffer":1,"byteOffset":0,"byteLength":320,"byteStride":16},{"buffer":2,"byteOffset":0,"byteLength":128},{"buffer":3,"byteOffset":0,"byteLength":240}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5123,"count":24,"type":"SCALAR","max":[9],"min":[0]},{"bufferView":1,"byteOffset":0,"componentType":5126,"count":10,"type":"VEC3","max":[1,2,0],"min":[0,0,0]},{"bufferView":2,"byteOffset":0,"componentType":5123,"count":10,"type":"VEC4","max":[0,1,0,0],"min":[0,1,0,0]},{"bufferView":2,"byteOffset":160,"componentType":5126,"count":10,"type":"VEC4","max":[1,1,0,0],"min":[0,0,0,0]},{"bufferView":3,"byteOffset":0,"componentType":5126,"count":2,"type":"MAT4","max":[1,0,0,0,0,1,0,0,0,0,1,0,-0.5,-1,0,1],"min":[1,0,0,0,0,1,0,0,0,0,1,0,-0.5,-1,0,1]},{"bufferView":4,"byteOffset":0,"componentType":5126,"count":12,"type":"SCALAR","max":[5.5],"min":[0]},{"bufferView":4,"byteOffset":48,"componentType":5126,"count":12,"type":"VEC4","max":[0,0,0.707,1],"min":[0,0,-0.707,0.707]}],"asset":{"version":"2.0"}}

crates/bevy_animation_rig/Cargo.toml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[package]
2+
name = "bevy_animation_rig"
3+
version = "0.5.0"
4+
edition = "2018"
5+
authors = [
6+
"Bevy Contributors <[email protected]>",
7+
"Carter Anderson <[email protected]>",
8+
]
9+
description = "Bevy Engine Animation Rigging System"
10+
homepage = "https://bevyengine.org"
11+
repository = "https://github.com/bevyengine/bevy"
12+
license = "MIT"
13+
keywords = ["bevy", "animation", "rig", "skeleton"]
14+
15+
[dependencies]
16+
# bevy
17+
bevy_app = { path = "../bevy_app", version = "0.5.0" }
18+
bevy_asset = { path = "../bevy_asset", version = "0.5.0" }
19+
bevy_ecs = { path = "../bevy_ecs", version = "0.5.0" }
20+
bevy_math = { path = "../bevy_math", version = "0.5.0" }
21+
bevy_pbr = { path = "../bevy_pbr", version = "0.5.0" }
22+
bevy_reflect = { path = "../bevy_reflect", version = "0.5.0", features = ["bevy"] }
23+
bevy_render = { path = "../bevy_render", version = "0.5.0" }
24+
bevy_transform = { path = "../bevy_transform", version = "0.5.0" }

crates/bevy_animation_rig/src/lib.rs

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use bevy_app::{AppBuilder, CoreStage, Plugin, StartupStage};
2+
use bevy_asset::AddAsset;
3+
use bevy_ecs::{
4+
schedule::{ParallelSystemDescriptorCoercion, SystemLabel},
5+
system::IntoSystem,
6+
};
7+
use bevy_transform::TransformSystem;
8+
9+
mod skinned_mesh;
10+
pub use skinned_mesh::*;
11+
12+
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)]
13+
pub enum AnimationRigSystem {
14+
SkinnedMeshSetup,
15+
SkinnedMeshUpdate,
16+
}
17+
18+
#[derive(Default)]
19+
pub struct AnimationRigPlugin;
20+
21+
impl Plugin for AnimationRigPlugin {
22+
fn build(&self, app: &mut AppBuilder) {
23+
app.register_type::<SkinnedMesh>()
24+
.add_asset::<SkinnedMeshInverseBindposes>()
25+
.add_startup_system_to_stage(
26+
StartupStage::PreStartup,
27+
skinned_mesh_setup
28+
.system()
29+
.label(AnimationRigSystem::SkinnedMeshSetup),
30+
)
31+
.add_system_to_stage(
32+
CoreStage::PostUpdate,
33+
skinned_mesh_update
34+
.system()
35+
.label(AnimationRigSystem::SkinnedMeshUpdate)
36+
.after(TransformSystem::TransformPropagate),
37+
);
38+
}
39+
}

0 commit comments

Comments
 (0)