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"
|
version = "0.3.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
version = "0.4.2"
|
version = "0.4.2"
|
||||||
|
@ -98,7 +103,7 @@ name = "cookie"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"url 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -484,20 +489,20 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.7.6"
|
version = "0.7.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
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)",
|
"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)",
|
"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)",
|
"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)",
|
||||||
"openssl-sys-extras 0.7.6 (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]]
|
[[package]]
|
||||||
name = "openssl-sys"
|
name = "openssl-sys"
|
||||||
version = "0.7.6"
|
version = "0.7.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gdi32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdi32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -509,12 +514,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-sys-extras"
|
name = "openssl-sys-extras"
|
||||||
version = "0.7.6"
|
version = "0.7.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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)",
|
"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]]
|
[[package]]
|
||||||
|
@ -647,7 +652,7 @@ name = "steven_openssl"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.8 (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]]
|
[[package]]
|
||||||
|
@ -695,7 +700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicase"
|
name = "unicase"
|
||||||
version = "1.3.0"
|
version = "1.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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>,
|
_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 {
|
impl Manager {
|
||||||
/// Creates a new manager.
|
/// Creates a new manager.
|
||||||
pub fn new() -> Manager {
|
pub fn new() -> Manager {
|
||||||
Manager {
|
Manager {
|
||||||
num_components: 0,
|
num_components: 0,
|
||||||
entities: vec![],
|
entities: vec![(Some(BSet::new(0)), 0)], // Has the world entity pre-defined
|
||||||
free_entities: vec![],
|
free_entities: vec![],
|
||||||
components: 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.
|
/// Allocates a new entity without any components.
|
||||||
pub fn create_entity(&mut self) -> Entity {
|
pub fn create_entity(&mut self) -> Entity {
|
||||||
if let Some(id) = self.free_entities.pop() {
|
if let Some(id) = self.free_entities.pop() {
|
||||||
|
|
|
@ -41,6 +41,10 @@ impl Set {
|
||||||
self.data.resize((new_size + 63) / 64, 0);
|
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) {
|
pub fn set(&mut self, i: usize, v: bool) {
|
||||||
if v {
|
if v {
|
||||||
self.data[i >> 6] |= 1 << (i & 0x3F)
|
self.data[i >> 6] |= 1 << (i & 0x3F)
|
||||||
|
@ -54,7 +58,6 @@ impl Set {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn includes_set(&self, other: &Set) -> bool {
|
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) {
|
for (a, b) in self.data.iter().zip(&other.data) {
|
||||||
if a & b != *b {
|
if a & b != *b {
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue