Implement relationships in the ECS #3

Merged
SeanOMik merged 5 commits from feature/ecs-relations into main 2024-03-03 21:22:40 +00:00
14 changed files with 29 additions and 24 deletions
Showing only changes of commit 70fecc8cdd - Show all commits

View File

@ -1,8 +1,5 @@
use lyra_engine::{ use lyra_engine::{
game::Game, ecs::{query::{Res, View}, Component}, game::Game, input::ActionHandler, math::{EulerRot, Quat, Vec3}, plugin::Plugin, scene::CameraComponent, DeltaTime
input::{ActionHandler, CommonActionLabel},
math::{Quat, Vec3, EulerRot},
plugin::Plugin, ecs::{Component, query::{Res, View}}, DeltaTime, scene::CameraComponent,
}; };
/* enum FreeFlyCameraActions { /* enum FreeFlyCameraActions {

View File

@ -1,6 +1,6 @@
use std::ptr::NonNull; use std::ptr::NonNull;
use lyra_engine::{math::{self, Vec3}, math::Transform, input::{KeyCode, ActionHandler, Action, ActionKind, LayoutId, ActionMapping, ActionSource, ActionMappingId, InputActionPlugin, MouseInput, MouseAxis, CommonActionLabel}, game::Game, render::{window::{CursorGrabMode, WindowOptions}, light::{PointLight, directional::DirectionalLight, SpotLight}}, change_tracker::Ct, ecs::{system::{Criteria, CriteriaSchedule, BatchedSystem, IntoSystem}, world::World, Component}, DeltaTime, scene::{ModelComponent, CameraComponent}, lua::{LuaScriptingPlugin, LuaScript}, Script, ScriptList}; use lyra_engine::{math::{self, Vec3}, math::Transform, input::{KeyCode, ActionHandler, Action, ActionKind, LayoutId, ActionMapping, ActionSource, ActionMappingId, InputActionPlugin, MouseInput, MouseAxis, CommonActionLabel}, game::Game, render::{window::{CursorGrabMode, WindowOptions}, light::{PointLight, directional::DirectionalLight, SpotLight}}, change_tracker::Ct, ecs::{system::{Criteria, CriteriaSchedule, BatchedSystem, IntoSystem}, World, Component}, DeltaTime, scene::{ModelComponent, CameraComponent}, lua::{LuaScriptingPlugin, LuaScript}, Script, ScriptList};
use lyra_engine::assets::{ResourceManager, Model}; use lyra_engine::assets::{ResourceManager, Model};
mod free_fly_camera; mod free_fly_camera;
@ -88,6 +88,7 @@ async fn main() {
//let cube_model = resman.request::<Model>("assets/cube-texture-bin.glb").unwrap(); //let cube_model = resman.request::<Model>("assets/cube-texture-bin.glb").unwrap();
let cube_model = resman.request::<Model>("assets/texture-sep/texture-sep.gltf").unwrap(); let cube_model = resman.request::<Model>("assets/texture-sep/texture-sep.gltf").unwrap();
let crate_model = resman.request::<Model>("assets/crate/crate.gltf").unwrap(); let crate_model = resman.request::<Model>("assets/crate/crate.gltf").unwrap();
//let sponza_model = resman.request::<Model>("assets/sponza/Sponza.gltf").unwrap();
drop(resman); drop(resman);
/* world.spawn(( /* world.spawn((
@ -95,6 +96,11 @@ async fn main() {
Transform::from_xyz(0.0, -5.0, -10.0), Transform::from_xyz(0.0, -5.0, -10.0),
)); */ )); */
/* world.spawn((
ModelComponent(sponza_model),
Transform::from_xyz(0.0, 0.0, 0.0),
)); */
{ {
let cube_tran = Transform::from_xyz(-3.5, 0.0, -8.0); let cube_tran = Transform::from_xyz(-3.5, 0.0, -8.0);
//cube_tran.rotate_y(math::Angle::Degrees(180.0)); //cube_tran.rotate_y(math::Angle::Degrees(180.0));

View File

@ -1,5 +1,5 @@
use instant::Instant; use instant::Instant;
use lyra_ecs::{Component, world::World}; use lyra_ecs::{Component, World};
use lyra_reflect::Reflect; use lyra_reflect::Reflect;
use crate::{plugin::Plugin, game::GameStages}; use crate::{plugin::Plugin, game::GameStages};

View File

@ -2,7 +2,7 @@ use std::{sync::Arc, collections::VecDeque, ptr::NonNull};
use async_std::task::block_on; use async_std::task::block_on;
use lyra_ecs::{world::World, system::{System, IntoSystem}}; use lyra_ecs::{World, system::{System, IntoSystem}};
use tracing::{info, error, Level}; use tracing::{info, error, Level};
use tracing_appender::non_blocking; use tracing_appender::non_blocking;
use tracing_subscriber::{ use tracing_subscriber::{

View File

@ -1,7 +1,7 @@
use std::{collections::HashMap, ops::Deref, hash::{Hash, DefaultHasher, Hasher}, fmt::Debug}; use std::{collections::HashMap, ops::Deref, hash::{Hash, DefaultHasher, Hasher}, fmt::Debug};
use glam::Vec2; use glam::Vec2;
use lyra_ecs::world::World; use lyra_ecs::World;
use lyra_reflect::Reflect; use lyra_reflect::Reflect;
use crate::{plugin::Plugin, game::GameStages, EventQueue}; use crate::{plugin::Plugin, game::GameStages, EventQueue};

View File

@ -1,7 +1,7 @@
use std::ptr::NonNull; use std::ptr::NonNull;
use glam::Vec2; use glam::Vec2;
use lyra_ecs::{world::World, system::IntoSystem}; use lyra_ecs::{World, system::IntoSystem};
use winit::event::MouseScrollDelta; use winit::event::MouseScrollDelta;
use crate::{EventQueue, plugin::Plugin, game::GameStages}; use crate::{EventQueue, plugin::Plugin, game::GameStages};

View File

@ -2,7 +2,7 @@ pub mod point;
pub mod directional; pub mod directional;
pub mod spotlight; pub mod spotlight;
use lyra_ecs::{Entity, Tick, world::World, query::{Entities, TickOf}}; use lyra_ecs::{Entity, Tick, World, query::{Entities, TickOf}};
pub use point::*; pub use point::*;
pub use spotlight::*; pub use spotlight::*;

View File

@ -7,7 +7,7 @@ use instant::Instant;
use itertools::izip; use itertools::izip;
use lyra_ecs::Entity; use lyra_ecs::Entity;
use lyra_ecs::query::{Entities, TickOf}; use lyra_ecs::query::{Entities, TickOf};
use lyra_ecs::world::World; use lyra_ecs::World;
use tracing::{debug, warn}; use tracing::{debug, warn};
use wgpu::{BindGroupLayout, Limits}; use wgpu::{BindGroupLayout, Limits};
use wgpu::util::DeviceExt; use wgpu::util::DeviceExt;

View File

@ -1,7 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use glam::{Vec2, IVec2}; use glam::{Vec2, IVec2};
use lyra_ecs::world::World; use lyra_ecs::World;
use tracing::{warn, error}; use tracing::{warn, error};
use winit::{window::{Window, Fullscreen}, dpi::{LogicalPosition, LogicalSize, PhysicalPosition}, error::ExternalError}; use winit::{window::{Window, Fullscreen}, dpi::{LogicalPosition, LogicalSize, PhysicalPosition}, error::ExternalError};

View File

@ -2,7 +2,7 @@
use std::{any::TypeId, any::Any, cell::{Ref, RefMut}}; use std::{any::TypeId, any::Any, cell::{Ref, RefMut}};
use lyra_ecs::{world::World, DynamicBundle, Component, Entity, ComponentInfo}; use lyra_ecs::World;
extern crate self as lyra_reflect; extern crate self as lyra_reflect;

View File

@ -62,6 +62,8 @@ impl ModelLoader {
fn process_node(buffers: &Vec<Vec<u8>>, materials: &Vec<Material>, node: gltf::Node<'_>) -> Vec<Mesh> { fn process_node(buffers: &Vec<Vec<u8>>, materials: &Vec<Material>, node: gltf::Node<'_>) -> Vec<Mesh> {
let mut meshes = vec![]; let mut meshes = vec![];
//node.transform()
if let Some(mesh) = node.mesh() { if let Some(mesh) = node.mesh() {
for prim in mesh.primitives() { for prim in mesh.primitives() {
let reader = prim.reader(|buf| Some(buffers[buf.index()].as_slice())); let reader = prim.reader(|buf| Some(buffers[buf.index()].as_slice()));

View File

@ -27,7 +27,7 @@ impl<'a> Fetch<'a> for FetchDynamicType {
unsafe fn get_item(&mut self, entity: ArchetypeEntityId) -> Self::Item { unsafe fn get_item(&mut self, entity: ArchetypeEntityId) -> Self::Item {
let ptr = unsafe { self.col.as_ref().borrow_ptr() }; let ptr = unsafe { self.col.as_ref().borrow_ptr() };
let ptr = NonNull::new_unchecked(ptr.as_ptr() let ptr = NonNull::new_unchecked(ptr.as_ptr()
.add(entity.0 as usize * self.info.layout.size)); .add(entity.0 as usize * self.info.layout().size()));
DynamicType { DynamicType {
info: self.info, info: self.info,
@ -96,7 +96,7 @@ impl Iterator for DynamicViewIter {
} }
let arch = unsafe { self.archetypes.get_unchecked(self.next_archetype - 1).as_ref() }; let arch = unsafe { self.archetypes.get_unchecked(self.next_archetype - 1).as_ref() };
let entity = arch.entity_of_index(entity_index).unwrap(); let entity = arch.entity_at_index(entity_index).unwrap();
let row = DynamicViewRow { let row = DynamicViewRow {
entity, entity,
item: fetch_res, item: fetch_res,
@ -112,7 +112,7 @@ impl Iterator for DynamicViewIter {
self.next_archetype += 1; self.next_archetype += 1;
let arch = unsafe { self.archetypes.get_unchecked(arch_id).as_ref() }; let arch = unsafe { self.archetypes.get_unchecked(arch_id).as_ref() };
if arch.entities().len() == 0 { if arch.entity_indexes().len() == 0 {
continue; continue;
} }
@ -126,7 +126,7 @@ impl Iterator for DynamicViewIter {
.map(|q| unsafe { q.fetch(world, ArchetypeId(arch_id as u64), arch) } ) .map(|q| unsafe { q.fetch(world, ArchetypeId(arch_id as u64), arch) } )
.map(|f| FetchDynamicType::from(f)) .map(|f| FetchDynamicType::from(f))
.collect(); .collect();
self.component_indices = 0..arch.entities().len() as u64; self.component_indices = 0..arch.entity_indexes().len() as u64;
} }
} }
} }
@ -167,7 +167,7 @@ impl ReflectedIterator {
let mut dynamic_row = vec![]; let mut dynamic_row = vec![];
for d in row.item.iter() { for d in row.item.iter() {
let id = d.info.type_id.as_rust(); let id = d.info.type_id().as_rust();
let reflected_components = let reflected_components =
unsafe { self.reflected_components.as_ref().unwrap().as_ref() }; unsafe { self.reflected_components.as_ref().unwrap().as_ref() };

View File

@ -192,14 +192,14 @@ impl elua::Userdata for ScriptWorldPtr {
let lua_comp = reflect_user_data(ud); let lua_comp = reflect_user_data(ud);
let refl_comp = let refl_comp =
lua_comp.reflect_branch.as_component_unchecked(); lua_comp.reflect_branch.as_component_unchecked();
refl_comp.info.type_id.as_rust() refl_comp.info.type_id().as_rust()
} },
elua::Value::Table(tbl) => { elua::Value::Table(tbl) => {
let name: String = tbl.get(elua::MetaMethod::Name)?; let name: String = tbl.get(elua::MetaMethod::Name)?;
let lookup = world.get_resource::<LuaTableProxyLookup>(); let lookup = world.get_resource::<LuaTableProxyLookup>();
*lookup.typeid_from_name.get(&name).unwrap() *lookup.typeid_from_name.get(&name).unwrap()
} },
_ => { _ => {
panic!("A userdata or table value was not returned!"); panic!("A userdata or table value was not returned!");
// TODO: Handle properly // TODO: Handle properly
@ -209,8 +209,8 @@ impl elua::Userdata for ScriptWorldPtr {
// update the component tick // update the component tick
let world = unsafe { this.inner.as_mut() }; let world = unsafe { this.inner.as_mut() };
let arch = world.entity_archetype_mut(row.entity).unwrap(); let arch = world.entity_archetype_mut(row.entity).unwrap();
let idx = arch.entities().get(&row.entity).unwrap().clone(); let idx = arch.entity_indexes().get(&row.entity).unwrap().clone();
let c = arch.get_column_mut(lua_typeid.into()).unwrap(); let c = arch.get_column_mut(lua_typeid).unwrap();
c.entity_ticks[idx.0 as usize] = current; c.entity_ticks[idx.0 as usize] = current;
// apply the new component data // apply the new component data

View File

@ -1,6 +1,6 @@
use std::ptr::NonNull; use std::ptr::NonNull;
use lyra_ecs::{world::World, Entity}; use lyra_ecs::{World, Entity};
#[derive(Clone)] #[derive(Clone)]
pub struct ScriptEntity(pub Entity); pub struct ScriptEntity(pub Entity);