Data-oriented and data-driven game engine written in Rust


Amethyst Game Engine

Build Status docs page MIT/Apache Join us on Discord Community forum Reddit Code coverage Lines of Code

What is Amethyst?

Amethyst is a data-driven and data-oriented game engine aiming to be fast and as configurable as possible.


These principles are what makes Amethyst unique and competitive in the world of game engines:

  • Massively parallel architecture.
  • Powered by a correct Entity Component System model.
  • Rapid prototyping with RON files for prefabs and an abstract scripting API.
  • Strong focus on encouraging reusability and clean interfaces.

Why Amethyst?

Extreme Multithreading

Amethyst is based over a very powerful parallel ECS called Specs. This allows games built with Amethyst to maximize the available processing power to run as smoothly and as quickly as possible, without the headaches of multi-threaded programming.


By design, the Amethyst engine encourages you to write clean and reusable code for your behaviours and data structures. This allows engine users to easily share useful components, thus reducing development time and cost.

Using the ECS architecture, the code of games can be cleanly divided between data and behaviour, making it easy to understand what is going on, even if the game is running on a massive 64-core processor.


  • Discord - Announcements, help, useful information, general discussion.


Please visit the features page for a list of features Amethyst provides.



While the engine can be hard to use at times, we made a lot of documentation that will teach you everything you need to use Amethyst comfortably.

If you don't understand a part of the documentation, please let us know. Join us on Discord or open an issue; we are always happy to help!

Getting started

Before you begin

This repository uses Git LFS for some files used in examples. If you intend to run the examples, make sure you have LFS installed in your system before you clone. You can download it and read the installation instructions at Git LFS home page.


To compile any of the examples run:

$ cargo run -p name_of_example

All available examples are listed under the examples directory.

For a full-blown "Hello World" tutorial check out the Getting Started chapter in the book.

Showcase games

Our official showcase games demonstrate larger, continuously developed game projects made with Amethyst:

For more examples see Games Made With Amethyst topic on the community forum for some good sources of inspiration.


If you are compiling on Linux, make sure to install the dependencies below.

Arch Linux

pacman -Syu grep gcc pkgconf openssl alsa-lib cmake make python3 freetype2 awk libxcb


apt install gcc pkg-config openssl libasound2-dev cmake build-essential python3 libfreetype6-dev libexpat1-dev libxcb-composite0-dev libssl-dev libx11-dev libfontconfig1-dev


dnf install pkgconfig gcc openssl-devel alsa-lib-devel cmake make gcc-c++ freetype-devel expat-devel libxcb-devel libX11-devel


zypper install gcc pkg-config libopenssl-devel alsa-devel cmake gcc-c++ python3 freetype2-devel libexpat-devel libxcb-devel


