Crates.io | flecs_ecs |
lib.rs | flecs_ecs |
version | 0.1.3 |
source | src |
created_at | 2023-10-22 14:22:01.318419 |
updated_at | 2024-07-19 07:22:27.049535 |
description | Rust API for the C/CPP flecs ECS library |
homepage | |
repository | https://github.com/Indra-db/Flecs-Rust |
max_upload_size | |
id | 1010609 |
size | 1,558,550 |
The Rust API is a wrapper around the Flecs C API. The API is designed to offer Rust developers an intuitive and streamlined interface to harness the full potential of Flecs.
It's based on V4 flecs release, blogpost can be found here.
Flecs is a fast and lightweight Entity Component System that lets you build games and simulations with millions of entities (join the Discord!). Here are some of the framework's highlights:
Add the following to your Cargo.toml
:
[dependencies]
flecs_ecs = "0.1.1"
and start hacking away!
Make sure to check out the Rust docs (improvements coming soon), Flecs docs, and the 70+ examples in the examples directory.
For an example integration of Flecs with the following crates:
WGPU
for renderingwinit
for windowingvello
for rasterizationparley
for textcheck out the demo here
The project is in the alpha release stage where the core functionality and some addons of Flecs have been ported and are available to use today. While there has been a lot of thought put into the current API, it's still in an experimental phase. The project aims to hit stable when all the soundness/safety issues are resolved and the API has been finalized with all of Flecs functionality. We encourage you to explore, test, and provide feedback, but please be aware of potential bugs and breaking changes as we continue to refine the API and add new features.
This library was made publicly available on the release date of Flecs V4 release.
One important safety factor that has yet to be addressed is having multiple aliases to the same component. This is a known issue and is being worked on. It will be addressed through a table column lock mechanism.
From initial benchmarks and tests, the Rust API is on par with C-level performance, except for where overhead was introduced to make the API safe to use in Rust land (e.g. get
performance). However, performance improvements are planned to be made in the future.
For detailed feature progress, please visit the issues page.
The plan is to match feature parity of the C++ API, starting with the core library (done!) while also being fully documented and tested and addressing any safety issues that may arise. The project aims to provide a safe, idiomatic, and efficient Rust API for Flecs, while also being a good citizen in the Rust ecosystem.
If you're excited about this project and would like to contribute, or if you've found any bugs, please feel free to raise an issue or submit a pull request. We'd love to have your involvement!
MIT license, matching Flecs.
use flecs_ecs::prelude::*;
#[derive(Debug, Component)]
pub struct Position {
pub x: f32,
pub y: f32,
}
#[derive(Debug, Component)]
pub struct Velocity {
pub x: f32,
pub y: f32,
}
#[derive(Component)]
pub struct Eats;
#[derive(Component)]
pub struct Apples;
fn main() {
// Create a new world
let world = World::new();
// Register system
world
.system::<(&mut Position, &Velocity)>()
.each(|(pos, vel)| {
pos.x += vel.x;
pos.y += vel.y;
});
// Create an entity with name Bob, add Position and food preference
let bob = world
.entity_named("Bob")
.set(Position { x: 0.0, y: 0.0 })
.set(Velocity { x: 1.0, y: 2.0 })
.add::<(Eats, Apples)>();
// Show us what you got
println!("{}'s got [{:?}]", bob.name(), bob.archetype());
// Run systems twice. Usually this function is called once per frame
world.progress();
world.progress();
bob.get::<&Position>(|pos| {
// See if Bob has moved (he has)
println!("{}'s position: {:?}", bob.name(), pos);
});
// Output:
// Bob's got [Position, Velocity, (Identifier,Name), (Eats,Apples)]
// Bob's position: Position { x: 2.0, y: 4.0 }
}
Flecs isn't written natively in Rust, it's written in C, but it's a mature and feature-rich ECS library that has been used in AAA games and other commercial software. It's fast, lightweight, and has a lot of features that other ECS libraries don't have.
Some of the features that make Flecs stand out are:
world.system::<&A>()
.with::<B>()
.each(|| { });
system!(world, &A, B)
.each(|| { });
world.set(GameTime { delta_time: 0.0 });
world.system::<&GameTime>()
.term_at(0)
.singleton()
.each(|| { });
system!(world, &R($))
.each(|| { });
This list contains projects that are not under NDA.
If you want to showcase your project, feel free to open a PR to add it to the list.
A big shoutout to Sander Mertens for creating such a wonderful library and the pre-alpha testers who contributed to Flecs Rust API, especially James, Bruce, and Andrew.