Syrillian Engine is a Rust-based, real-time, mainly 3D game engine, focusing on flexibility, modularity, and a straightforward, entity-component-driven workflow.
It's designed to be easy, simple and extensible. We aim to provide a robust foundation for building modern 3D applications, rendering pipelines, and visually pleasing gameplay.
We're unique, in the sense that we aim to show how flexible Rust can be as a language. With the milestone to provide a simple, iteration-strong game engine, which people have fun making games with. The goal is to look beyond the boundaries so that users can simply focus on iteration speed. Not fighting a language.
The goal is that even new developers, and people familiar with other languages, have a comfortable dip into the Rust game-dev atmosphere!
Feel free to add your own expositions here :)
Me picking up a shader-animated, physics-enabled cube which is emitting a lightsource From this Example
- Simple "Just get it started" approach. High focus on user-side simplicity, and even fresh rust users should feel welcome.
- Lots of preset (components - prefabs - compatibility)! All boxed up, ready to be dropped in.
- Mesh and Physics, Visual debugging features.
- Game Objects that are builder extensible. Providing a fluid object creation and behavior specification workflow.
- Built in giants:
- Have a Rust Toolchain Installed.
- Have a GPU
-
Clone the repository:
git clone https://github.com/Kek5chen/syrillian.git cd syrillian
-
Build the engine library:
cargo build
-
Try out a demo example, included in the repository:
cargo run --example my-main
-
Dance in circles (optional)
NixOS Development Flakes are provided with the project.
If successful, a window should appear displaying a rendered scene.
We, optionally, provide the SyrillianApp Proc Macro. Usage example:
// make sure to get your imports and dependencies right, (for the dependencies, syrillian, env_logger, log), (for the imports use std::Error, and necessary modules from syrillian)
// The macro will provide you with a simple main runtime and (optional) logging
#[derive(Debug, Default, SyrillianApp)]
struct YourGame;
impl AppState for YourGame {
// will be called once
fn init(&mut self, world: &mut World) -> Result<(), Box<dyn Error>> {
world.set_window_title("Example App");
world.new_camera();
world.spawn(&CubePrefab::default()).at(0, 0, -10); // Spawn Cube at (0, 0, -10).
world.print_objects(); // Print Scene Hierarchy to Console
Ok(())
}
// use the update function if you are making updates to the game state every frame
fn update(&mut self, world: &mut World) -> Result<(), Box<dyn Error>> {
Ok(())
}
// there's also "late_update", and more...
}
It's simple... Really!
The whole feature map has moved into the Issues
Contributions are welcome! If you find a bug or have a feature request:
- Open an issue describing the problem or feature.
- Discuss solutions or improvements.
- Optionally, submit a pull request with your changes. Very welcome!
Ensure your code follows Rust’s formatting and clippy checks:
cargo fmt
cargo clippy
This project has been a big personal gem of mine, and I've poured probably a good 100+ hours of my freetime into it. I am not monetized to work on this, and I do it out of pure personal interest.
Any help, getting this project [better, stable, improved, ..] is very welcome, and I'll make sure to show or explain anything that's not clear. Even feedback or rants on the user-facing API are more than welcome, as I wish to provide patterns that make is as simple as possible to use.
If you need anything: Don't hesitate to join the discord to discuss :)
Syrillian Engine is distributed under the MIT License. See LICENSE for details.
Syrillian Engine ❤️ Building the backbone of your next great 3D experience.