simple queries (which will be completely rewritten
This commit is contained in:
parent
cde7d140ea
commit
f62f21e69f
|
@ -1,6 +1,6 @@
|
||||||
use std::any::{Any, TypeId};
|
use std::any::{Any, TypeId};
|
||||||
|
|
||||||
use crate::{world::{Entity, ArchetypeEntityId}, bundle::Bundle};
|
use crate::{world::{Entity, ArchetypeEntityId}, bundle::Bundle, component::Component};
|
||||||
|
|
||||||
pub trait ComponentColumn: Any {
|
pub trait ComponentColumn: Any {
|
||||||
fn as_any(&self) -> &dyn Any;
|
fn as_any(&self) -> &dyn Any;
|
||||||
|
@ -15,7 +15,7 @@ pub trait ComponentColumn: Any {
|
||||||
fn component_type_name(&self) -> String;
|
fn component_type_name(&self) -> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Send + Sync + 'static> ComponentColumn for Vec<T> {
|
impl<T: Component> ComponentColumn for Vec<T> {
|
||||||
fn as_any(&self) -> &dyn Any {
|
fn as_any(&self) -> &dyn Any {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ pub struct Archetype {
|
||||||
|
|
||||||
impl Archetype {
|
impl Archetype {
|
||||||
/// Create a new archetype from another archetype and add a column
|
/// Create a new archetype from another archetype and add a column
|
||||||
pub fn new_archetype_add<T: Send + Sync + 'static>(new_id: ArchetypeId, archetype: &Archetype) -> Archetype {
|
pub fn new_archetype_add<T: Component>(new_id: ArchetypeId, archetype: &Archetype) -> Archetype {
|
||||||
let mut columns: Vec<_> = archetype
|
let mut columns: Vec<_> = archetype
|
||||||
.columns
|
.columns
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -95,7 +95,7 @@ impl Archetype {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new archetype from another archetype and remove a column
|
/// Create a new archetype from another archetype and remove a column
|
||||||
pub fn new_archetype_remove<T: Send + Sync + 'static>(new_id: ArchetypeId, archetype: &Archetype) -> Archetype {
|
pub fn new_archetype_remove<T: Component>(new_id: ArchetypeId, archetype: &Archetype) -> Archetype {
|
||||||
let mut columns: Vec<_> = archetype
|
let mut columns: Vec<_> = archetype
|
||||||
.columns
|
.columns
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -123,7 +123,7 @@ impl Archetype {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_component_mut<T: Send + Sync + 'static>(&mut self, entity: ArchetypeEntityId) -> Option<&mut T> {
|
pub fn get_component_mut<T: Component>(&mut self, entity: ArchetypeEntityId) -> Option<&mut T> {
|
||||||
for col in self.columns.iter_mut() {
|
for col in self.columns.iter_mut() {
|
||||||
if col.as_any().is::<Vec<T>>() {
|
if col.as_any().is::<Vec<T>>() {
|
||||||
let components: &mut Vec<T> = col.as_any_mut().downcast_mut().unwrap();
|
let components: &mut Vec<T> = col.as_any_mut().downcast_mut().unwrap();
|
||||||
|
@ -135,7 +135,7 @@ impl Archetype {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_component<T: Send + Sync + 'static>(&self, entity: ArchetypeEntityId) -> Option<&T> {
|
pub fn get_component<T: Component>(&self, entity: ArchetypeEntityId) -> Option<&T> {
|
||||||
for col in self.columns.iter() {
|
for col in self.columns.iter() {
|
||||||
if col.as_ref().as_any().is::<Vec<T>>() {
|
if col.as_ref().as_any().is::<Vec<T>>() {
|
||||||
let components: &Vec<T> = col.as_any().downcast_ref().unwrap();
|
let components: &Vec<T> = col.as_any().downcast_ref().unwrap();
|
||||||
|
@ -147,6 +147,11 @@ impl Archetype {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_component_column<T: Component>(&self) -> Option<&Vec<T>> {
|
||||||
|
let col = self.columns.iter().find(|c| c.as_any().is::<Vec<T>>())?;
|
||||||
|
col.as_any().downcast_ref()
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn add_entity(&mut self, components: Vec<Box<dyn ComponentColumn>>) -> ArchetypeEntityId {
|
pub(crate) fn add_entity(&mut self, components: Vec<Box<dyn ComponentColumn>>) -> ArchetypeEntityId {
|
||||||
let mut created_entity: Option<ArchetypeEntityId> = None;
|
let mut created_entity: Option<ArchetypeEntityId> = None;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::any::{TypeId, Any};
|
use std::any::{TypeId, Any};
|
||||||
|
|
||||||
use crate::archetype::ComponentColumn;
|
use crate::{archetype::ComponentColumn, component::Component};
|
||||||
|
|
||||||
pub trait Bundle {
|
pub trait Bundle {
|
||||||
// Get a list of type ids that this bundle is storing
|
// Get a list of type ids that this bundle is storing
|
||||||
|
@ -13,7 +13,7 @@ pub trait Bundle {
|
||||||
|
|
||||||
macro_rules! impl_bundle_tuple {
|
macro_rules! impl_bundle_tuple {
|
||||||
( $(($name: ident, $index: tt))+ ) => (
|
( $(($name: ident, $index: tt))+ ) => (
|
||||||
impl<$($name: Send + Sync + 'static),+> Bundle for ($($name,)+) {
|
impl<$($name: Component),+> Bundle for ($($name,)+) {
|
||||||
fn types(&self) -> Vec<TypeId> {
|
fn types(&self) -> Vec<TypeId> {
|
||||||
vec![$(self.$index.type_id()),+]
|
vec![$(self.$index.type_id()),+]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
use std::any::Any;
|
/// Shorthand for `Send + Sync + 'static`, so it never needs to be implemented manually.
|
||||||
|
pub trait Component: Send + Sync + 'static {}
|
||||||
pub trait Component : Any {
|
impl<T: Send + Sync + 'static> Component for T {}
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +1,3 @@
|
||||||
use std::any::Any;
|
|
||||||
|
|
||||||
use crate::world::World;
|
use crate::world::World;
|
||||||
|
|
||||||
mod archetype;
|
mod archetype;
|
||||||
|
@ -21,4 +19,13 @@ fn main() {
|
||||||
} else {
|
} else {
|
||||||
println!("no component found :(");
|
println!("no component found :(");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let pos = Position2d(836, 348);
|
||||||
|
let _e = world.spawn((pos,));
|
||||||
|
|
||||||
|
println!("\nstart of querying!\n");
|
||||||
|
|
||||||
|
for pos in world.query::<Position2d>() {
|
||||||
|
println!("Queried Position2d: {:?}", pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use std::{collections::{HashMap, VecDeque}, any::{Any, TypeId}};
|
use std::{collections::{HashMap, VecDeque}, any::{Any, TypeId}};
|
||||||
|
use std::slice::Iter;
|
||||||
|
|
||||||
use crate::{archetype::{ArchetypeId, Archetype}, bundle::Bundle, component::Component};
|
use crate::{archetype::{ArchetypeId, Archetype}, bundle::Bundle, component::Component};
|
||||||
|
|
||||||
|
@ -103,10 +104,24 @@ impl World {
|
||||||
new_entity
|
new_entity
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_component<T: Send + Sync + 'static>(&self, entity: Entity) -> Option<&T> {
|
pub fn get_component<T: Component>(&self, entity: Entity) -> Option<&T> {
|
||||||
let record = self.entity_index.get(&entity.id)?;
|
let record = self.entity_index.get(&entity.id)?;
|
||||||
let archetype = self.archetypes.get(&record.id)?;
|
let archetype = self.archetypes.get(&record.id)?;
|
||||||
|
|
||||||
archetype.get_component(record.index)
|
archetype.get_component(record.index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn query<T: Component>(&self) -> impl Iterator<Item = &T> {
|
||||||
|
self.archetypes
|
||||||
|
.iter()
|
||||||
|
.filter_map(|(_, a)| a.get_component_column::<T>())
|
||||||
|
.flatten()
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pub fn query_m<B: Bundle>(&self) -> impl Iterator<Item = &T> {
|
||||||
|
self.archetypes
|
||||||
|
.iter()
|
||||||
|
.filter_map(|(_, a)| a.get_component_column::<T>())
|
||||||
|
.flatten()
|
||||||
|
} */
|
||||||
}
|
}
|
Loading…
Reference in New Issue