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::{
game::Game,
input::{ActionHandler, CommonActionLabel},
math::{Quat, Vec3, EulerRot},
plugin::Plugin, ecs::{Component, query::{Res, View}}, DeltaTime, scene::CameraComponent,
ecs::{query::{Res, View}, Component}, game::Game, input::ActionHandler, math::{EulerRot, Quat, Vec3}, plugin::Plugin, scene::CameraComponent, DeltaTime
};
/* enum FreeFlyCameraActions {

View File

@ -1,6 +1,6 @@
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};
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/texture-sep/texture-sep.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);
/* world.spawn((
@ -95,6 +96,11 @@ async fn main() {
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);
//cube_tran.rotate_y(math::Angle::Degrees(180.0));

View File

@ -1,5 +1,5 @@
use instant::Instant;
use lyra_ecs::{Component, world::World};
use lyra_ecs::{Component, World};
use lyra_reflect::Reflect;
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 lyra_ecs::{world::World, system::{System, IntoSystem}};
use lyra_ecs::{World, system::{System, IntoSystem}};
use tracing::{info, error, Level};
use tracing_appender::non_blocking;
use tracing_subscriber::{

View File

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

View File

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

View File

@ -2,7 +2,7 @@ pub mod point;
pub mod directional;
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 spotlight::*;

View File

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

View File

@ -1,7 +1,7 @@
use std::sync::Arc;
use glam::{Vec2, IVec2};
use lyra_ecs::world::World;
use lyra_ecs::World;
use tracing::{warn, error};
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 lyra_ecs::{world::World, DynamicBundle, Component, Entity, ComponentInfo};
use lyra_ecs::World;
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> {
let mut meshes = vec![];
//node.transform()
if let Some(mesh) = node.mesh() {
for prim in mesh.primitives() {
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 {
let ptr = unsafe { self.col.as_ref().borrow_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 {
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 entity = arch.entity_of_index(entity_index).unwrap();
let entity = arch.entity_at_index(entity_index).unwrap();
let row = DynamicViewRow {
entity,
item: fetch_res,
@ -112,7 +112,7 @@ impl Iterator for DynamicViewIter {
self.next_archetype += 1;
let arch = unsafe { self.archetypes.get_unchecked(arch_id).as_ref() };
if arch.entities().len() == 0 {
if arch.entity_indexes().len() == 0 {
continue;
}
@ -126,7 +126,7 @@ impl Iterator for DynamicViewIter {
.map(|q| unsafe { q.fetch(world, ArchetypeId(arch_id as u64), arch) } )
.map(|f| FetchDynamicType::from(f))
.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![];
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 =
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 refl_comp =
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) => {
let name: String = tbl.get(elua::MetaMethod::Name)?;
let lookup = world.get_resource::<LuaTableProxyLookup>();
*lookup.typeid_from_name.get(&name).unwrap()
}
},
_ => {
panic!("A userdata or table value was not returned!");
// TODO: Handle properly
@ -209,8 +209,8 @@ impl elua::Userdata for ScriptWorldPtr {
// update the component tick
let world = unsafe { this.inner.as_mut() };
let arch = world.entity_archetype_mut(row.entity).unwrap();
let idx = arch.entities().get(&row.entity).unwrap().clone();
let c = arch.get_column_mut(lua_typeid.into()).unwrap();
let idx = arch.entity_indexes().get(&row.entity).unwrap().clone();
let c = arch.get_column_mut(lua_typeid).unwrap();
c.entity_ticks[idx.0 as usize] = current;
// apply the new component data

View File

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