Bump entities to u128 to avoid collisions (#117) (#393)

This commit is contained in:
Boxy 2020-08-31 19:51:28 +01:00 committed by GitHub
parent 8106f770de
commit 57177c9e98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 19 additions and 19 deletions

View File

@ -38,7 +38,7 @@ pub struct Archetype {
types: Vec<TypeInfo>, types: Vec<TypeInfo>,
state: HashMap<TypeId, TypeState>, state: HashMap<TypeId, TypeState>,
len: u32, len: u32,
entities: Box<[u32]>, entities: Box<[u128]>,
// UnsafeCell allows unique references into `data` to be constructed while shared references // UnsafeCell allows unique references into `data` to be constructed while shared references
// containing the `Archetype` exist // containing the `Archetype` exist
data: UnsafeCell<NonNull<u8>>, data: UnsafeCell<NonNull<u8>>,
@ -226,16 +226,16 @@ impl Archetype {
} }
#[allow(missing_docs)] #[allow(missing_docs)]
pub fn iter_entities(&self) -> impl Iterator<Item = &u32> { pub fn iter_entities(&self) -> impl Iterator<Item = &u128> {
self.entities.iter().take(self.len as usize) self.entities.iter().take(self.len as usize)
} }
#[inline] #[inline]
pub(crate) fn entities(&self) -> NonNull<u32> { pub(crate) fn entities(&self) -> NonNull<u128> {
unsafe { NonNull::new_unchecked(self.entities.as_ptr() as *mut _) } unsafe { NonNull::new_unchecked(self.entities.as_ptr() as *mut _) }
} }
pub(crate) fn entity_id(&self, index: u32) -> u32 { pub(crate) fn entity_id(&self, index: u32) -> u128 {
self.entities[index as usize] self.entities[index as usize]
} }
@ -263,7 +263,7 @@ impl Archetype {
/// # Safety /// # Safety
/// Every type must be written immediately after this call /// Every type must be written immediately after this call
pub unsafe fn allocate(&mut self, id: u32) -> u32 { pub unsafe fn allocate(&mut self, id: u128) -> u32 {
if self.len as usize == self.entities.len() { if self.len as usize == self.entities.len() {
self.grow(self.len.max(self.grow_size)); self.grow(self.len.max(self.grow_size));
} }
@ -341,7 +341,7 @@ impl Archetype {
} }
/// Returns the ID of the entity moved into `index`, if any /// Returns the ID of the entity moved into `index`, if any
pub(crate) unsafe fn remove(&mut self, index: u32) -> Option<u32> { pub(crate) unsafe fn remove(&mut self, index: u32) -> Option<u128> {
let last = self.len - 1; let last = self.len - 1;
for ty in &self.types { for ty in &self.types {
let removed = self let removed = self
@ -380,7 +380,7 @@ impl Archetype {
&mut self, &mut self,
index: u32, index: u32,
mut f: impl FnMut(*mut u8, TypeId, usize, bool, bool), mut f: impl FnMut(*mut u8, TypeId, usize, bool, bool),
) -> Option<u32> { ) -> Option<u128> {
let last = self.len - 1; let last = self.len - 1;
for ty in &self.types { for ty in &self.types {
let moved = self let moved = self

View File

@ -9,18 +9,18 @@ use std::error::Error;
/// ///
/// Obtained from `World::spawn`. Can be stored to refer to an entity in the future. /// Obtained from `World::spawn`. Can be stored to refer to an entity in the future.
#[derive(Debug, Clone, Copy, Hash, Eq, Ord, PartialEq, PartialOrd)] #[derive(Debug, Clone, Copy, Hash, Eq, Ord, PartialEq, PartialOrd)]
pub struct Entity(u32); pub struct Entity(u128);
#[allow(clippy::new_without_default)] #[allow(clippy::new_without_default)]
impl Entity { impl Entity {
#[allow(missing_docs)] #[allow(missing_docs)]
pub fn new() -> Self { pub fn new() -> Self {
Self(rand::random::<u32>()) Self(rand::random::<u128>())
} }
#[allow(missing_docs)] #[allow(missing_docs)]
#[inline] #[inline]
pub fn from_id(id: u32) -> Self { pub fn from_id(id: u128) -> Self {
Self(id) Self(id)
} }
@ -30,7 +30,7 @@ impl Entity {
/// with both live and dead entities. Useful for compactly representing entities within a /// with both live and dead entities. Useful for compactly representing entities within a
/// specific snapshot of the world, such as when serializing. /// specific snapshot of the world, such as when serializing.
#[inline] #[inline]
pub fn id(self) -> u32 { pub fn id(self) -> u128 {
self.0 self.0
} }
} }

View File

@ -76,7 +76,7 @@ pub enum Access {
} }
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
pub struct EntityFetch(NonNull<u32>); pub struct EntityFetch(NonNull<u128>);
impl Query for Entity { impl Query for Entity {
type Fetch = EntityFetch; type Fetch = EntityFetch;

View File

@ -8,6 +8,6 @@ impl Serialize for Entity {
where where
S: Serializer, S: Serializer,
{ {
serializer.serialize_u32(self.id()) serializer.serialize_u128(self.id())
} }
} }

View File

@ -94,7 +94,7 @@ impl Resources {
use std::cmp::Ordering; use std::cmp::Ordering;
match index.cmp(&archetype.len()) { match index.cmp(&archetype.len()) {
Ordering::Equal => { Ordering::Equal => {
unsafe { archetype.allocate(index) }; unsafe { archetype.allocate(index as u128) };
} }
Ordering::Greater => panic!("attempted to access index beyond 'current_capacity + 1'"), Ordering::Greater => panic!("attempted to access index beyond 'current_capacity + 1'"),
Ordering::Less => (), Ordering::Less => (),

View File

@ -8,7 +8,7 @@ impl_property!(Entity, serialize_entity, deserialize_entity);
mod private { mod private {
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub(super) struct Entity(pub(super) u32); pub(super) struct Entity(pub(super) u128);
} }
fn serialize_entity(entity: &Entity) -> Serializable { fn serialize_entity(entity: &Entity) -> Serializable {

View File

@ -11,7 +11,7 @@ pub struct Scene {
} }
pub struct Entity { pub struct Entity {
pub entity: u32, pub entity: u128,
pub components: Vec<DynamicProperties>, pub components: Vec<DynamicProperties>,
} }

View File

@ -8,7 +8,7 @@ use thiserror::Error;
use uuid::Uuid; use uuid::Uuid;
struct InstanceInfo { struct InstanceInfo {
entity_map: HashMap<u32, bevy_ecs::Entity>, entity_map: HashMap<u128, bevy_ecs::Entity>,
} }
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]

View File

@ -182,7 +182,7 @@ impl<'a, 'de> Visitor<'de> for SceneEntityVisiter<'a> {
if id.is_some() { if id.is_some() {
return Err(Error::duplicate_field(ENTITY_FIELD_ENTITY)); return Err(Error::duplicate_field(ENTITY_FIELD_ENTITY));
} }
id = Some(map.next_value::<u32>()?); id = Some(map.next_value::<u128>()?);
} }
EntityField::Components => { EntityField::Components => {
if components.is_some() { if components.is_some() {

View File

@ -11,7 +11,7 @@ pub struct Parent(pub Entity);
// ways to handle cases like this. // ways to handle cases like this.
impl FromResources for Parent { impl FromResources for Parent {
fn from_resources(_resources: &bevy_ecs::Resources) -> Self { fn from_resources(_resources: &bevy_ecs::Resources) -> Self {
Parent(Entity::from_id(u32::MAX)) Parent(Entity::from_id(u128::MAX))
} }
} }