This Month in Rust GameDev #26 - September 2021
Welcome to the 26th issue of the Rust GameDev Workgroup’s monthly newsletter. Rust is a systems language pursuing the trifecta: safety, concurrency, and speed. These goals are well-aligned with game development. We hope to build an inviting ecosystem for anyone wishing to use Rust in their development process! Want to get involved? Join the Rust GameDev working group!
You can follow the newsletter creation process by watching the coordination issues. Want something mentioned in the next newsletter? Send us a pull request. Feel free to send PRs about your own projects!
- Rust GameDev Meetup
- Rust Graphics Meetup #1
- Rust GameDev Podcast #6
- Game Updates
- Learning Material Updates
- Engine Updates
- Tooling Updates
- Library Updates
- Popular Workgroup Issues in GitHub
- Requests for Contribution
- Discussions
Rust GameDev Meetup
The ninth Rust Gamedev Meetup happened in September. You can watch the recording of the meetup here on Youtube. The meetups take place on the second Saturday every month via the Rust Gamedev Discord server and are also streamed on Twitch.
Rust Graphics Meetup #1
The Rust Graphics Meetup is an online gathering where rustaceans share technical details of their work related to graphics and compute, not affiliated to any particular stack. The pilot edition has happened on Oct 2nd! Check out the talks:
- gfx-rs Lessons Learned - @kvark, slides.
- rend3 Architecture: Efficient, Customizable Rendering - @cwfitzgerald, slides.
- Blub - Interactive GPU Fluid Solver - @wumpf, slides.
Learn more at the gfx meetup repo. Thanks everyone for tuning in and helping to make this happen!
Rust GameDev Podcast #6
The sixth episode is an interview with Remco and Basz, creators of Mun. Programming language creation is discussed, along with challenges and what future developments are incoming from the Mun project.
Listen and Subscribe from the following platforms: Rust GameDev Podcast (simplecast), Apple Podcasts, Spotify, RSS Feed, Google Podcasts.
Game Updates
BITGUN
BITGUN (Steam, Twitter, Discord) by @LogLogGames is an action roguelike zombie shooter with lots of blood and guns, similar to games like Hotline Miami, Nuclear Throne, and Heat Signature. The game is built using Godot and Rust (via godot-rust).
They recently re-worked the in-game UI using egui with godot-egui, allowing much easier custom widgets such as drag & drop on items between inventory slots.
Discussions: Twitter
Weegames
Weegames is a fast-paced minigame collection. The Windows version of the game has been rewritten to use Macroquad, so now the web and downloadable versions of the game share the same codebase. Development for the web version has moved to the Weegames GitHub repository.
Veloren
Veloren is an open world, open-source voxel RPG inspired by Dwarf Fortress and Cube World.
In September, Veloren hosted its largest release party ever! At peak, 181 players were playing on the server together. You can read about all the changes to 0.11 in the release blog, and be sure to watch the release trailer! During the release party, several devs spoke about the changes, which you can watch here. This release party was the first one to handle the high player load with no issues, and give hope for much larger servers in the future.
Shaderc was replaced with Naga early on in the month. This was the result of over a year of work. Hitboxes are in the process of being overhauled to handle non-cylindrical targets better. Improvements were made to how the cursor selects objects in game. As always, lots of experimental work is being done to the economic system. Cultist raiders were added, which means that raiding parties will now attack nearby settlements. This is a great example of how the realtime simulation is starting to become more visible to players.
September’s full weekly devlogs: “This Week In Veloren…”: #136, #137, #138, #139.
Harvest Hero Origins @ PAX West 2021
Harvest Hero Origins (Discord, Twitter) is an arcade wave defense game by Gemdrop Games, built in Rust on top of Emerald.
Gemdrop Games recently took Harvest Hero Origins to PAX West 2021 and had a very positive response from most of the players! Being able to watch people play the game was extremely valuable, the developers were able to see pain points in UI/UX design and can now fix them without worry. They were also able to see what players find fun about controlling each hero, which helps with the next hero planning in the full release of the game.
Harvest Hero Origins is still planned to release by the end of 2021, please wishlist it on Steam!
Molecoole
Molecoole is a topdown action roguelite where you connect with different atoms to create the strongest Molecoole to defeat the baddies! Molecoole was created by two brothers: Márton and Dániel.
In Molecoole the strongest focus is about making different combos by connecting atoms. The original version was made in Unity for a game jam, but they decided to make an actual game out of it using the Bevy engine. It currently includes their own implementation for 2D animation, collision detection, and particles. In September, one of the main development areas was making the game nicer to play, so they introduced the ezing crate and also implemented slowing the game time. They are using the LDtk editor to make the level sections for the procedural generation.
Circle Race
Circle Race was made by @kuviman for TriJam 135, where you needed to create a game in three hours. The theme was “Circles”. You are a circle, connected with two other “thruster” circles. You play inside a circle, consisting of “tire” circles. Circle around it to find your best circle time!
Made using @kuviman’s own engine geng.
Discussions: /r/rust_gamedev
Monke Pizza
Game made by @kuviman for VimJam 2. The theme for this jam was “Boss” and the limitation was “On The Edge”.
Monke Pizza is an online multiplayer monke pizza restaurant simulator. You are always on the edge of being fired. That is if you work here. Otherwise, you are on the edge of being hired. Because that is how BOSS is bossing.
Made using @kuviman’s own engine geng.
Idu
Idu (Discord) by @logicsoup and @epcc10 is an upcoming game centered around growing realistic plants.
In September, the project previously codenamed “garden” has been renamed to “idu”! In Idu, every plant is continuously formed by the simulation. There are unique responses from a plant’s surroundings and your care. Simulated leaves and shoots grow into plants with a mind of their own. Here is the changelog of Demo Version 4:
- Fixed freezing when help menu was displayed
- Added support for all older Ubuntu versions from 16.04
- Fixed crashing when roots extended over the world border
- Pressing ESC in menus acts as a back button
- Fixed the issue where pruning didn’t work on the first day after loading the game
- Fixed the game choosing integrated GPU even when a discrete one was available
A playable alpha demo has been released and is freely available at Idu’s Discord server’s #demo-download channel!
Antorum Online
Antorum Online is a micro-multiplayer online role-playing game by @dooskington. The game server is written in Rust, and the official client is being developed in Unity.
A few new features and lots of fixes were released to players this month, including item enchantments and the mining skill! Crafting has been expanded as well, and there are a ton of new monsters to fight and gear pieces to create.
rpg-cli v1.0
rpg-cli by @facundoolano is a minimalist computer RPG written in Rust. Its command-line interface can be used as a cd replacement where you randomly encounter enemies as you change directories.
This month, the v1.0 version was released. Some of the updates:
- New magic rings.
- A bunch of new quests including ring-related ones.
- Stat increasing stones.
- Sorcerer enemy class.
Engine Updates
good-web-game
good-web-game has been released on crates.io, together with ggez 0.6.1! ggez is a lightweight cross-platform game framework for making 2D games with minimum friction, with an API inspired by Love2D. good-web-game is a subset of ggez, which is based upon miniquad and can therefore run natively on the web, mobile and of course desktop as well.
good-web-game was originally created to run Zemeroth on the web. However, as Zemeroth switched from using ggez to macroquad the project was discontinued, until recently. In search of a new graphics backend for ggez the ggez team now picked up development again and released a massive update, updating good-web-game for compatability to ggez 0.6, expanding its functionality.
With only a single change in boilerplate code many ggez 0.6 games can now be directly ported to good-web-game. Yet, it’s no drop in replacement for ggez as several key differences remain.
godot-rust
godot-rust (GitHub, Discord, Twitter) is a Rust library that provides bindings for the Godot game engine.
In the last month, a lot of documentation has been added to the book. The new entries in FAQ, Recipes and Game Architecture don’t focus on specific APIs, but put them into a bigger context and highlight typical challenges encountered in practice.
Besides smaller bugfixes, the library itself added support for serde
serialization of core types (#743, thanks to Waridley).
In terms of automation and tooling, September was a very productive month:
-
Translation of Godot’s documentation based on
[bbcode]
to RustDoc with intra-doc links, making Godot APIs much more readable and discoverable. -
Refactoring of GitHub Actions CI, allowing quick and precise feedback for contributors.
-
Automation of latest documentation, now hosted under godot-rust.github.io/docs.
As the godot-rust community keeps growing, the project can now be found on Twitter with the GodotRust handle.
Emerald
Emerald by @bombfuse is a 2D game engine focused on being super portable and easy-to-use.
Currently supported platforms are: Windows, Linux (WIP gamepad support), macOS (WIP gamepad support), Web, Android (WIP audio, gamepad Support), GameShell, and even WearOS!
Recently added features include:
- Texture hot reloading (sound hot reloading is coming soon!).
- Cross-platform file saving/loading. This is essential for games, basically allows the user to save their files to the platform specific save directory.
Emerald has slowly been growing, both in contributor size and feature sets recently. If any of this interests you and you’d like to contribute, feel free to grab a task, fork and PR!
Starframe
Starframe by @molentum is a work-in-progress game engine for physics-y sidescrolling 2D games.
This month, a lot of work was done on optimizing the physics engine. Most importantly, spatial partitioning was added to speed up collision detection. Also notably, a graph algorithm was implemented to divide the world into disjoint islands, enabling some parallelism and skipping of computations.
Starframe’s physics is now very close to game-ready, and it no longer makes sense to work on the engine without a concrete project to use it. Thus, work has begun on a platformer based around connecting things with ropes. More details to be shown soonish!
Arcana
Arcana is ECS based game engine focused on simplicity and performance.
It recently got huge progress towards multiplayer support. Traditional client-server systems were added and used in the “Tanks” example.
Clients send only command queue to the server and server sends game world updates to the clients. Engine supports multiple players per client. For example, players may be added for each active input device.
To allow wide variety of genres player is not attached to one specific entity and may control many. In RTS player may control all their units and will send commands for each one.
Gameplay system that consumes commands doesn’t even need to be aware of netcode. Either way, it just drains command queue of an entity and utilizes them. That system must not be run on clients at all.
Arcana is very early work-in-progress and may not always work out-of-the-box atm, but stability improvements are expected next month.
rg3d v0.23
rg3d (Discord, Twitter, Patreon) is a game engine that aims to be easy to use and provide a large set of out-of-the-box features. This month v0.23 was released. Some of the updates:
- Physically based rendering (PBR) with metallic workflow.
- High dynamic range (HDR) rendering pipeline & textures.
- Custom shaders and materials.
- Emission maps - allows you to define glowing parts using emission map.
- Gamma correction, manual/auto exposure, and color grading.
- Lots of the editor’s improvements: material editor, unified material pipeline for terrains, improved inspector, etc.
Check out the blog post or the feature highlights video for more info.
Discussions: /r/rust
Rust RPG Toolkit
Rust RPG Toolkit by @olefasting is an engine for creating highly customizable and user modable action 2D action RPG’s using Rust amd JSON.
The project started out as a part of the Capstone game but was separated as it grew in scope. It uses JSON files for most of its game data and resources specification so that games can be created with very little interaction with the Rust code. This has the benefit of making the end product very easy to modify, both for non-developers involved in the development process, and by end users. Modification can be done either by modifying a game’s data files directly, or by creating user modules, which are supported out-of-the-box.
Note that this is in early and very heavy development: the API is subject to constant change, as it has newly transitioned from being a game project to a library.
Discussions: /r/rust_gamedev
Learning Material Updates
GDC: Rust for Game Tooling by Dan Olson
Dan Olson gave a talk at the Game Developers Conference in July about using Rust for game tooling. The talk describes how Rust is being integrated at Treyarch. Dan gives a “sales pitch” about several Rust benefits, and goes over several case studies about where it is used. It makes appearances in the Treyarch image packer, and is used in 3 major tools, and around 20 smaller one-off tools. Around 120k lines of Rust code have been written for the projects.
If you have a GDC Vault account, you can watch the video. If you don’t, you can still read the slides.
Learn Wgpu Updated: No More Swap Chains!
As part of the update to 0.10, the wgpu team removed the SwapChain
from the
API. The Surface
will now be used to retrieve textures to render to wrapped
in SurfaceTexture
s. You configure the Surface
in a similar way to how you
would configure the SwapChain
, except the struct is now called
SurfaceConfiguration
instead of SwapChainDescriptor
.
If you want to know more, you can check the tutorial’s news page.
Tooling Updates
Borderlands 3 Save Editor
The Borderlands 3 Save Editor by ZakisM is a tool to help you modify your Borderlands 3 Saves and Profiles written using Iced. Currently, it runs on Windows, Mac OS and Linux. It supports modifying PC saves as well as decrypted PS4 saves (and converting between them).
Library Updates
wgpu
wgpu is a cross-platform, safe, pure-rust graphics API that runs natively on Vulkan, Metal, D3D12, D3D11, and OpenGLES; and on top of WebGPU on wasm.
wgpu has set up the infrastructure to run WebGPU proper tests on its CI, via Deno. This will ensure correctness down the road when we reach a decent level of coverage. Read more on gfx-rs blog.
Aside from that, wgpu team has been pumping out patches. In fact, wgpu-0.10 is easily the most patched release of all!
Matchbox
Matchbox by @jkhelsing is a new peer-to-peer networking project for establishing unreliable, unordered connections between peers on the internet. The goal is to enable low-latency multiplayer games written in Rust WASM.
Matchbox consists of:
- A tiny signaling server,
matchbox_server
, which acts as a rendezvous point. It helps peers discover each other and deal with NAT traversal in order to establish more direct ways of communication. - A crate,
matchbox_socket
, which handles connecting to a signalling server and establishing a WebRTC data channel between each connected peer. - A demo/template project using Bevy and GGRS to implement a web game with peer-to-peer rollback netcode. A live version is hosted here.
More info is available in the repository and introductory blog post.
Sparsey
Sparsey by @LechintanTudor is a new sparse set-based Entity Component System (ECS) with component storage grouping, granular component change detection, fallible systems and beautiful syntax.
The goal of Sparsey is to provide a sparse set-based ECS which fully takes advantage of its core data structure. An example of this is component storage grouping, a feature which allows getting the best performance possible when iterating over queries that match certain patterns described by the user, at the cost of a performance penalty when inserting or removing components from these storages.
To get started with Sparsey, check out the Sparsey Cheat Sheet and the examples on GitHub!
bevy_verlet
bevy_verlet is a lib for projects using Bevy Engine
providing a plugin to use verlet Integration
physics. Very useful for Cloth simulation and joints, and less expensive than
complex physics engine, it is a nice addition to 2D or 3D projects. Making good
use of the Entity-Component-System architecture of the bevy engine, any entity
can become a VerletPoint
and have physics applied to it.
The crate also provides sticks which constrains the points in order to create strings or cloth. With its modularity, you may customize the physics precision (iterations), the gravity, and the physics time step to use.
Not yet available on crates.io, the lib will be released after a few missing features are provided:
- Primitive collision
- Object batching (optimization)
- Global documentation
You may contact the author on Twitter @ManevilleF or join the discussion.
hecs
hecs is a fast, lightweight, and unopinionated archetypal ECS library.
Version 0.6 introduces PreparedQuery
, allowing query set-up cost to be
amortized across multiple invocations. EntityRef
’s API was expanded to include
a single-entity query
method, and now exposes the referenced entity’s
handle. Finally, World::spawn_batch
and reserve
were optimized for better
performance when called repeatedly.
ktx2
A revamped and refactored version of @F3kilo’s ktx2-reader, this serves as a parsing library for the texture container format of ktx2. This format allows you to store textures in formats that GPU apis directly accept, without decoding costs. For more information, read the docs.
ktx2 writing support will come a future release.
rend3
rend3 is a new 3D rendering library that focuses on having an easy to user interface without sacrificing performance or customizability. It comes with PBR materials and render routine out of the box and utilizes GPU culling to enable incredible performance with such a simple API.
There’re many fun things in the pipeline including a full custom shader system, both cpu and gpu side optimization, and more rendering features.
The v0.1 version was published on crates.io (docs and examples) and v0.2 is going to be coming out very soon.
imgui-rs v0.8
imgui-rs is the Rust bindings for the Dear ImGui framework, allowing users to easily build up complex debug widgets and tools.
In v0.8.0, the library’s API continued its overhaul to both be more
similar to the C++ API while feeling like native Rust. Specifically,
the odious im_str!
macro was deprecated – using inline strings directly
(and anything AsRef<str>
) simply works. Most functions also make extensive
use of RAII-style drop tokens to track begin
/end
calls.
Lastly, it was updated to use current Dear ImGui v1.84, and bound to
the new APIs, including the new Tables API.
Emergent AI
Emergent AI by @PsichiX is a new crate designed to provide modern AI solutions for games written in Rust. Its highly modularized and hierarchical architecture allows users to express a wide range of AI behaviors complexity, from small scale, to big scale, allowing user to pick proper solution to each AI problem using smaller building blocks.
Along with the library, there is an “Emergent AI - Smart agents and events for games” book being written with goal to explain in-depth to readers how modern AI systems works and showing step by step process of how one could build them on their own.
hexagonal_pathfinding_astar
_______
/ E \
_______/ (4,3) \
/ \ W:3 /
_______/ (3,2) \_______/
/ \ W:1 /
/ (2,2) \_______/
\ W:3 /
\_______/
/ \
_______/ (2,1) \
/ \ W:3 /
_______/ (1,0) \_______/
/ S \ W:4 /
/ (0,0) \_______/
\ W:6 /
\_______/
hexagonal_pathfinding_astar is an implementation of the A-Star pathfinding algorithm tailored for traversing a bespoke collection of weighted hexagons. It’s intended to calculate the most optimal path to a target hexagon where you’re traversing from the centre of one hexagon to the next along a line orthogonal to a hexagon edge. Check out the project’s README for more info.
pixels v0.6
pixels by @parasyte is a tiny hardware-accelerated pixel frame buffer based on wgpu. It gives you a pixel buffer and you can poke colors into it (on the CPU side). The buffer is uploaded to the GPU as a texture, and all scaling and clipping is handled by a default shader. For additional control, you can add your own custom shaders for pre- and post-processing.
The v0.6 release adds support for wgpu 0.10 which is a huge improvement. The only breaking changes are reexports and an error variant name change. In most cases, this upgrade is a drop-in replacement.
Discussions: /r/rust
KAS GUI v0.10
KAS by @dhardy is a general-purpose retained UI toolkit. This month v0.10 was released:
- KAS now supports dynamic linking, allowing faster builds. Additionally using a faster linker (lld or mold) allows 6x improvement on re-build speed for the Gallery example.
- Keyboard navigation has been revised to match standard desktop GUIs.
- Themes have been improved, with (better) shadows under pop-up menus and (on one theme) under buttons.
- Crates have been reshuffled so that now (most) users only depend on kas.
- OpenGL on Linux is supported (mostly thanks to WGPU improvements).
- KAS-text now exposes its
fontdb::Database
, allowing text in SVGs.
Also, the author notes that this may be the last release of KAS because of the lack of interest to the project.
Discussions: /r/rust
Popular Workgroup Issues in GitHub
Discussions
Requests for Contribution
- Graphite is looking for contributors to help reach the 0.1 Alpha release and are participating as a Hacktoberfest project.
- winit’s “difficulty: easy” issues.
- Backroll-rs, a new networking library.
- Embark’s open issues (embark.rs).
- wgpu’s “help wanted” issues.
- luminance’s “low hanging fruit” issues.
- ggez’s “good first issue” issues.
- Veloren’s “beginner” issues.
- Amethyst’s “good first issue” issues.
- A/B Street’s “good first issue” issues.
- Mun’s “good first issue” issues.
- SIMple Mechanic’s good first issues.
- Bevy’s “good first issue” issues.
That’s all news for today, thanks for reading!
Want something mentioned in the next newsletter? Send us a pull request.
Also, subscribe to @rust_gamedev on Twitter or /r/rust_gamedev subreddit if you want to receive fresh news!
Discuss this post on: /r/rust_gamedev, Twitter, Discord.