6 releases

new 0.0.5 May 11, 2024
0.0.4 May 8, 2024
0.0.3 Apr 23, 2024
0.0.0 Oct 9, 2021

#456 in Game dev

Download history 1/week @ 2024-02-19 10/week @ 2024-02-26 15/week @ 2024-04-01 383/week @ 2024-04-22 2/week @ 2024-04-29 276/week @ 2024-05-06

661 downloads per month

MPL-2.0 license

56KB
551 lines

Xanadu

GitHub Actions Workflow Status Crates.io Version docs.rs

A toy ECS library; works on Windows, macOS, Linux and WebAssembly.

Benchmark

Benchmark

Usage

use xanadu::ecs::{Mut, World};

#[repr(C)]
#[derive(Debug, Default, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable, PartialEq)]
pub struct Position {
    pub x: f64,
    pub y: f64,
    pub z: f64,
}

fn main() {
    let mut world = World::builder().register_component::<Position>().build();
    for i in 0..5 {
        let entity = world.new_entity();
        world.attach_component(
            entity,
            Position {
                x: i as f64,
                y: i as f64,
                z: i as f64,
            },
        );
    }

    world.execute::<'_, Position, _>(&print_system);
    world.execute::<'_, Mut<Position>, _>(&shuffle_system);
    world.execute::<'_, Mut<Position>, _>(&increment_system);
    world.execute::<'_, Mut<Position>, _>(&shuffle_system);
    println!("Shuffled and incremented");
    world.execute::<'_, Position, _>(&print_system);
}

fn print_system(pos: &Position) {
    println!("Pos: [{}, {}, {}]", pos.x, pos.y, pos.z);
}

fn shuffle_system(pos: &mut Position) {
    let tmp = pos.x;
    pos.x = pos.y;
    pos.y = pos.z;
    pos.z = tmp;
}

fn increment_system(pos: &mut Position) {
    pos.x += 1.0;
    pos.y += 2.0;
    pos.z += 3.0;
}

Tests

cargo t --workspace
wasm-pack test --node
wasm-pack test --firefox --headless -- --features test_in_browser

Dependencies

~0.5–1MB
~21K SLoC