From 2616e326748c6098b2344c6e4689cc3981f4ff3e Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Tue, 22 Jul 2025 22:56:57 -0400 Subject: [PATCH] WIP loading meshes for prefabs --- engine/prefabs/src/builders.rs | 17 +++++++++++++++++ engine/prefabs/src/lib.rs | 1 + engine/prefabs/src/prefab.rs | 19 ++++++++++++++----- engine/prefabs/src/tests.rs | 19 ++++--------------- 4 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 engine/prefabs/src/builders.rs diff --git a/engine/prefabs/src/builders.rs b/engine/prefabs/src/builders.rs new file mode 100644 index 0000000..4b61888 --- /dev/null +++ b/engine/prefabs/src/builders.rs @@ -0,0 +1,17 @@ +use bevy::prelude::*; +use serde::{Deserialize, Serialize}; + +use crate::prefab::ComponentBuilder; + +#[derive(Serialize, Deserialize, Clone)] +pub struct PrefabMesh { + pub glb_path: String, + pub mesh_path: String, +} + +#[typetag::serde] +impl ComponentBuilder for PrefabMesh { + fn build(&self, _entity: &mut EntityCommands, asset_server: &AssetServer) { + let glb: Handle = asset_server.load(&self.glb_path); + } +} diff --git a/engine/prefabs/src/lib.rs b/engine/prefabs/src/lib.rs index 12133ce..690889f 100644 --- a/engine/prefabs/src/lib.rs +++ b/engine/prefabs/src/lib.rs @@ -1,5 +1,6 @@ use bevy::prelude::*; +pub mod builders; pub mod components; pub mod prefab; #[cfg(test)] diff --git a/engine/prefabs/src/prefab.rs b/engine/prefabs/src/prefab.rs index 7ef860b..26c63ea 100644 --- a/engine/prefabs/src/prefab.rs +++ b/engine/prefabs/src/prefab.rs @@ -1,23 +1,32 @@ use bevy::{ecs::entity_disabling::Disabled, prelude::*}; use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize)] +use crate::builders::PrefabMesh; + +#[derive(Serialize, Deserialize, Default)] pub struct PrefabAsset { pub components: Vec>, + pub children: Vec, + pub mesh: Option, } impl PrefabAsset { - pub fn build_prefab(&self, commands: &mut Commands) -> Entity { + pub fn build_prefab(&self, commands: &mut Commands, asset_server: &AssetServer) -> Entity { + let children: Vec<_> = self + .children + .iter() + .map(|c| c.build_prefab(commands, asset_server)) + .collect(); let mut entity = commands.spawn(Disabled); + entity.add_children(&children[..]); for builder in &self.components { - builder.insert(&mut entity); + builder.build(&mut entity, asset_server); } - return entity.id(); } } #[typetag::serde(tag = "type")] pub trait ComponentBuilder: Send { - fn insert(&self, entity: &mut EntityCommands); + fn build(&self, entity: &mut EntityCommands, asset_server: &AssetServer); } diff --git a/engine/prefabs/src/tests.rs b/engine/prefabs/src/tests.rs index a94489f..0a8a38c 100644 --- a/engine/prefabs/src/tests.rs +++ b/engine/prefabs/src/tests.rs @@ -1,7 +1,4 @@ -use bevy::{ - ecs::{component::Component, system::EntityCommands, world::World}, - math::Vec3, -}; +use bevy::prelude::*; use serde::{Deserialize, Serialize}; use crate::prefab::{ComponentBuilder, PrefabAsset}; @@ -12,7 +9,7 @@ struct Name { } #[typetag::serde] impl ComponentBuilder for Name { - fn insert(&self, _entity: &mut EntityCommands) { + fn build(&self, _entity: &mut EntityCommands, _: &AssetServer) { assert_eq!(self.name, "Test".to_string(), "Name"); } } @@ -24,7 +21,7 @@ struct Position { #[typetag::serde] impl ComponentBuilder for Position { - fn insert(&self, _entity: &mut EntityCommands) { + fn build(&self, _entity: &mut EntityCommands, _: &AssetServer) { assert_eq!(self.pos, Vec3::X, "Position"); } } @@ -38,6 +35,7 @@ fn round_trip_test() { name: "Test".to_string(), }), ], + ..default() }; let serialized = ron::to_string(&prefab); @@ -52,13 +50,4 @@ fn round_trip_test() { prefab.components.len(), "Prefab's components count do not match" ); - - let mut world = World::new(); - let e = world.spawn_empty().id(); - let mut commands = world.commands(); - let mut ec = commands.entity(e); - - for component in loaded_asset.components { - component.insert(&mut ec); - } }