Expand description
§Nano-ECS
A bare-bones macro-based Entity-Component-System
- Maximum 64 components per entity
- Stores components sequentially in same array
- Masks for enabled/disabled components
use nano_ecs::*;
#[derive(Clone)]
pub struct Position(pub f32);
#[derive(Clone)]
pub struct Velocity(pub f32);
ecs!{4: Position, Velocity}
fn main() {
let mut world = World::new();
world.push(Position(0.0));
world.push((Position(0.0), Velocity(0.0)));
let dt = 1.0;
system!(world, |pos: &mut Position, vel: &Velocity| {
pos.0 = pos.0 + vel.0 * dt;
});
}§Design
The ecs! macro generates a World and Component object.
Can be used with any Rust data structure that implements Clone.
The order of declared components is used to assign every component an index. This index is used in the mask per entity and to handle slice memory correctly.
- All components are stored in one array inside
World. - All entities have a slice refering to components
- All entities have a mask that enable/disable components
Macros§
- ecs
- Creates an Entity-Component-System.
- entity
- Accesses a single entity.
- entity_
access - Accesses an entity.
- entity_
ids - Enumerates indices of entities only.
- entity_
unchecked_ access - Accesses an entity, but without checking active mask.
- ind
- Generates
Indimpl forComponent. - mask_
pat - Generates mask pattern based on a set of components.
- mask_
pre - Used internally by other macros.
- push
- Generates
Pushimpl forWorld. - push_
impl - Calls
pushmacro with smaller arguments. - system
- Declares and executes a system.
- system_
ids - Same as
system!, but with entity ids. - tup_
count - Helper macro for counting size of a tuple.
Structs§
- Mask
Storage - Stores masks efficiently and allows fast iteration.