In your project's root folder, create a file shell.nix with the following contents:

  mozilla = import (builtins.fetchTarball;
  nixpkgs = import <nixpkgs> { overlays = [ mozilla ]; };

  with nixpkgs;

  mkShell {
    buildInputs = [

    APPEND_LIBRARY_PATH = stdenv.lib.makeLibraryPath [

    shellHook = ''


See your distribution-specific installation process for the equivalent dependencies.

Please note that you need to have a functional graphics driver installed. If you get a panic about the renderer unable to create the context when trying to run an example, a faulty driver installation could be the issue.

Building Documentation

You can build the book locally with:

cargo install mdbook
mdbook build book

If you're actively editing the book, it's easiest to run:

mdbook serve book

and navigate to http://localhost:3000. The text itself can be found in book/html/index.html. For more information, please see the mdBook project.

To generate the API documentation locally, do:

$ cargo doc

The API reference can be found in target/doc/amethyst/index.html.


Amethyst supports only the latest stable release of Rust. Use the nightly and beta channels with this project at your own risk.

If you have a question, please check out the FAQ before asking. Chances are, the solution to your problem is already present there. If you still need help, feel free to ask on our Discord server.

Other places you might want to check out are r/rust_gamedev and the #rust-gamedev IRC.


Note: Any interaction with the Amethyst project is subject to our Code of Conduct.

Amethyst is a community-based project that welcomes contributions from anyone. If you're interested in helping out, please read the contribution guidelines before getting started.

We have a good first issue category that groups all issues or feature requests that can be made without having an extensive knowledge of Rust or Amethyst. Working on those issues is a good, if not the best, way to learn.

If you think you are not ready to code yet, you can still contribute by reviewing code written by other members of the community. Code reviews ensure that code merged into Amethyst is of the highest quality as possible. Pull requests that are available for reviews can be found here.

If for some reason we don't have any open PRs in need of a review nor any good first issues (that would be a good thing), feel free to consult our issue tracker.


Thank you to all our backers! 🙏 Become a backer


Amethyst is supported by:


Amethyst is free and open source software distributed under the terms of both the MIT License and the Apache License 2.0.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

  • Refactor local transform

    Refactor local transform

    I've refactored the LocalTransform to be more like what I would expect. I don't know if this change is correct, but hopefully if there is criticism of it then that will help me understand the function of LocalTransform in amethyst.

    This change is Reviewable

    pri: important type: improvement 
    opened by derekdreery 105
  • Implement thread-safe ECS

    Implement thread-safe ECS

    With game state management mostly stable, the next step is to implement an entity-component-system framework in the engine. This framework must follow the pure ECS model, in which entities are just IDs and components are POD structs.

    Though the ECS model is extremely flexible and easy to data-drive, it has its shortcomings:

    • Difficult to cache important data
    • Difficult to parallelize, heavy reliance on mutable state

    In a useful Reddit post, tomaka describes an alternative model similar to MVC with some parallelism. I propose a combination of the two designs resulting in a thread-safe ECS.

    (Quoted from the other announcements section in TWIA Issue 1)

    Clearly, the World struct containing our entities and components is analogous to the model in MVC. But systems typically require mutable state even for strictly read-only operations, so they don’t fit into either views or controllers, nor are they easy to parallelize.

    However, there are two possible ways to remedy this issue.

    1. Systems are split into two separate traits: Updaters and Viewers. The Viewers only require read access to the World, so they can run in parallel. Updaters request mutable access to the World and submit a list of changes they want to make to the content. These changes are applied serially according to a predetermined priority.
    2. Systems are kept as one unit (perhaps renamed to “Processors” for clarity), and they all read the World struct in parallel but can optionally submit changes to the World, which are applied serially once everyone has finished reading.

    Experiments are ongoing on the ecs branch.

    diff: normal pri: critical 
    opened by ebkalderon 84
  • [WIP, alpha] hal

    [WIP, alpha] hal


    • [x] Memory manager
    • [x] Framegraph
    • [x] Initialization
    • [x] Queue orchestration
    • [x] Vertices 2.0
    • [x] Meshes
    • [x] Textures
    • [x] Uniform caches
    • [x] Descriptor pools
    • [x] Camera
    • [x] Basic lighting
    • [x] Flat pass
    • [ ] Shaded pass
    • [ ] PBR pass
    • [ ] Rending system. Halfway there

    What's left:

    • [ ] Move some code to small PR to be merged earlier.
    • [ ] Replace semaphores with other synchronization methods.
    • [ ] Fix examples
    • [ ] Text rendering.

    This change is Reviewable

    team: rendering type: improvement 
    opened by zakarumych 73
  • High CPU usage in empty project

    High CPU usage in empty project

    When running an empty amethyst application (i.e. one with no systems registered and no extra logic happening in the game state's update method) I've noticed unexpectedly high CPU usage on my Windows 10, somewhere between 15%-25% with a 6 core CPU. I would expect to only see ~1% usage, since the application should be effectively waking up briefly at the beginning of each frame, and then immediately going back to sleep until the next frame. Note that this is limiting to 60 fps with a sleep-only limiting strategy, which should be the strategy the has the lowest CPU-usage.

    I profiled the application, and found that most of the CPU time was being spent in rayon's worker thread logic. As best I can tell, what's happening is that rayon has a grace period where worker threads will spin-wait before sleeping them when there's no work available. Once more work is added, all sleeping worker threads are woken back up. Since amethyst adds new work every frame, the worker threads are being woken back up each frame, and once all the work for the frame is done, every worker thread has to spin-wait for some amount of time. This results in an (apparently) large amount of extra CPU time being eaten each frame.

    I'm not able to test this behavior on MacOS/Linux, but I'd expect the result is the same on Unix-like platforms as it is on Windows.

    It seems like this could be solved if amethyst could notify rayon that all the work for the thread is done, allowing rayon to immediately put all worker threads to sleep until the next frame. I don't know if this is something rayon supports, or if it's the optimal solution.

    How To Get Started

    The biggest source of CPU usage when Amethyst is done with all work for a frame is coming from Rayon. The way Amethyst uses Rayon is triggering worst-case behavior in how Rayon handles putting worker threads to sleep, and the only real solution is for Rayon to add better support for quickly sleeping worker threads at the end of the frame.

    A good first step for fixing this would be to build a demo that uses rayon the way that Amethyst does so that the Rayon devs can reproduce the issue and test fixes. Specifically, the demo should do the following:

    1. Create a thread pool using Rayon. Ideally it should use a setup similar to what Amethyst does in terms of how many worker threads it creates.
    2. Run in a loop that spawns a fixed amount of work (a good amount would be 5-10 milliseconds, bonus points for making the amount configurable) at the beginning of every loop iteration.
    3. Each iteration, wait for work spawned on the worker thread to finish and then have the main thread wait until enough time has passed to start the next "frame". 60 fps is a good test case, so the demo should attempt to have the body of the loop take 16.6 ms each iteration.

    Once we have this demo, we can make a PR to Rayon adding it to their demo projects, and then discuss with the Rayon team about how to best solve the problem.

    diff: normal pri: important team: engine type: bug 
    opened by randomPoison 69
  • Implement Advanced Rotation and Movement

    Implement Advanced Rotation and Movement

    Well, since I already told you that I need rotation for my project, I figured I can just contribute this feature so it arrives faster (hopefully). I will start by doing the core camera modification and then try to come up with a way to add all the different ideas and wishes the best I can. Feel free to make suggestions anytime.

    I am still quite the Rust beginner and this is my first quaternion camera implementation, so I hope that I don't make too many stupid mistakes. Well, this PR should help get early feedback and keep up the quality :)

    I test the implementation against my project (so I get hands-on feedback on rotation-behavior), however I will also write unit tests later on. If you have a 2D project with orthographic camera, feel free to do a test for your project and give feedback for your use-cases, for example do you need any specific helper-functions?

    Related discussions are happening in #176 and #249 .

    type: feature type: improvement 
    opened by minecrawler 61
  • GitHub Actions CI, Take 3

    GitHub Actions CI, Take 3

    To Do:

    • Matrix: [mac, linux, windows] * [stable, beta, nightly]
      • [x] cargo fmt --check -- only on stable
      • [x] cargo clippy -- only on stable
      • [x] cargo test
        • [x] code compiles
        • [x] tests & API doctests run
      • [x] mdbook build book
      • [x] mdbook test -L ./target/debug/deps book -- only on stable

    To Do Later separate from this PR:

    • [ ] Use mdbook-linkcheck to detect broken book links
    • [ ] Use cargo-deadlinks to detect broken links
    • [ ] Speed up checks. Goal: 10 minutes or less
      • [ ] use sccache with S3 for cargo test
      • [ ] use self-hosted runners
      • [ ] Experiment with various compiler settings for reducing compile times and/or sizes
    • [ ] Automatically push rendered docs to website
      • [ ] master merges
      • [ ] releases
    • [ ] Automatically push rendered book to website
      • [ ] master merges
      • [ ] releases
    • [ ] Find way to post comments to PRs with guidance for figuring out how to fix some CI failures. "Clippy failed, please run cargo clippy and fix all errors..." -- I don't know if this is feasible
    • [ ] Find some way to indicate failures on nightly without making the build look like a red X. (You can let people merge by not requiring a specific check to pass, but the build will be a big red failure even if the failing check wasn't required. That's not a good experience. ☹️_ )
    opened by CleanCut 60
  • Move from error-chain to failure

    Move from error-chain to failure

    I've been messing about moving from error-chain to failure, what would be involved, and how the error types might be streamlined.

    It might be that ppl don't wanna make this change, so I've just done 2 modules to start with to show how it might happen.

    One thing that failure stresses is that error kinds should be fairly simple, in particular they should impl Eq if possible, so that they can be compared easily. They are just giving the current context: more specific information will be in the cause().

    Having Traits like SystemBundle ask for failure::Error seems right to me because amethyst doesn't need to inspect the type of this error - it just needs to know that there was an error, so it can for example use an old version of an asset, but still report the cause chain if necessary.

    failure uses trait objects and indirection, so maybe isn't so good for the happy path, but I don't think any errors I have seen so far are on a happy path, and amethyst makes heavy use of trait objects anyway.

    In the end, the causes of the error form a nice chain like they do in error-chain. A backtrace is also generated at the first point a Fail is created, so for example if a user uses failure internally and writes some code that fails, you get a backtrace from the original site in their code. If not, your backtrace will point to the cause farthest back in your code.

    What do people think?

    Ideally, using failure should allow errors like the following:

        Error: there was an error in the amethyst engine
    caused by: An asset hot-reload failed.
    caused by: Could not convert asset "mesh1" of type "MESH" from byte array.
    caused by: Failed to parse .obj file line 32: unexpected character, expected ....

    This would be very useful for quickly identifying and fixing the source of errors, with contextual information about what caused the error. Sometimes this contextual information has useful stuff not in a stack trace, and would require a debugger to see otherwise.

    This change is Reviewable

    type: improvement 
    opened by derekdreery 55
  • RFC: State specific Systems and Scenes

    RFC: State specific Systems and Scenes

    As a player traverses through menus and game levels each will likely have its own State associated with it.

    As the game transitions between States it may be desirable for the game programmer to introduce and remove Systems, and to remove Entities when the context in which they are necessary is no longer present. Simultaneously however, some Systems and Entities will need to be global. So in order to achieve these goals I propose two additions to the main crate:

    1. State specific dispatchers. Each State has a Dispatcher associated with it in the StateMachine, the State can populate the Dispatcher with Systems in on_start and this dispatcher will be executed after the primary global Dispatcher. This Dispatcher will only be disposed of if the State structure associated with it is also disposed of, either by Trans::Pop or Trans::Switch

    2. State specific Scenes. Each state will have access to a Scene structure which it can modify in any of functions on the State trait. A Scene is simply a vector of Entities correlated with this State. When the State is disposed of, either by Trans::Pop or Trans::Switch all entities in the Scene will be deleted from the specs::World.

    EDIT: In order to keep the Scene vector from growing indefinitely it will be iterated through every frame and any entities found that are no longer alive will be swap_removed from the vector.

    Unresolved question: Should entities that are part of a Scene be made "inactive" when the State is paused, and if so how would this be implemented?

    diff: normal pri: normal 
    opened by Xaeroxe 54
  • Add controller support

    Add controller support

    What it says on the tin. Enhance the Input system to support arbitrary game pads. Some APIs I'd like to support include

    diff: normal pri: normal type: feature 
    opened by Xaeroxe 52
  • Question: more functionality on specs Camera

    Question: more functionality on specs Camera

    I want to quickly implement a free-flow camera, and to do this I need to be able to rotate the view. The specs camera makes this difficult (you'd need to move the lookat value in a circle around the eye).

    I'm happy to implement some methods on the Camera (something like below) if the project owners think this is valuable?

    impl Camera {
        /// Rotates the camera relative to the current view direction
        pub fn view_rotate(&mut self, pitch: f32, yaw: f32, roll: f32) { ... }
        /// Rotates the camera relative to the world coordinate system
        pub fn world_rotate(&mut self, x: f32, y: f32, z: f32) { ... }
    diff: easy pri: normal team: rendering 
    opened by derekdreery 49
  • gfx_backend_vulkan problems on arch linux

    gfx_backend_vulkan problems on arch linux


    I'm trying to run a basic rendering example of amethyst on Arch Linux but I'm running into issues with amdvlk and gfx_backend_vulkan. These problems relate to finding the correct file and detecting problems in this entire process.

    I have installed both amdvlk64 and amdvlk32 on my Arch Linux system. The 64 bit version is found under /usr/lib/ and the 32 bit version is found under /usr/lib32/

    When I run the basic example I get the following log output that describes how /usr/lib/ can't be found (1).

    Next I create a symlink for /usr/lib32/ to /usr/lib/ so that the 32 bit version can be found in /usr/lib. I get the following log output where I've removed the beginning and the end as they are the same as in 1. (2)

    Since it seems to be saying that it's the wrong ELF class on I then instead symlink to point at /usr/lib/ When I do that the above error before the panic goes away but the same panic happens and the logged errors after the panic stay the same.

    Reproduction Steps

    1. Use Arch Linux
    2. Install lib32-amdvlk and amdvlk with pacman
    3. Create a new project from the github of amethyst and run the following code
    use amethyst::{
            plugins::{RenderFlat2D, RenderToWindow},
        //winit::event::{Event, KeyboardInput, VirtualKeyCode, WindowEvent},
    pub struct Pong;
    impl SimpleState for Pong {
    fn main() -> amethyst::Result<()> {
        let app_root = application_root_dir()?;
        let display_config_path = app_root.join("config").join("display.ron");
        let mut game_data = DispatcherBuilder::default();
            // The RenderToWindow plugin provides all the scaffolding for opening a window and drawing on it
                .with_clear(ClearColor {
                    float32: [0.0, 0.0, 0.0, 1.0],
            // RenderFlat2D plugin is used to render entities with a `SpriteRender` component.
        let assets_dir = app_root.join("assets");
        let game = Application::new(assets_dir, Pong, game_data)?;;
    1. Go through the steps above by creating symlinks to the appropriate *.so files.

    What You Expected to Happen

    I expect the vulkan not to error out.

    What Actually Happened

    The graphics backend crashes

    Screenshots and Logs


    [INFO][amethyst::app] Initializing Amethyst...
    [INFO][amethyst::app] Version: 0.15.3
    [INFO][amethyst::app] Platform: x86_64-unknown-linux-gnu
    [INFO][amethyst::app] Amethyst git commit: f563103e169add05bdceb3e54e33270a330685db
    [INFO][amethyst::app] Rustc version: 1.51.0 Stable
    [INFO][amethyst::app] Rustc git commit: 2fd73fabe469357a12c2c974c140f67e7cdd76d0
    [INFO][amethyst_assets::bundle] Adding importer for ext ron
    [INFO][amethyst_assets::bundle] Adding importer for ext prefab
    [INFO][amethyst_assets::bundle] Adding importer for ext bmp
    [INFO][amethyst_assets::bundle] Adding importer for ext tga
    [INFO][amethyst_assets::bundle] Adding importer for ext png
    [INFO][amethyst_assets::bundle] Adding importer for ext jpg
    [INFO][amethyst_assets::bundle] Adding importer for ext obj
    [INFO][distill_daemon::daemon] Starting Daemon Loop
    [INFO][distill_daemon::file_tracker::events] Scanned and compared 0 + 0, deleted 0
    GENERAL [Loader Message (0)] : /usr/lib/ cannot open shared object file: No such file or directory
    object info: (type: INSTANCE, hndl: 94886174677248)
    thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /home/user/development/project//src/amethyst/amethyst_
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    VALIDATION [VUID-vkFreeCommandBuffers-commandBufferCount-arraylength (257118683)] : Validation Error: [ VUID-vkFreeCommandBuffers-commandBufferCount-arraylength
     ] Object 0: handle = 0x564c69276320, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xf5351db | vkFreeCommandBuffers: parameter commandBufferCount must be greater
     than 0. The Vulkan spec states: commandBufferCount must be greater than 0 (
    object info: (type: DEVICE, hndl: 94886181692192)
    VALIDATION [VUID-vkFreeCommandBuffers-commandBufferCount-arraylength (257118683)] : Validation Error: [ VUID-vkFreeCommandBuffers-commandBufferCount-arraylength
     ] Object 0: handle = 0x564c69276320, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xf5351db | vkFreeCommandBuffers: parameter commandBufferCount must be greater
     than 0. The Vulkan spec states: commandBufferCount must be greater than 0 (
    object info: (type: DEVICE, hndl: 94886181692192)


    // ...
    GENERAL [Loader Message (0)] : /usr/lib/ wrong ELF class: ELFCLASS32
    object info: (type: INSTANCE, hndl: 93889813801216)
    thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /home/user/development/project/src/amethyst/amethyst_
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    // ...

    Your Environment

    Operating System: Arch Linux Operating System Version: 5.12.6-arch1-1 Version of Amethyst: github master branch commit c132d1a498350f6bd040d30dc0a061fc77b61f31

    Additional Context

    I've looked around a bunch online for ways to solve this and one way I have tried to check if vulkan is working as it should is by installing and running vulkinfo as per the advice of the wiki. vulkinfo does display information about my graphics card which seems to imply that it does work, but I don't know if it's checking the 32 or 64 bit version. Additionally I can't uninstall the 32 bit version of amdvlkas it is a dependency for some other parts of my system. I don't see why it would be necessary to uninstall it but I haven't tried any solution that involves that.

    type: bug 
    opened by leeperprwn 0
  • Panics when hiding Ui

    Panics when hiding Ui

    (This is my first github issue so please be nice)


    Panic when hiding Ui renderables.

    I'm not sure, but it looks like in amethyst_ui/src/, it appears entities with Hidden and HiddenPropagate are filtered out of the query on line 337, then the entity is still expected in the query on line 349.

    Reproduction Steps

    1. Create an aplication with the RenderingBundle, UiBundle, and HideHierarchySystem
    2. Create an entity with Hidden or HiddenPropagate, UiTransform, and UiImage (or another Ui renderable)

    What You Expected to Happen

    The entity would be created hidden without panicking.

    What Actually Happened

    Panics and exits the application.

    Screenshots and Logs

    [INFO][distill_daemon::asset_hub_service] tokio::net::TcpListener accepted thread 'main' panicked at 'Unreachable: Entity is guaranteed to be present based on earlier actions: AccessDenied', C:\Users\Cassandra.cargo\git\checkouts\amethyst-fedb0a1032a075ce\c132d1a\amethyst_ui\src\ note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

    Your Environment

    Operating System: Windows 10 home Operating System Version: 20H2 Version of Amethyst: Amethyst git commit: c132d1a498350f6bd040d30dc0a061fc77b61f31

    type: bug 
    opened by CassiopeiaStar 2
  • Fix a path in the tiles example

    Fix a path in the tiles example

    Signed-off-by: Michael X. Grey [email protected]


    This simply fixes a hardcoded file path in the tiles example. It seems the path is a hold over from when examples were compiled and run as part of the overall amethyst crate whereas now they seem to be treated independently.

    Motivation and Context

    Without this change, the path is wrong and the program panics.

    How Has This Been Tested?

    cargo run inside of the examples/tiles directory.


    • [x] Acknowledged that by making this pull request I release this code under an MIT/Apache 2.0 dual licensing scheme.
    • [x] My code follows the code style of this project.
    • [ ] ~~If my change required a change to the documentation I have updated the documentation accordingly.~~
    • [ ] ~~I have updated the content of the book if this PR would make the book outdated.~~
    • [ ] ~~I have added tests to cover my changes.~~
    • [ ] ~~My code is used in an example.~~
    opened by mxgrey 0
  • Animation example error loading ron file

    Animation example error loading ron file


    • Fix ron file to use expected format

    Reproduction Steps

    cd examples/animation && cargo run

    What Actually Happened

    [ERROR][distill_daemon::file_asset_source] Error processing pair at Some("/shareddata/share/prog/rust/amethyst/examples/animation/assets/prefab/animation.ron"): 8:1: Expected map
    [ERROR][distill_daemon::file_asset_source] Error processing pair at Some("/shareddata/share/prog/rust/amethyst/examples/animation/assets/prefab/animation.ron"): 8:1: Expected map
    VALIDATION [VUID-vkFreeCommandBuffers-commandBufferCount-arraylength (257118683)] : Validation Error: [ VUID-vkFreeCommandBuffers-commandBufferCount-arraylength ] Object 0: handle = 0x561b36f1c098, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xf5351db | vkFreeCommandBuffers: parameter commandBufferCount must be greater than 0. The Vulkan spec states: commandBufferCount must be greater than 0 (
    object info: (type: DEVICE, hndl: 94674885918872)
    VALIDATION [VUID-vkDestroyDevice-device-00378 (1901072314)] : Validation Error: [ VUID-vkDestroyDevice-device-00378 ] Object 0: handle = 0x561b36f1c098, type = VK_OBJECT_TYPE_DEVICE; Object 1: handle = 0x870000000087, type = VK_OBJECT_TYPE_SEMAPHORE; | MessageID = 0x71500fba | OBJ ERROR : For VkDevice 0x561b36f1c098[], VkSemaphore 0x870000000087[] has not been destroyed. The Vulkan spec states: All child objects created on device must have been destroyed prior to destroying device (
    object info: (type: DEVICE, hndl: 94674885918872), (type: SEMAPHORE, hndl: 148434069749895)
    VALIDATION [VUID-vkDestroyDevice-device-00378 (1901072314)] : Validation Error: [ VUID-vkDestroyDevice-device-00378 ] Object 0: handle = 0x561b36f1c098, type = VK_OBJECT_TYPE_DEVICE; Object 1: handle = 0x460000000046, type = VK_OBJECT_TYPE_SEMAPHORE; | MessageID = 0x71500fba | OBJ ERROR : For VkDevice 0x561b36f1c098[], VkSemaphore 0x460000000046[] has not been destroyed. The Vulkan spec states: All child objects created on device must have been destroyed prior to destroying device (
    object info: (type: DEVICE, hndl: 94674885918872), (type: SEMAPHORE, hndl: 76965813944390)
    VUID-vkDestroyInstance-instance-00629(ERROR / SPEC): msgNum: -1958900200 - Validation Error: [ VUID-vkDestroyInstance-instance-00629 ] Object 0: handle = 0x561b36972d60, type = VK_OBJECT_TYPE_INSTANCE; Object 1: handle = 0x200000000020, type = VK_OBJECT_TYPE_SURFACE_KHR; | MessageID = 0x8b3d8e18 | OBJ ERROR : For VkInstance 0x561b36972d60[], VkSurfaceKHR 0x200000000020[] has not
    been destroyed. The Vulkan spec states: All child objects created using instance must have been destroyed prior to destroying instance (
        Objects: 2
            [0] 0x561b36972d60, type: 1, name: NULL
            [1] 0x200000000020, type: 1000000000, name: NULL
    VUID-vkDestroyInstance-instance-00629(ERROR / SPEC): msgNum: -1958900200 - Validation Error: [ VUID-vkDestroyInstance-instance-00629 ] Object 0: handle = 0x561b36972d60, type = VK_OBJECT_TYPE_INSTANCE; Object 1: handle = 0x660000000066, type = VK_OBJECT_TYPE_SURFACE_KHR; | MessageID = 0x8b3d8e18 | OBJ ERROR : For VkInstance 0x561b36972d60[], VkSurfaceKHR 0x660000000066[] has not
    been destroyed. The Vulkan spec states: All child objects created using instance must have been destroyed prior to destroying instance (
        Objects: 2
            [0] 0x561b36972d60, type: 1, name: NULL
            [1] 0x660000000066, type: 1000000000, name: NULL
    diff: easy good first issue pri: normal type: bug 
    opened by jojolepro 0
  • Documentation links are broken

    Documentation links are broken


    Documentation links seems to be broken:

    • currently failed to build 0.15.x amethyst
    • Most links on webpage (both for master and 0.15) go to 'API Index' page
    • Documentation from index page is only for main package without dependencies which means it only lists submodules but does not include documentation of structs etc.
    • There is which do include them however
    • However 'master' documentation does not cover 0.16 changes
    • I could not find 0.16 book link
    type: maintenance 
    opened by uzytkownik 1
  • Update to winit 0.19

    Update to winit 0.19


    Update 0.15.x to winit 0.19 as it looks like 0.16 is still some time off (issue #2517).


    Winit is currently broken (see issue 1943 and issue 1942 and is not maintained.

    type: maintenance 
    opened by uzytkownik 0
  • 3D Window Inconsistently Freeze on MacOS Big Sur and Catalina

    3D Window Inconsistently Freeze on MacOS Big Sur and Catalina


    When I run my own 3D code or any of amethyst's examples, half the time it runs perfectly fine, the other half of the time it renders the initial frame and then appears to freeze while the following warning starts printing to my terminal on loop:

    [WARN][gfx_backend_metal::window] No frame is available

    The game loop does appear to be running in the background, but it's just unable to update the image in the window for whatever reason. When I resize the window, it renders a new frame when I release the mouse, and then freezes again. I've primarily been messing with this in the debug_lines example, but I've observed the same behaviour in the animation example as well. I haven't tested this in 2D.

    Reproduction Steps

    1. Run any of the 3D examples on OSX with the Metal rendering backend (I'm going to use debug_lines as the example in my reproduction description)
    2. If the window does not freeze on first try, close window and run again until one of the runs freezes

    What You Expected to Happen

    I expect to see the purple "pendulum" swinging, and expect to be able to use WASD and mouse movements to fly the camera around the environment

    What Actually Happened

    The pendulum does not swing and I cannot move the camera. When resizing the window, on releasing the mouse button it will render one new frame with all of the changes that have taken place in the intervening time (pendulum moves, and camera moves to where I would expect from the inputs that I gave it while frozen). After drawing this frame, it returns to a frozen state, while filling my terminal with the No frame is available warning.

    Your Environment

    Operating System: MacOS Big Sur (Also tested this on Catalina and found the same results, with it freezing much more frequently than on Big Sur) Operating System Version: 11.2.3 Version of Amethyst: 0.15.3

    type: bug 
    opened by mrtelecaster 2
  • Update pong tutorial and example for legion

    Update pong tutorial and example for legion


    This PR is for updating the Pong tutorial in the book to reflect changes to the example code.

    Motivation and Context

    The example code for the Pong tutorial has changed, and it no longer matches the code samples in the book. See also the Book task in #2517.

    How Has This Been Tested?

    Currently I've just made sure the example still runs. Not sure how to preview the markdown as it would be rendered in-browser.


    • [x] Acknowledged that by making this pull request I release this code under an MIT/Apache 2.0 dual licensing scheme.
    • [x] My code follows the code style of this project.
    • [x] If my change required a change to the documentation I have updated the documentation accordingly.
    • [x] I have updated the content of the book if this PR would make the book outdated.
    • [ ] I have added tests to cover my changes.
    • [ ] My code is used in an example.
    opened by B-Reif 0
  • What does e7602a22dba669ac0264298474e76ad03b084d65 wrok for?

    What does e7602a22dba669ac0264298474e76ad03b084d65 wrok for?


    I feel weird about this commit "replace Read with read_resource" e7602a22dba669ac0264298474e76ad03b084d65 . For an example, we will get following code at book/src/concept/ after this commit:

    # struct MySystem;
    # impl System for MySystem {
        type SystemData = .read_resource::<EventChannel<MyEvent>>();
    #   fn build(mut self) -> Box<dyn ParallelRunnable> {}
    # }

    But hey, what meas .read_resource::<EventChannel<MyEvent>>()? How can we assign .read_resource::<EventChannel<MyEvent>>() to SystemData? In fact, I can't compile it anyway.


    Additional Information

    type: maintenance 
    opened by NichtsHsu 2
  • Book: Appendix A inconsistent with Pong Tutorial

    Book: Appendix A inconsistent with Pong Tutorial


    In the Amethyst book, the first Appendix references some concepts not described in the Pong tutorial.

    Ideally the Appendix would be describing the Asset adding logic in a way consistent with the Pong tutorial project. This could involve updating either the Appendix or the Project.


    It's difficult to follow the Appendix when it assumes the existence of code that isn't there. It should describe these changes itself, or not reference these concepts.

    Additional Information

    Some additional context around Appendix examples could also help.

    type: maintenance 
    opened by B-Reif 0
  • v0.15.3(Aug 22, 2020)

    0.15.3 is the new 0.15.2

    0.15.2 was published off the wrong commit. As fate would have it, the commit wasn't just trivially wrong, like a typo in a was flat out broken. 🤦‍♂️ As we don't want any accidental use of it, 0.15.2 has been yanked from

    0.15.3 is the new 0.15.2 that actually works. Enjoy!

    Source code(tar.gz)
    Source code(zip)
  • v0.15.2(Aug 22, 2020)


    Please note that after the 0.15.x series Amethyst will switch from specs to legion for the ECS subsystem. This will be a significant breaking change.


    • Internal CI improvements
    • Recommend cargo new pong instead of deprecated amethyst new pong in the book tutorial (#2448)


    • Fix Camera::screen_ray bug introduced in 0.15.1 (#2447)
    Source code(tar.gz)
    Source code(zip)
  • v0.15.1(Aug 18, 2020)


    Please note that after the 0.15.x series Amethyst will switch from specs to legion for the ECS subsystem. This will be a significant breaking change.


    • New optional_graphics example demonstrating running an app with and without graphics (#2282)
    • Return a standalone Dispatcher from GameDataBuilder::build_dispatcher instead of using DataInit to build a GameData (#2294)
    • Added User Interface chapter to The Book (#2311, #2346, #2347, #2368, #2373)
    • Support text alignment in UiButton and UiLabel (#2316)
    • You can now bind multiple inputs to a single axis via Axis::Multiple (#2341)
    • Support layer to be set in UiLabelBuilder (#2358)
    • Support line mode to be set in UiLabelBuilder and UiButtonBuilder (#2358)
    • GltfPrefab now also imports lights from a glTF source (#2362)
    • Added Tiles chapter to The Book (#2391)
    • Added SpriteRender::new for cleaner instantiation (#2395, #2419)
    • amethyst_ui::UiButtonActionRetrigger now derives Default and Clone. (#2388)


    • Removed far plane from perspective projection (#2118)
    • Experimented with CI solutions, selected GitHub Actions. Fixed bors & stalebot. (#2262, #2380, #2382, #2410, #2413, #2414, #2415)
    • amethyst_rendy::shape::Shape::upload takes &ShapeUpload. (#2264)
    • Updated examples, with special attention to the pong example. Improved readmes, updated screenshots, colocated assets with example code (#2248, #2289, #2305, #2201, #2310, #2312, #2349, #2384, [#2396], #2422)
    • UiText now requires 2 more arguments line_mode and align (#2358)
    • Updated the style of The Book (#2355)


    • Fix tile example's MapMovementSystem to look for the correct components (#2209)
    • Fix issue where all TileMaps were rendered with the same transformation. (#2210)
    • Fix the bind method for DynamicVertexBuffer::<B,u32> (#2221)
    • Fix examples which would not run due to incorrect system order. (#2213, #2223, #2239, #2243, #2267)
    • Fix Texture asset debugging representation (#2231)
    • Fix fixed updates being tied to time_scale (#2255)
    • Fix incorrect assets being used when asset handles get reused (#2258)
    • Fix bug causing only one TileMap to be rendered (#2296)
    • Fix UiButtonBuilder so buttons it builds get rendered (#2299)
    • Fix Tint so its color is converted from sRGBA to linear RGBA so shader color is correct. Also update various documentation regarding linear RGBA (#2314, #2398)
    • Fix text alignment in UiText (#2316, #2358)
    • Fix release build path resolution on Windows (#2337)
    • Fix textures sometimes showing up incorrectly or not at all. (#2339)
    Source code(tar.gz)
    Source code(zip)
  • v0.15.0(Mar 23, 2020)


    • Support settings module log levels from a RON file. (#2115)
    • Export the get_parent_pixel_size functions from the ui module. ([#2128)
    • Export the pixel_width and pixel_height methods on the UiTransform. ([#2128)
    • Support UiEvents targeting multiple overlapping entities. (#2138)
    • "storage-event-control" feature enables the specs "storage-event-control" feature. (#2152)


    • Re-export TargetedEvent from amethyst_ui. (#2114)
    • amethyst::ui::Anchor is now Copy. (#2148)
    • amethyst::ui::LineMode is now Copy. (#2148)
    • UiButtonBuilder::build takes in &mut UiButtonBuilderResources. (#2148)
    • Breaking: UiBundle depends on InputBundle being registered with the dispatcher first. (#2151)
    • Re-export UiImageLoadPrefab from amethyst_ui. (#2169, #2181)
    • Don't remove HiddenPropagate components set by users manually. (#2155)


    • "nightly" feature is removed, missing resource panic message includes type name on stable. (#2136)


    • Fixed an issue with states_ui example loading items incorrectly. (#2117)
    • Editable text fields now correctly highlight strings containing spaces. (#2108, #2143)
    • Caret for editable text box is drawn in correct position. (#2146, #2149)
    • Caret for editable text box is positioned correctly on first click. (#2151)
    • Editable text is correctly blurred / unfocused when clicking outside its bounds. (#2091, #2151)
    • amethyst_test crate features now map 1-1 to amethyst features. (#2153)
    Source code(tar.gz)
    Source code(zip)
  • v0.14.0(Jan 30, 2020)


    • Implement Debug for ProgressCounter and ProgressCounterTracker. (#1973)
    • Added a custom render pass Example. (#1904)
    • Add an entry for examples/tiles to the examples readme. (#1978)
    • Added UI states/menu example. #1986
    • Allow user to specify custom completion function in amethyst_test::WaitForLoad. (#1984)
    • Log warning when amethyst_test::WaitForLoad has not completed in 10 seconds. (#1984)
    • Derive Copy and PartialEq for amethyst::renderer::resources::Tint. (#2033)
    • Derive Hash for amethyst::input::{Button, ControllerButton, ScrollDirection}. (#2041)
    • Added Trans::Replace, Trans::NewStack, and Trans::Sequence to the State Machine Transitions. (#2067,#2071)
    • Add rendy/gfx-backend log verbosity through configuration. (#1652) (#2048)
    • Add Draggable component that can be used with UiTransform to make widgets draggable. (#2080)


    • Use a premultiplied view_proj matrix in vertex shaders. (#1964)
    • amethyst_network completely rewritten to provide a new baseline with which to build. ([#1917])
    • Cleaned up tiles example. Added rotation and translation tests, fixed raycast debug box. Added default zoom to PROJECT perspective projection since no one knew to zoom out. (#1974)
    • TileMaps to_tile and to_world now take an Option<&Transform> that allows them to work if the entire map in translated. (#1987,#1991)
    • AmethystApplication::with_fn constraint relaxed from Fn to FnOnce. (#1983)
    • ScreenDimensions now consistently reports window size in physical pixels. ([#1988])
    • Config::load now returns an error or failure rather than silently falling back to the default config. Same is true for the from_config_file methods on RenderToWindow, WindowBundle, and WindowSystem (#1989)
    • Adds get methods to the underlying net::transport resources (#2005)
    • Changed SpriteSheetFormat::import_simple to allow importing grid based SpriteSheets (#2023) Migration Note: Rons need to wrap their content in either Grid() or List()
    • TileMap to_tile doesn't panic in debug mode. It instead return Result<Point,TileOutOfBounds>. (#2020,#2070)
    • Added new Error options for NetworkSimulationEvent.
    • Changed amethyst config directory from $HOME/.amethyst to $HOME/.config/amethyst (#2079)
    • Changed world_to_screen camera transformation to match inverse of the one in screen_ray (#2057)
    • amethyst_input::Axis::Mouse now only has a single radius value. One of the two values was guaranteed to be unused. (#2099)


    • Config::load_no_fallback, use Config::load instead (#1989)


    • Tilemap rotation was incorrect and not transposed. Fixed and uses component rotation. (#1974)
    • Config types no longer require a Default impl (#1989)
    • Fixed Incorrect path for sprite_camera_follow example (#2004)
    • Run System::setup for pausable systems' delegate. (#2029)
    • Fixed an incorrect dimensions being used in Tile Encoders, causing bad lookups in assymetric maps in any Z-level besides 0 (#2017)
    • Fix encoders dimensional cases and optimize storage space (#2059)
    • Fixed off by one issue in to_tile function (#2103)
    • Fix dragging UI widgets that have ScaleMode::Percent (#2111)
    Source code(tar.gz)
    Source code(zip)
  • v0.13.2(Oct 4, 2019)

  • v0.13.1(Oct 3, 2019)

    This release fixes some bugs in amethyst_locale and amethyst_tiles.


    • FlatEncoder added to amethyst_tiles for flat linear encoding which is optimized for space. (#1950)


    • Updated syn, quote, and proc-macro2 to 1.0. (#1952)


    • TileMap was not allocating enough space for to compensate for morton encoding alignment. This means that all tilemap allocation must occur on 2^n boundary aligned on all axis (or x-y axis for Morton2D) (#1950)
    • Add missing re-export for HideHierarchySystemDesc (#1945)
    • TileArgs POD had incorrect format for tile_coordinate argument, caused a crash on metal backend. (#1957)
    Source code(tar.gz)
    Source code(zip)
  • v0.13.0(Sep 26, 2019)

    This release, on top of the changes below, adds the amethyst_tiles crate, which provides utilities that makes handling and drawing stuff in tiles a lot easier! 🎉

    Major breaking changes

    • Systems needing initialization with world resources must go through a SystemDesc intermediate builder. (#1780)


    • 'amethyst_tiles' crate added supporting 2d and 3d tile map rendering with sprites. (#1820)
    • SystemDesc proc macro derive to simplify defining SystemDescs. (#1780)
    • UiButtonData is now exported from amethyst_ui and can be used for custom widgets. (#1859)
    • Add an audio subchapter to the pong chapter. (#1842)
    • Add DispatcherOperation to store dispatcher build logic, which can be executed lazily. (#1870)
    • AmethystApplication takes in SystemDescs through with_system_desc. (#1882)
    • AmethystApplication::with_thread_local_desc takes in RunNowDesc. (#1882)
    • Add NineSlice support to UiImage. (#1896)
    • RenderingBundle for full manual control of the rendering pipeline via a custom GraphCreator. (#1839)
    • CameraOrtho::new takes in CameraOrthoWorldCoordinates, which can be set to custom dimensions. (#1916)
    • Camera::screen_ray method added, returning an appropriate Ray structure (#1918).
    • amethyst_test: InMemorySource and WaitForLoad helpers (#1933).
    • Animations are available with UiTransforms. ([#1935])


    • All -Builder structs in amethyst_ui/ are now called -Data. (#1859)
    • AmethystApplication takes in a System instead of a closure for with_system. (#1882)
    • AmethystApplication::with_thread_local constraint relaxed to RunNow (previously System). (#1882)
    • SystemDesc proc macro supports #[system_desc(event_reader_id)] to register event reader. (#1883)
    • SystemDesc proc macro supports #[system_desc(flagged_storage_reader(Component))]. (#1886)
    • Use SystemDesc derive to generate SystemDesc implementations for common case systems. (#1887)
    • DispatcherOperation stores system name and dependencies as Strings. (#1891)
    • TextureProcessor renamed to TextureProcessorSystem. (#1839)
    • MeshProcessor renamed to MeshProcessorSystem. (#1839)
    • AmethystApplication::with_setup now takes in FnOnce(&mut World) + Send + 'static. (#1912)
    • AmethystApplication::with_setup runs the function before the dispatcher. (#1912)
    • UiImage:PartialTexture & UiImage:Sprite texture coordinates are correct. Clarified types. (#1906,#1919)
    • Camera::screen_to_world renamed Camera::screen_to_world_point and its API has changed to a Point3 (#1918).


    • RenderingBundle is registered last in all examples. (#1881)
    Source code(tar.gz)
    Source code(zip)
  • v0.12.0(Jul 30, 2019)

    New release! :tada:

    Breaking changes

    • Float newtype removed, moved back to f32 primitive for all values (#1747)
    • TextureProcessor and MeshProcessor systems are now separated from RenderingSystem (#1772)


    • Add a feature flag sentry to disable the sentry dependency. (#1804) (#1825)
    • Fixes and renames regression from ([#1442]) added back position_from_world as screen_to_world. Also added world_to_screen. Also adds Transform::copy_local_to_global()' fordebug_assertion` builds (#1733)
    • Add add_rectangle, add_rotated_rectangle, add_box, add_rotated_box, add_circle, add_rotated_circle, add_cylinder, add_rotated_cylinder and add_sphere functions to DebugLinesComponent and the corresponding draw functions to DebugLines, to draw simple shapes with debug lines. (#1766)
    • InputEvent::AxisMoved is sent upon button press / release. (#1512, #1797)
    • UiImage is updated to allow for partial textures and sprites. (#1809,#1811)
    • Added RenderingBundle with a rendering plugin system, making rendering setup easier (#1772)
    • Documentation for Tint component. (#1802)


    • Splitted the /resources directory of amethyst projects into /assets and /config. ([#1806])
    • Rename FPSCounter, FPSCounterBundle, FPSCounterSystem to FpsCounter, FpsCounterBundle, FpsCounterSystem. (#1719)
    • Add Tint component support for sprites. (#1756)
    • Remove remaining <N: RealField> type parameter on GameDataBuilder, add Debug derive to LoggerConfig (#1758)
    • Inverted mouse wheel scroll direction event. Now using winit's standard. (#1767)
    • Add load_from_data_async to Asset Loader. (#1753)
    • Add SerializableFormat marker trait which is now needed to be implemented for all the formats that are supposed to be serialized. (#1720)
    • Make the GltfSceneOptions field of GltfSceneFormat public. (#1791)
    • Updated fluent to version 0.6. (#1800) InputEvent<T> now takes in the BindingTypes as a type parameter. (#1797)
    • Use crossbeam-queue crate directly. (#1822)


    • Fix stack overflow on serializing Box<dyn Format<_>>. (#1720)
    • Fix the steps for enabling the nightly flag in the pong tutorial. (#1805)
    • Fix animation unwrap on missing animated component. (#1773)
    • Fix tangent generation in procedural shapes. (#1807)
    Source code(tar.gz)
    Source code(zip)
  • v0.11.1(Jun 22, 2019)

    This release does not come with any API changes or additions, it only contains documentation fixes and a fix to make build amethyst again.

    Source code(tar.gz)
    Source code(zip)
  • v0.11.0(Jun 16, 2019)


    • Introduce application_dir utility (#1213)
    • Derive Copy, PartialEq, Eq, Serialize, Deserialize for Flipped component. (#1237)
    • A way to change the default Source using set_default_source and with_default_source. (#1256)
    • "How To" guides for using assets and defining custom assets. (#1251)
    • Explanation on how prefabs function in Amethyst. (#1114)
    • amethyst_renderer::Rgba is now a Component that changes the color and transparency of the entity it is attached to. (#1282)
    • AutoFov and AutoFovSystem to adjust horizontal FOV to screen aspect ratio. (#1281)
    • Add icon to DisplayConfig to set a window icon using a path to a file (#1373)
    • Added setting to control gfx_device_gl logging level separately, and set it to Warn by default. (#1404)
    • Add loaded_icon to DisplayConfig to set a window icon programatically (#1405)
    • Added optional feature gates which will reduce compilation times when used. (#1412)
    • Several passes got with_transparency_settings which changes the transparency settings for the pass. (#1419)
    • Add SpriteRenderPrefab. (#1435)
    • Add ScreenSpace component. Draws entities using the screen coordinates. (#1424)
    • Add add_removal_to_entity function. (#1445)
    • Add position_from_screen to Camera. Transforms position from screen space to camera space. (#1442)
    • Add SpriteScenePrefab. Allows load sprites from a grid and add them to the SpriteRenderer. (#1469)
    • Add Widgets resource. Allows keeping track of UI entities and their components and iterating over them. (#1390)
    • AmethystApplication takes in application name using with_app_name(..). (#1499)
    • Add NetEvent::Reliable variant. When added to NetConnection, these events will eventually reach the target. (#1513)
    • "How To" guides for defining state-specific dispatchers. (#1498)
    • Adding support for AMETHYST_NUM_THREADS environment variable to control size of the threads pool used by thread_pool_builder.
    • Add Input variant to StateEvent. (#1478)
    • Support type parameters in EventReader derive. (#1478)
    • Derive Debug, PartialEq, Eq for Source. (#1591)
    • Added events example which demonstrates working even reader and writer in action. (#1538)
    • Implement builder like functionality for AnimationSet and AnimationControlSet (#1568)
    • Add get_mouse_button and is_mouse_button_down utility functions to amethyst_input. (#1582)
    • Add amethyst_input::Axis::MouseWheel (#1642)
    • Add amethyst_input::BindingError::MouseWheelAlreadyBound (#1642)
    • Add amethyst_input::InputHandler::send_frame_begin (#1642)
    • Add amethyst_input::InputHandler::mouse_wheel_value (#1642)
    • Added Float::from_f32 and Float::from_f64 const fns so Float can be used as const. (#1687)
    • Add debug_lines_ortho example. (#1703)


    • #[derive(PrefabData)] now supports enums as well as structs
    • Make frame_limiter::do_sleep calculate the amount of time to sleep instead of calling sleep(0) (#1446)
    • Make application_root_dir return a Result<Path> instead of a String (#1213)
    • Remove unnecessary texture coordinates offset in Sprite::from_pixel_values (#1267)
    • Changed ActiveCamera to have the Option inside. (#1280)
    • AudioBundle::new() no longer exists, as AudioBundle is now a unit type. It also no longer initializes the DjSystem (#1356)
    • Convert everything to use err-derive and amethyst_error (#1365)
    • Removed redundant code in (#1375)
    • Refactored audio initialization to be more bundle-centric (#1388)
    • Changed argument types of exec_removal to allow use of both Read and Write Storages. (#1397)
    • Changed default log level to Info. (#1404)
    • Remove unnecessary mut from AnimationControlSet::has_animation (#1408)
    • Moved amethyst_gltf from development workspace to be like the other amethyst_* subcrates. (#1411)
    • Re-exported amethyst_gltf by amethyst as amethyst::gltf. (#1411)
    • Default::default now returns a pass with transparency enabled for all applicable passes. (#1419)
    • Several passes had a function named with_transparency changed to accept a boolean. (#1419)
    • FrameRateLimitConfig has a new constructor, and its fields are made public. (#1436)
    • Derive Deserialize, Serialize for MaterialPrimitive and SpriteRenderPrimitive, remove extra bounds from AnimatablePrefab and AnimationSetPrefab (#1435)
    • Renamed amethyst_core::specs to amethyst_core::ecs and amethyst_core::nalgebra to amethyst_core::math. (#1410)
    • Simplified some of the conditionals in the Pong tutorial. (#1439)
    • Changed the names of many Transform functions to better reflect their actual function and reduce potential semantic confusion (#1451)
    • ProgressCounter#num_loading() no longer includes failed assets. (#1452)
    • SpriteSheetFormat field renamed from spritesheet_* to texture_*. (#1469)
    • Add new keep_aspect_ratio field to Stretch::XY. (#1480)
    • Renamed Text UI Prefab to Label in preparation for full widget integration in prefabs. (#1390)
    • amethyst_test includes the application name of a failing test. (#1499)
    • amethyst_test returns the panic message of a failed execution. (#1499)
    • Rename NetEvent::Custom variant to NetEvent::Unreliable. (#1513)
    • Updated laminar to 0.2.0. (#1502)
    • Large binary files in examples are now tracked with git-lfs. (#1509)
    • Allowed the user to arrange with laminar. (#1523)
    • Removed NetEvent::Custom and added NetEvent::Packet(NetPacket) (#1523)
    • Fixed update is no longer frame rate dependent ([#1516])
    • Display the syntax error when failing to parse sprite sheets (#1526)
    • Added generic parameter type to Transform to configure floating point precision (then removed). (#1334) (#1584)
    • NetConnection is automatically created when client starts sends data to server. (#1539)
    • User will receive NetEvent::Connected on new connection and NetEvent::Disconnected on disconnect. (#1539)
    • Added a pivot field to UiTransform. (#1571)
    • Fix fly_camera example initial camera and cube position. (#1582)
    • Add to fly_camera example code to release and capture back mouse input, and to show and hide cursor. (#1582)
    • Updated rodio to 0.9. (#1683)

    Rendy support

    • Brand new way to define rendering pipelines.
    • OpenGL support temporarily dropped, Vulkan and Metal support added.
    • Normalized texel coordinates are now in Vulkan convention (top-left 0.0, bottom-right 1.0), mirrored vertically compared to old one.
    • World space is now Y-up consistently for all projections (2D and 3D).
    • Format type no longer has associated Options and is now object-safe. It is expected to carry required options itself.
    • Format now supports tag-based deserialization, it is no longer required to provide specific format to prefab type.
    • Combined input axis/action generics into single type.
    • Material is now an asset. Must be turned into handle before putting on an entity.
    • Removed Flipped component. Use flip_horizontal and flip_vertical sprite property instead.
    • Added Rendy migration guide. (#1626)


    • Removed all NetEvent's because they were not used. (#1539)
    • Removed filter logic, because it didn't do anything, will be added back in a later version (NetFilter, FilterConnected). (#1539)


    • Optimize loading of wavefront obj mesh assets by getting rid of unnecessary allocations. (#1454)
    • Fixed the "json" feature for amethyst_assets. (#1302)
    • Fixed default system font loading to accept uppercase extension ("TTF"). (#1328)
    • Set width and height of Pong Paddles (#1363)
    • Fix omission in PosNormTangTex documentation. (#1371)
    • Fix division by zero in vertex data building (#1481)
    • Fix tuple index generation on PrefabData and EventReader proc macros. (#1501)
    • Avoid segmentation fault on Windows when using AudioBundle in amethyst_test. (#1595, #1599)
    Source code(tar.gz)
    Source code(zip)
  • v0.10.0(Dec 8, 2018)


    • Derive PrefabData for CameraOrtho component (#1188)
    • Partially migrate the project to Rust 2018. Full migration will be completed at some point after 2019-01-31 (#1098)
    • SystemExt::pausable for better ergonomics when pausing systems for specific states (#1146).
    • amethyst_test test framework for ergonomic testing of Amethyst applications (#1000)
    • combinations of buttons triggering actions (#1043)
    • UiPrefab field hidden: bool to hide entities (#1051)
    • PrefabData can now be derived for many situations, see the book for more information (#1035)
    • Support for DirectionalLight and SpotLight in PBM pass. (#1074, #1081)
    • UiWidget variant Custom for custom composited widgets (#1112)
    • AssetLoaderSystemData abstracts resources needed from World to do asset loading (#1090)
    • amethyst_ui::get_default_font supports loading system font from Path. (#1108)
    • Added Callback and CallbackQueue for use in asynchronous contexts. (#1125)
    • Added Trans event queue. Used to trigger state transitions from systems. Also used to trigger multiple state transitions at once. (For example, to Trans::Pop two states.) (#1069)
    • sprite_camera_follow example showing how to use a Camera that has a sprite Parent (#1099)
    • Added capabilities for the DrawFlat2D pass to draw TextureHandles by themselves. Also added a simple example for this. (#1153)
    • Added a Flipped component which allows flipping sprites or images horizontally and vertically. (#1153)
    • Added transform constructor function Transform::new(). (#1187)


    • Minimum Rust version is now 1.31.0 – Rust 2018. (#1224)
    • Transform::look_at renamed to Transform::face_towards and behavior fixed. (#1142)
    • Material animations now directly use Handle<Texture> instead of using indirection. (#1089)
    • SpriteRenderPrimitive::SpriteSheet now takes Handle<SpriteSheet> instead of a u64 ID. (#1089)
    • nalgebra is now the math library used by the engine. (#1066)
    • The amethyst::renderer::Projection::orthographic function has had its parameter order changed to match that of nalgebra (#1066)
    • SpriteSheet now use TextureHandle directly instead of a u64 ID coupled with MaterialTextureSet. (#1117)
    • Updated specs to 0.14 and specs-hierarchy to 0.3. (#1122)
    • Updated winit to 0.18 (see Winit's changelog). (#1131)
    • Updated glutin to 0.19 (see Glutin's changelog). (#1131)
    • Renamed the DrawSprite pass to DrawFlat2D as it now handles both sprites and images without spritesheets. (#1153)
    • BasicScenePrefab deserialization now returns an error on invalid fields. (#1164)
    • Reordered arguments for Transform::set_rotation_euler to match nalgebra's Euler angles. (#1052)
    • Remove lifetimes from SimpleState (#1198)


    • SpriteSheetSet is removed as it is no longer needed. (#1089)
    • MaterialTextureSet is removed as it is no longer needed. (#1117)
    • amethyst::core::Orientation has been removed because of limited use. (#1066)
    • TimedDestroySystem has been split into DestroyAtTimeSystem and DestroyInTimeSystem. (#1129)
    • Reverted [MacOS OpenGL workaround][#972] in favor of the upstream fix in glutin. (#1184)


    • SpriteSheetFormat converts pixel coordinates to texture coordinates on load. (#1181)
    Source code(tar.gz)
    Source code(zip)
  • v0.9.0(Oct 23, 2018)

  • v0.8.0(Aug 6, 2018)

    Huge update. See all changes here:

    The source code is available in the release-0.8 branch, as well as on the master branch for a limited time (until 0.9).

    Source code(tar.gz)
    Source code(zip)
  • v0.7.0(May 19, 2018)

    [0.7.0] - 2018-05


    • Documentation for Animation crate (#631).
    • Support for rendering sprites (#638).
    • Fly Camera (#578).
    • UI Layouts (#591).
    • UI Events (#580).
    • Introduce a generic animation system, with support for both transform and texture animation (#558), (#566), (#567), (#569), (#570), (#611), (#641), (#644)
    • Add transparency support to core passes (#543), (#574), (#584)
    • Add vertex skinning (#545), (#619)
    • Expose a basic visibility ordering system, with the ability to swap in better replacement systems (#595)
    • Audio Output is now added directly rather than as an Option, should now be fetched with Option<Read<'a, Output>> (#679)
    • New nightly feature that enables shreds nightly feature (#689)
    • Transform refactored, and added lots of utility functions (#660)
    • Add new raw mouse events for use with camera rotation (#699)
    • Add UiButtons and UiButtonBuilder (#613)
    • Add arc ball camera (#700)


    • Update dependencies to the newest versions: cgmath, winit, glutin, gfx, gfx_glyph (#527), (#572), (#648)
    • Rodio updated to 0.7 (#676)
    • Refactored bundles to only contain Systems (#675)
    • Refactor to use new specs, major breakage! (#674), (#679), (#683), (#662).
    • Upgrade to winit 1.13.1 (#698)
    • Refactor game data, permit greater extensibility (#691)
    • Disable multisampling on all examples, and add a single example with multisampling on (#671)


    • Asset loading tolerates paths constructed using back slashes (#623).
    • Pong text alignment (#621).
    • Updated book introduction (#588).
    • Renderable runtime crash (#586).
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Jan 6, 2018)

  • v0.5.1(Aug 30, 2017)

  • v0.5.0(Aug 30, 2017)

  • v0.4.3(Jun 3, 2017)


    • Add mouse button events to InputHandler (pull request #181).
    • Built-in application profiler using thread_profiler (pull request #212).
    • Screenshots for all in-repo examples (pull request #213).
    • Pre-commit hook to automate local testing for commits (pull request #228).


    • Changes to (pull requests #206, #226).
    • Update to specs 0.8.1 (pull request #219).


    • Fix deferred rendering in renderable example (pull request #211).
    • Fix AppVeyor curl command (pull request #217).
    • Ignore IntelliJ IDEA project files (pull request #218).
    • Fix InputHandler key press bug (pull request #227).
    • Fix CRLF normalization on extensionless files (pull request #207).
    • Update code to latest template (pull request #215).
    Source code(tar.gz)
    Source code(zip)
  • v0.4.2(Mar 7, 2017)


    • Allow loading configuration files directly from strings.
    • Add #[derive(Default)] for some types in ECS module.
    • Add Ilya Bogdanov, Konstantin Zverev, and Scott Corbeil to


    • Implement some clippy suggestions.
    • Use FnvHasher instead of Rust's default SipHash implementation for better performance.


    • Correct the quick example given in
    • Replace constant paddle width with actual value in Pong example.
    • Minor fix of line numbers in link in
    • Add backticks around word in doc comment within
    • Match Stopwatch behavior to API documentation.
    • Fix AppVeyor build failures due to test failure.
    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Feb 10, 2017)


    • Make have teeth by enabling #[deny(missing_docs)].
    • Add lots of shiny new API documentation.
    • Convert amethyst crate into a workspace.
    • Add Travis and Appveyor badges to Cargo manifests.


    • Bump amethyst to version 0.4.1, amethyst_renderer to 0.4.1, and amethyst_config to 0.2.1.
    • Temporarily disable cargo fmt checking in Travis due to panics.
    • Update to dds 0.4.
    • Update to gfx 0.14, fix breaking changes relating to shaders, PSO, and module layout changes.
    • Update to gfx_device_gl 0.13.
    • Update to gfx_window_glutin 0.14.
    • Update to glutin 0.7.
    • Improve quality of existing doc comments.
    • Implement Deref and DerefMut into glutin::Event for WindowEvent.
    • Re-export contents of engine to top-level and make module private.
    • Shorten certain variable names to help combat rightward drift.
    • Update .travis.yml and appveyor.yml to use cargo test --all instead of specifying explicit crates.
    • Rename 06_assets to 05_assets.
    • Make Git line endings consistent for source and config files throughout the repo.
    • Process entire codebase through cargo fmt.
    • Improve wording and formatting in and in


    • Delete rustfmt.toml from amethyst_renderer.
    • Delete outdated example from amethyst_renderer.
    • Delete redundant extern crate directives outside of
    Source code(tar.gz)
    Source code(zip)
  • v0.4(Feb 7, 2017)


    • Add transform system, transform components, light components, specs resources (camera, input handler, game time counter, screen dimensions, event handling).
    • Make mesh primitives with genmesh.
    • Add basic asset management.
      • Add support for Wavefront OBJ assets with wavefront_obj, and texture loading with imagefmt.
      • Add support for DirectDraw surfaces (.dds files).
    • Moar examples! Oh, and we have a basic pong game too.
    • Fix several unused_variables and unused_mut warnings.
    • Add gitattributes to prevent line-ending conversion for binary files.
    • Add lots of API documentation.


    • Relicense under the terms of both MIT/Apache-2.0.
    • Revamp amethyst_renderer
      • Graphics backend chosen at compile time using features.
      • Add specular lighting, switching propagation -> attenuation.
    • Update instructions for generating a new project using Cargo templates.
    • Scale number of specs threads according to system core count.
    • Improve Travis CI build speeds.
    • Rewrite Stopwatch to be an enum.
    • Update contribution guidelines and change log.
    • Update book to reflect new API changes.
    • Update dependency versions.


    • Remove amethyst_ecs crate in favor of using specs directly.
    • Remove amethyst_context and refactor to greatly improve performance.
    • Remove unused lights from included forward and deferred renderer pipelines.
    • Remove dependency on time crate.
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Sep 7, 2016)


    • Fixed broken API reference link in
    • book: link to API reference broken (issue #86)
    • Master branch no longer builds on beta/nightly Rust (issue #94)
    Source code(tar.gz)
    Source code(zip)
  • v0.3(Mar 31, 2016)


    • Initial version of amethyst_ecs crate (issue #37)
    • Add Gitter webhooks support to Travis (issue #27)


    • Update amethyst_renderer crate slightly (issue #37)
    • Remove script since website repo handles docs now (issue #27)
    • Updated contribution guidelines on submitting code (issue #37)


    • Update broken links for website, wiki, chat, and blog (issue #27)
    Source code(tar.gz)
    Source code(zip)
Amethyst Engine
Data-oriented game engine written in Rust
Amethyst Engine
Rust library to create a Good Game Easily

ggez What is this? ggez is a Rust library to create a Good Game Easily. The current version is 0.6.0-rc0. This is a RELEASE CANDIDATE version, which m

null 2.9k Jun 12, 2021
A refreshingly simple data-driven game engine built in Rust

What is Bevy? Bevy is a refreshingly simple data-driven game engine built in Rust. It is free and open-source forever! WARNING Bevy is still in the ve

Bevy Engine 9.4k Jun 13, 2021
Extensible open world rogue like game with pixel art. Players can explore the wilderness and ruins.

Rusted Ruins Extensible open world rogue like game with pixel art. Players can explore the wilderness and ruins. This game is written in Rust. Screens

T. Okubo 269 Jun 5, 2021
4fun open-source Cave Story reimplementation written in Rust

doukutsu-rs Download latest Nightly builds (Requires being logged in to GitHub) A re-implementation of Cave Story (Doukutsu Monogatari) engine written

null 216 Jun 7, 2021
A personal etude into rust software (RPG<-it's more fun to debug) development: Tales of the Great White Moose

TGWM (Tales of the Great White Moose) NB: Currently compiles. Should compile and run on both 1.28.0 and 1.31.1 if the Cargo.lock files are deleted. A

null 15 Jul 21, 2020
Snake implemented in rust.

rsnake - An implementation of classic snake in rust This game was built using the piston_window window wrapper. Download the game If youre using mac-o

Maximilian Schulke 46 Apr 29, 2021
⬡ Zone of Control is a hexagonal turn-based strategy game written in Rust. [DISCONTINUED]

Zone of Control The project is discontinued Sorry, friends. ZoC is discontinued. See Downloads Preco

Andrey Lesnikóv 335 Jun 15, 2021
This is a simple implementation of the classic snake game in rust

My snake game Looks like this. This is with Roboto Mono Nerd Font. If you use a different font it may look different or distorted. Install rust In ord

Konstantinos Kyriakou 16 Apr 4, 2021
The video game for Fonts of Power. A tabletop roleplaying game made in Rust with Bevy!

The code and rules for Fonts of Power, a tactical TTRPG / video game about exploring magical places. You can follow its development in our Discord ser

null 11 May 18, 2021
A Doom Renderer written in Rust.

Rust Doom A little Doom 1 & 2 Renderer written in Rust. Mostly written while I was learning the language about 2 years ago, so it might not the best e

Cristi Cobzarenco 2k Jun 13, 2021
😠⚔️😈 A minimalistic 2D turn-based tactical game in Rust

Zemeroth is a turn-based hexagonal tactical game written in Rust. Support: News: @ozkriff on twitter | | facebook |

Andrey Lesnikóv 974 Jun 16, 2021
Angolmois BMS player, Rust edition

Angolmois Rust Edition This is a direct, one-to-one translation of Angolmois to Rust programming language. Angolmois is a BM98-like minimalistic music

Kang Seonghoon 88 Mar 10, 2021
An implementation of Sokoban in Rust

sokoban-rs This is an implementation of Sokoban in the Rust Programming Language. An example level: Build Instructions Before building sokoban-rs, you

Sébastien Watteau 123 Jun 3, 2021
A work-in-progress, open-source, multi-player city simulation game.

Citybound is a city building game with a focus on realism, collaborative planning and simulation of microscopic details. It is independently developed

Citybound 6.5k Jun 14, 2021