Macro gecs::ecs_component_id
source · macro_rules! ecs_component_id {
{...} => { ... };
}Expand description
Returns the compile-time ID of a given component in its archetype.
ecs_component_id!(Component); // Can be used in a query body
ecs_component_id!(Component, Archetype); // If used outside of a queryThe ecs_component_id! returns the compile-time ID (as a u8) of a given component in
an archetype. If used in a query, the archetype parameter defaults to MatchedArchetype,
which is the type alias automatically set for each query referencing the current matched
archetype for the current execution of the query body.
This is a const operation, and can be used to parameterize const generics.
By default, component IDs are assigned sequentially starting at 0, with a maximum of
255. Component IDs can also be manually set using the #[component_id(N)] attribute
on elements of the component list in an ecs_archetype! declaration within ecs_world!.
Like enum discriminants, components without this attribute will count up from the last
manually set ID.
Example
use gecs::prelude::*;
pub struct CompA;
pub struct CompB;
pub struct CompC;
ecs_world! {
ecs_archetype!(
ArchFoo,
5,
CompA, // = 0
CompC, // = 1
);
ecs_archetype!(
ArchBar,
5,
#[component_id(6)]
CompA, // = 6
CompB, // = 7 (Implicit)
CompC, // = 8 (Implicit)
);
ecs_archetype!(
ArchBaz,
5,
CompA, // = 0 (Implicit)
CompB, // = 1 (Implicit)
#[component_id(200)]
CompC, // = 200
);
}
fn main() {
let mut world = World::default();
let entity_a = world.archetype_mut::<ArchFoo>().push((CompA, CompC));
let entity_b = world.archetype_mut::<ArchBar>().push((CompA, CompB, CompC));
let entity_c = world.archetype_mut::<ArchBaz>().push((CompA, CompB, CompC));
ecs_find!(world, entity_a, |_: &CompC| {
assert_eq!(ecs_component_id!(CompC), 1);
});
ecs_find!(world, entity_b, |_: &CompC| {
assert_eq!(ecs_component_id!(CompC), 8);
});
ecs_find!(world, entity_c, |_: &CompC| {
assert_eq!(ecs_component_id!(CompC), 200);
});
assert_eq!(ecs_component_id!(CompC, ArchFoo), 1);
assert_eq!(ecs_component_id!(CompC, ArchBar), 8);
assert_eq!(ecs_component_id!(CompC, ArchBaz), 200);
}