9 breaking releases

✓ Uses Rust 2018 edition

new 0.10.0 Mar 23, 2020
0.8.1 Oct 4, 2019
0.7.0 Jul 30, 2019
0.5.1 Dec 26, 2018
0.1.0 Dec 29, 2017

#122 in Game development

Download history 377/week @ 2019-12-02 470/week @ 2019-12-09 334/week @ 2019-12-16 386/week @ 2019-12-23 387/week @ 2019-12-30 412/week @ 2020-01-06 461/week @ 2020-01-13 352/week @ 2020-01-20 370/week @ 2020-01-27 531/week @ 2020-02-03 460/week @ 2020-02-10 473/week @ 2020-02-17 487/week @ 2020-02-24 458/week @ 2020-03-02 549/week @ 2020-03-09 531/week @ 2020-03-16

1,964 downloads per month
Used in 10 crates (2 directly)

MIT/Apache and maybe MPL-2.0

13K SLoC

This crate is used by the Amethyst game engine for animation.


Provides computer graphics animation functionality.

Animation on a single entity comprises of one or more Samplers. Each sampler operates on a Channel. Thus, for a single entity, conceptually each (Channel, Sampler) pair is enough to define one part the animation, and a Vec<(Channel, Sampler)> defines the whole animation.

In a more complex situation, an object in game may be made up of multiple entities. Say you have a dragon monster, that is defined by a skinned mesh that has a skeleton with 10 joints. Each joint will then be an Entity. Our animation definition holds the samplers to run for the whole object. To animate each of the entities of this complex object, we need a way to link the sampler to the each of the entities.

Animation definitions are persistent and can be stored on disk. Entities however, are not. To link the right sampler to the right entity, when we construct each of the entities such as the joints, we track it with an index, called the node_index.

The following list might help to illustrate the scenario:

node index entity
0 body ("main" entity)
1 head
2 left left
3 right left
... ...

The node index to Entity mapping is stored in AnimationHierarchy.

Back to the animation definition, we also record the node_index in the tuple, which we call a "node". Each node is now (node_index, Channel, Sampler) (conceptually — in code the tuple holds references instead of the complete object). Hence, each node holds the information of what channel the sampler belongs to, and which entity it should be applied to.

So what happens for the nodes where we only have one entity? Right now Amethyst requires you to assign it node index 0.


The animation and gltf examples demonstrate usage of this crate.


~488K SLoC