raylib-rs is a Rust binding for raylib 3.5. It currently targets the stable Rust toolchain, version 1.31 or higher.
Please checkout the showcase directory to find usage examples!
Though this binding tries to stay close to the simple C API, it makes some changes to be more idiomatic for Rust.
- Resources are automatically cleaned up when they go out of scope (or when
std::mem::dropis called). This is essentially RAII. This means that "Unload" functions are not exposed (and not necessary unless you obtain aWeakresource using make_weak()). - Most of the Raylib API is exposed through
RaylibHandle, which is for enforcing that Raylib is only initialized once, and for making sure the window is closed properly. RaylibHandle has no size and goes away at compile time. Because of mutability rules, Raylib-rs is thread safe! - A
RaylibHandleandRaylibThreadare obtained throughraylib::init_window(...)or through the newerinit()function which will allow you tobuildup some window options before initialization (replacesset_config_flags). RaylibThread should not be sent to any other threads, or used in a any syncronization primitives (Mutex, Arc) etc. - Manually closing the window is unnecessary, because
CloseWindowis automatically called whenRaylibHandlegoes out of scope. Model::set_material,Material::set_shader, andMaterialMap::set_texturemethods were added since one cannot set the fields directly. Also enforces correct ownership semantics.Font::from_data,Font::set_chars, andFont::set_texturemethods were added to create aFontfrom loadedCharInfodata.SubTextandFormatTextare omitted, and are instead covered by Rust's string slicing and Rust'sformat!macro, respectively.
Disclaimer: I created this binding as a way to learn Rust. There may be some things I can do better, or make more ergonomic for users. Feel free to make suggestions!
| API | Windows | Linux | macOS | Web | Android | Raspberry Pi |
|---|---|---|---|---|---|---|
| core | ✔️ | ✔️ | ✔️ | 🚧 | ||
| rgui | ✔️ | ✔️ | ✔️ | |||
| physac | 🚧 | 🚧 | 🚧 | |||
| rlgl | ❌ | ✔️ | ✔️ |
Requires glfw, cmake, and curl. Tips on making things work smoothly on all platforms is appreciated. Follow instructions for building raylib for your platform here
- Add the dependency to your
Cargo.toml:
[dependencies]
raylib = "3.5"- Start coding!
use raylib::prelude::*;
fn main() {
let (mut rl, thread) = raylib::init()
.size(640, 480)
.title("Hello, World")
.build();
while !rl.window_should_close() {
let mut d = rl.begin_drawing(&thread);
d.clear_background(Color::WHITE);
d.draw_text("Hello, world!", 12, 12, 20, Color::BLACK);
}
}- Structs holding resources have RAII/move semantics, including:
Image,Texture2D,RenderTexture2D,Font,Mesh,Shader,Material,Model,Wave,Sound,Music, andAudioStream. - Functions dealing with string data take in
&strand/or return an ownedString, for the sake of safety. The exception to this is the gui draw functions which take &CStr to avoid per frame allocations. Therstr!macro helps make this easy. - In C,
LoadFontDatareturns a pointer to a heap-allocated array ofCharInfostructs. In this Rust binding, said array is copied into an ownedVec<CharInfo>, the original data is freed, and the owned Vec is returned. - In C,
GetDroppedFilesreturns a pointer to an array of strings owned by raylib. Again, for safety and also ease of use, this binding copies said array into aVec<String>which is returned to the caller. - I've tried to make linking automatic, though I've only tested on Windows 10, Ubuntu, and MacOS 15. Other platforms may have other considerations.
- In addition to the base library, there is also a convenient
easemodule which contains various interpolation/easing functions ported from raylib'seasings.h, as well as aTweenstruct to assist in using these functions. - Equivalent math and vector operations, ported from
raymath.h, areimpled on the various Vector and Matrix types. Operator overloading is used for more intuitive design.
The raylib-test crate tests the bindings by opening a window, and checking the results of various functions. It requires nightly to use.
- Port raylib examples over to Rust.
- More tests.
- More platform testing.
- Even more testing.
- Physac port?
All contributions are welcome. Chat about raylib on discord
