From daf0bc236df25c0e9f44bc3e30839c16cda3f638 Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 11 Nov 2024 00:11:22 +0100 Subject: refactor(ecs): use same ID for entities & components --- ecs/src/uid.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 ecs/src/uid.rs (limited to 'ecs/src/uid.rs') diff --git a/ecs/src/uid.rs b/ecs/src/uid.rs new file mode 100644 index 0000000..56d84f9 --- /dev/null +++ b/ecs/src/uid.rs @@ -0,0 +1,42 @@ +use std::mem::transmute; +use std::sync::atomic::{AtomicU32, Ordering}; + +static NEXT: AtomicU32 = AtomicU32::new(1); + +// Bit 0 and 1 for the kind +const KIND_BITS: u64 = 0x03; + +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[repr(u8)] +pub enum Kind +{ + Entity = 2, + Component = 1, +} + +/// Unique entity/component ID. +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] +pub struct Uid +{ + inner: u64, +} + +impl Uid +{ + /// Returns a new unique entity/component ID. + pub fn new_unique(kind: Kind) -> Self + { + let id_part = NEXT.fetch_add(1, Ordering::Relaxed); + + Self { + inner: ((id_part as u64) << 32) | kind as u64, + } + } + + pub fn kind(&self) -> Kind + { + // SAFETY: The kind bits cannot be invalid since they are set using the Kind enum + // in the new_unique function + unsafe { transmute((self.inner & KIND_BITS) as u8) } + } +} -- cgit v1.2.3-18-g5258