Allow searching for entities within the manager
This commit is contained in:
parent
c2166b5582
commit
f1e31886a3
|
@ -30,6 +30,11 @@ name = "bitflags"
|
|||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "0.4.2"
|
||||
|
@ -98,7 +103,7 @@ name = "cookie"
|
|||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"openssl 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -305,13 +310,13 @@ dependencies = [
|
|||
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mime 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solicit 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicase 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -484,20 +489,20 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "openssl"
|
||||
version = "0.7.6"
|
||||
version = "0.7.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys-extras 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys-extras 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.7.6"
|
||||
version = "0.7.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gdi32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -509,12 +514,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "openssl-sys-extras"
|
||||
version = "0.7.6"
|
||||
version = "0.7.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -647,7 +652,7 @@ name = "steven_openssl"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -695,7 +700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "1.3.0"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -45,12 +45,35 @@ pub struct Key<T> {
|
|||
_t: PhantomData<T>,
|
||||
}
|
||||
|
||||
/// Used to search for entities with the requested components.
|
||||
pub struct Filter {
|
||||
bits: BSet,
|
||||
}
|
||||
|
||||
impl Filter {
|
||||
/// Creates an empty filter which matches everything
|
||||
pub fn new() -> Filter {
|
||||
Filter {
|
||||
bits: BSet::new(0),
|
||||
}
|
||||
}
|
||||
|
||||
/// Adds the component to the filter.
|
||||
pub fn with<T>(mut self, key: Key<T>) -> Self {
|
||||
if self.bits.capacity() <= key.id {
|
||||
self.bits.resize(key.id + 1);
|
||||
}
|
||||
self.bits.set(key.id, true);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl Manager {
|
||||
/// Creates a new manager.
|
||||
pub fn new() -> Manager {
|
||||
Manager {
|
||||
num_components: 0,
|
||||
entities: vec![],
|
||||
entities: vec![(Some(BSet::new(0)), 0)], // Has the world entity pre-defined
|
||||
free_entities: vec![],
|
||||
components: vec![],
|
||||
|
||||
|
@ -58,6 +81,31 @@ impl Manager {
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns the world entity. This should never be removed.
|
||||
pub fn get_world(&self) -> Entity {
|
||||
Entity {
|
||||
id: 0,
|
||||
generation: 0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns all entities matching the filter
|
||||
pub fn find(&self, filter: &Filter) -> Vec<Entity> {
|
||||
let mut ret = vec![];
|
||||
// Skip the world entity.
|
||||
for (i, &(ref set, gen)) in self.entities[1..].iter().enumerate() {
|
||||
if let Some(set) = set.as_ref() {
|
||||
if set.includes_set(&filter.bits) {
|
||||
ret.push(Entity {
|
||||
id: i + 1,
|
||||
generation: gen,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
/// Allocates a new entity without any components.
|
||||
pub fn create_entity(&mut self) -> Entity {
|
||||
if let Some(id) = self.free_entities.pop() {
|
||||
|
|
|
@ -41,6 +41,10 @@ impl Set {
|
|||
self.data.resize((new_size + 63) / 64, 0);
|
||||
}
|
||||
|
||||
pub fn capacity(&self) -> usize {
|
||||
self.data.len() * 64
|
||||
}
|
||||
|
||||
pub fn set(&mut self, i: usize, v: bool) {
|
||||
if v {
|
||||
self.data[i >> 6] |= 1 << (i & 0x3F)
|
||||
|
@ -54,7 +58,6 @@ impl Set {
|
|||
}
|
||||
|
||||
pub fn includes_set(&self, other: &Set) -> bool {
|
||||
debug_assert!(self.data.len() == other.data.len());
|
||||
for (a, b) in self.data.iter().zip(&other.data) {
|
||||
if a & b != *b {
|
||||
return false;
|
||||
|
|
Loading…
Reference in New Issue