mirror of
https://github.com/kaosat-dev/Blender_bevy_components_workflow.git
synced 2024-11-22 20:00:53 +00:00
feat(Blenvy:Bevy):
* fixed huge logical error in component processing (require Name components) that was breaking scene level extras/components * added a convience from_path function to BlueprintInfos to generate name from path * minor tweaks
This commit is contained in:
parent
a947d3b7d1
commit
8602383445
@ -22,6 +22,17 @@ pub struct BlueprintInfo {
|
|||||||
pub name: String,
|
pub name: String,
|
||||||
pub path: String,
|
pub path: String,
|
||||||
}
|
}
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
impl BlueprintInfo {
|
||||||
|
pub fn from_path(path: &str) -> BlueprintInfo {
|
||||||
|
let p = Path::new(&path);
|
||||||
|
return BlueprintInfo {
|
||||||
|
name: p.file_stem().unwrap().to_os_string().into_string().unwrap(), // seriously ? , also unwraps !!
|
||||||
|
path: path.into(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// flag component needed to signify the intent to spawn a Blueprint
|
/// flag component needed to signify the intent to spawn a Blueprint
|
||||||
#[derive(Component, Reflect, Default, Debug)]
|
#[derive(Component, Reflect, Default, Debug)]
|
||||||
@ -118,11 +129,14 @@ Overview of the Blueprint Spawning process
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
pub(crate) fn blueprints_prepare_spawn(
|
pub(crate) fn blueprints_prepare_spawn(
|
||||||
blueprint_instances_to_spawn: Query<(Entity, &BlueprintInfo), Added<SpawnBlueprint>>,
|
blueprint_instances_to_spawn: Query<
|
||||||
|
(Entity, &BlueprintInfo, Option<&Name>),
|
||||||
|
Added<SpawnBlueprint>,
|
||||||
|
>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
asset_server: Res<AssetServer>,
|
asset_server: Res<AssetServer>,
|
||||||
) {
|
) {
|
||||||
for (entity, blueprint_info) in blueprint_instances_to_spawn.iter() {
|
for (entity, blueprint_info, entity_name) in blueprint_instances_to_spawn.iter() {
|
||||||
info!(
|
info!(
|
||||||
"BLUEPRINT: to spawn detected: {:?} path:{:?}",
|
"BLUEPRINT: to spawn detected: {:?} path:{:?}",
|
||||||
blueprint_info.name, blueprint_info.path
|
blueprint_info.name, blueprint_info.path
|
||||||
@ -152,7 +166,6 @@ pub(crate) fn blueprints_prepare_spawn(
|
|||||||
for scene in gltf.scenes() {
|
for scene in gltf.scenes() {
|
||||||
let scene_extras = scene.extras().clone().unwrap();
|
let scene_extras = scene.extras().clone().unwrap();
|
||||||
let lookup: HashMap<String, Value> = serde_json::from_str(&scene_extras.get()).unwrap();
|
let lookup: HashMap<String, Value> = serde_json::from_str(&scene_extras.get()).unwrap();
|
||||||
|
|
||||||
if lookup.contains_key("BlueprintAssets") {
|
if lookup.contains_key("BlueprintAssets") {
|
||||||
let assets_raw = &lookup["BlueprintAssets"];
|
let assets_raw = &lookup["BlueprintAssets"];
|
||||||
//println!("ASSETS RAW {}", assets_raw);
|
//println!("ASSETS RAW {}", assets_raw);
|
||||||
@ -191,8 +204,13 @@ pub(crate) fn blueprints_prepare_spawn(
|
|||||||
} else {
|
} else {
|
||||||
commands.entity(entity).insert(BlueprintAssetsLoaded);
|
commands.entity(entity).insert(BlueprintAssetsLoaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the entity has no name, add one based on the blueprint's
|
||||||
|
commands
|
||||||
|
.entity(entity)
|
||||||
|
.insert(bevy::prelude::Name::from(blueprint_info.name.clone()));
|
||||||
// add the blueprint spawning marker
|
// add the blueprint spawning marker
|
||||||
commands.entity(entity).insert(BlueprintSpawning);
|
commands.entity(entity).insert((BlueprintSpawning));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +155,7 @@ fn process_colorgrading(
|
|||||||
) {
|
) {
|
||||||
for entity in cameras.iter() {
|
for entity in cameras.iter() {
|
||||||
for (scene_id, blender_colorgrading) in blender_colorgradings.iter() {
|
for (scene_id, blender_colorgrading) in blender_colorgradings.iter() {
|
||||||
|
info!("COLOR GRADING");
|
||||||
commands.entity(entity).insert(ColorGrading {
|
commands.entity(entity).insert(ColorGrading {
|
||||||
global: ColorGradingGlobal {
|
global: ColorGradingGlobal {
|
||||||
exposure: blender_colorgrading.exposure,
|
exposure: blender_colorgrading.exposure,
|
||||||
|
@ -18,7 +18,7 @@ use crate::{ronstring_to_reflect_component, GltfProcessed};
|
|||||||
// , mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>>
|
// , mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>>
|
||||||
fn find_entity_components(
|
fn find_entity_components(
|
||||||
entity: Entity,
|
entity: Entity,
|
||||||
name: &Name,
|
name: Option<&Name>,
|
||||||
parent: Option<&Parent>,
|
parent: Option<&Parent>,
|
||||||
reflect_components: Vec<(Box<dyn Reflect>, TypeRegistration)>,
|
reflect_components: Vec<(Box<dyn Reflect>, TypeRegistration)>,
|
||||||
entity_components: &HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>>,
|
entity_components: &HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>>,
|
||||||
@ -27,11 +27,14 @@ fn find_entity_components(
|
|||||||
let mut target_entity = entity;
|
let mut target_entity = entity;
|
||||||
// if the node contains "components" or ends with "_pa" (ie add to parent), the components will not be added to the entity itself but to its parent
|
// if the node contains "components" or ends with "_pa" (ie add to parent), the components will not be added to the entity itself but to its parent
|
||||||
// this is mostly used for Blender collections
|
// this is mostly used for Blender collections
|
||||||
if parent.is_some() && (name.as_str().contains("components") || name.as_str().ends_with("_pa"))
|
if parent.is_some() {
|
||||||
{
|
if let Some(name) = name {
|
||||||
|
if name.as_str().contains("components") || name.as_str().ends_with("_pa") {
|
||||||
debug!("adding components to parent");
|
debug!("adding components to parent");
|
||||||
target_entity = parent.expect("the target entity had a parent ").get();
|
target_entity = parent.expect("the target entity had a parent ").get();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
debug!("adding to {:?}", target_entity);
|
debug!("adding to {:?}", target_entity);
|
||||||
|
|
||||||
// if there where already components set to be added to this entity (for example when entity_data was refering to a parent), update the vec of entity_components accordingly
|
// if there where already components set to be added to this entity (for example when entity_data was refering to a parent), update the vec of entity_components accordingly
|
||||||
@ -54,10 +57,10 @@ fn find_entity_components(
|
|||||||
|
|
||||||
/// main function: injects components into each entity in gltf files that have `gltf_extras`, using reflection
|
/// main function: injects components into each entity in gltf files that have `gltf_extras`, using reflection
|
||||||
pub fn add_components_from_gltf_extras(world: &mut World) {
|
pub fn add_components_from_gltf_extras(world: &mut World) {
|
||||||
let mut extras = world.query_filtered::<(Entity, &Name, &GltfExtras, Option<&Parent>), (Added<GltfExtras>, Without<GltfProcessed>)>();
|
let mut extras = world.query_filtered::<(Entity, Option<&Name>, &GltfExtras, Option<&Parent>), (Added<GltfExtras>, Without<GltfProcessed>)>();
|
||||||
let mut scene_extras = world.query_filtered::<(Entity, &Name, &GltfSceneExtras, Option<&Parent>), (Added<GltfSceneExtras>, Without<GltfProcessed>)>();
|
let mut scene_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfSceneExtras, Option<&Parent>), (Added<GltfSceneExtras>, Without<GltfProcessed>)>();
|
||||||
let mut mesh_extras = world.query_filtered::<(Entity, &Name, &GltfMeshExtras, Option<&Parent>), (Added<GltfMeshExtras>, Without<GltfProcessed>)>();
|
let mut mesh_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfMeshExtras, Option<&Parent>), (Added<GltfMeshExtras>, Without<GltfProcessed>)>();
|
||||||
let mut material_extras = world.query_filtered::<(Entity, &Name, &GltfMaterialExtras, Option<&Parent>), (Added<GltfMaterialExtras>, Without<GltfProcessed>)>();
|
let mut material_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfMaterialExtras, Option<&Parent>), (Added<GltfMaterialExtras>, Without<GltfProcessed>)>();
|
||||||
|
|
||||||
let mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>> =
|
let mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>> =
|
||||||
HashMap::new();
|
HashMap::new();
|
||||||
@ -66,13 +69,14 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
|||||||
|
|
||||||
for (entity, name, extra, parent) in extras.iter(world) {
|
for (entity, name, extra, parent) in extras.iter(world) {
|
||||||
debug!(
|
debug!(
|
||||||
"Name: {}, entity {:?}, parent: {:?}, extras {:?}",
|
"Gltf Extra: Name: {:?}, entity {:?}, parent: {:?}, extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
let type_registry: &AppTypeRegistry = world.resource();
|
let type_registry: &AppTypeRegistry = world.resource();
|
||||||
let type_registry = type_registry.read();
|
let type_registry = type_registry.read();
|
||||||
let reflect_components = ronstring_to_reflect_component(&extra.value, &type_registry);
|
let reflect_components = ronstring_to_reflect_component(&extra.value, &type_registry);
|
||||||
|
// let name = name.unwrap_or(&Name::new(""));
|
||||||
|
|
||||||
let (target_entity, updated_components) =
|
let (target_entity, updated_components) =
|
||||||
find_entity_components(entity, name, parent, reflect_components, &entity_components);
|
find_entity_components(entity, name, parent, reflect_components, &entity_components);
|
||||||
@ -81,7 +85,7 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
|||||||
|
|
||||||
for (entity, name, extra, parent) in scene_extras.iter(world) {
|
for (entity, name, extra, parent) in scene_extras.iter(world) {
|
||||||
debug!(
|
debug!(
|
||||||
"Name: {}, entity {:?}, parent: {:?}, scene_extras {:?}",
|
"Gltf Scene Extra: Name: {:?}, entity {:?}, parent: {:?}, scene_extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -96,7 +100,7 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
|||||||
|
|
||||||
for (entity, name, extra, parent) in mesh_extras.iter(world) {
|
for (entity, name, extra, parent) in mesh_extras.iter(world) {
|
||||||
debug!(
|
debug!(
|
||||||
"Name: {}, entity {:?}, parent: {:?}, mesh_extras {:?}",
|
"Gltf Mesh Extra: Name: {:?}, entity {:?}, parent: {:?}, mesh_extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -111,7 +115,7 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
|||||||
|
|
||||||
for (entity, name, extra, parent) in material_extras.iter(world) {
|
for (entity, name, extra, parent) in material_extras.iter(world) {
|
||||||
debug!(
|
debug!(
|
||||||
"Name: {}, entity {:?}, parent: {:?}, material_extras {:?}",
|
"Name: {:?}, entity {:?}, parent: {:?}, material_extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -146,7 +150,7 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
|||||||
.expect("Unable to reflect component")
|
.expect("Unable to reflect component")
|
||||||
.insert(&mut entity_mut, &*component, &type_registry);
|
.insert(&mut entity_mut, &*component, &type_registry);
|
||||||
|
|
||||||
entity_mut.insert(GltfProcessed); // this is how can we insert any additional components
|
entity_mut.insert(GltfProcessed); //
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,23 +14,9 @@ pub fn setup_game(
|
|||||||
mut next_game_state: ResMut<NextState<GameState>>,
|
mut next_game_state: ResMut<NextState<GameState>>,
|
||||||
) {
|
) {
|
||||||
// here we actually spawn our game world/level
|
// here we actually spawn our game world/level
|
||||||
/*commands.spawn((
|
|
||||||
SceneBundle {
|
|
||||||
scene: asset_server.load("levels/World.glb#Scene0"),
|
|
||||||
..default()
|
|
||||||
},
|
|
||||||
bevy::prelude::Name::from("world"),
|
|
||||||
GameWorldTag,
|
|
||||||
InAppRunning,
|
|
||||||
));*/
|
|
||||||
|
|
||||||
commands.spawn((
|
commands.spawn((
|
||||||
BlueprintInfo {
|
BlueprintInfo::from_path("levels/World.gltf"),
|
||||||
name: "World".into(),
|
|
||||||
path: "levels/World.glb".into(),
|
|
||||||
},
|
|
||||||
HideUntilReady,
|
HideUntilReady,
|
||||||
bevy::prelude::Name::from("world"), //FIXME: not really needed ? could be infered from blueprint's name/ path
|
|
||||||
SpawnBlueprint,
|
SpawnBlueprint,
|
||||||
GameWorldTag,
|
GameWorldTag,
|
||||||
InAppRunning,
|
InAppRunning,
|
||||||
@ -70,8 +56,8 @@ pub fn spawn_test(
|
|||||||
.spawn((
|
.spawn((
|
||||||
BluePrintBundle {
|
BluePrintBundle {
|
||||||
blueprint: BlueprintInfo {
|
blueprint: BlueprintInfo {
|
||||||
name: "Blueprint8_animated_no_bones".into(),
|
name: "spawned".into(),
|
||||||
path: "blueprints/Blueprint6_animated.glb".into(),
|
path: "blueprints/Blueprint 3.gltf".into(),
|
||||||
}, // FIXME
|
}, // FIXME
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
@ -4,7 +4,7 @@ use bevy::{
|
|||||||
};
|
};
|
||||||
use blenvy::{BlueprintAssets, BlueprintInstanceReady};
|
use blenvy::{BlueprintAssets, BlueprintInstanceReady};
|
||||||
|
|
||||||
use crate::{BasicTest, EnumComplex, RedirectPropHitImpulse};
|
use crate::{BasicTest, EnumComplex, EnumTest, RedirectPropHitImpulse};
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct HiearchyDebugTag;
|
pub struct HiearchyDebugTag;
|
||||||
@ -43,7 +43,7 @@ pub fn get_descendants(
|
|||||||
all_transforms: &Query<&Transform>,
|
all_transforms: &Query<&Transform>,
|
||||||
all_global_transforms: &Query<&GlobalTransform>,
|
all_global_transforms: &Query<&GlobalTransform>,
|
||||||
nesting: usize,
|
nesting: usize,
|
||||||
to_check: &Query<&BasicTest>, //&Query<(&BlueprintInstanceReady, &BlueprintAssets)>,
|
to_check: &Query<&EnumTest>, //&Query<(&BlueprintInstanceReady, &BlueprintAssets)>,
|
||||||
) -> String {
|
) -> String {
|
||||||
let mut hierarchy_display: Vec<String> = vec![];
|
let mut hierarchy_display: Vec<String> = vec![];
|
||||||
let root_name = all_names.get(*root);
|
let root_name = all_names.get(*root);
|
||||||
@ -54,15 +54,20 @@ pub fn get_descendants(
|
|||||||
name = "no_name".to_string()
|
name = "no_name".to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut component_display: String = "".into();
|
||||||
let components_to_check = to_check.get(*root);
|
let components_to_check = to_check.get(*root);
|
||||||
|
|
||||||
|
if let Ok(compo) = to_check.get(*root) {
|
||||||
|
component_display = format!("{:?}", compo).clone();
|
||||||
|
}
|
||||||
|
|
||||||
hierarchy_display.push(format!(
|
hierarchy_display.push(format!(
|
||||||
"{}{} ({:?}) ({:?})",
|
"{}{} ====> {} ",
|
||||||
" ".repeat(nesting),
|
" ".repeat(nesting),
|
||||||
name,
|
name,
|
||||||
all_transforms.get(*root),
|
component_display // all_transforms.get(*root),
|
||||||
all_global_transforms.get(*root)
|
//all_global_transforms.get(*root)
|
||||||
)); //components_to_check ({:?})
|
)); // ({:?}) // ({:?}) ({:?})
|
||||||
|
|
||||||
if let Ok(children) = all_children.get(*root) {
|
if let Ok(children) = all_children.get(*root) {
|
||||||
for child in children.iter() {
|
for child in children.iter() {
|
||||||
@ -88,7 +93,7 @@ pub fn draw_hierarchy_debug(
|
|||||||
all_transforms: Query<&Transform>,
|
all_transforms: Query<&Transform>,
|
||||||
all_global_transforms: Query<&GlobalTransform>,
|
all_global_transforms: Query<&GlobalTransform>,
|
||||||
|
|
||||||
to_check: Query<&BasicTest>, //Query<(&BlueprintInstanceReady, &BlueprintAssets)>,
|
to_check: Query<&EnumTest>, //Query<(&BlueprintInstanceReady, &BlueprintAssets)>,
|
||||||
mut display: Query<&mut Text, With<HiearchyDebugTag>>,
|
mut display: Query<&mut Text, With<HiearchyDebugTag>>,
|
||||||
) {
|
) {
|
||||||
let mut hierarchy_display: Vec<String> = vec![];
|
let mut hierarchy_display: Vec<String> = vec![];
|
||||||
@ -183,7 +188,7 @@ impl Plugin for HiearchyDebugPlugin {
|
|||||||
app
|
app
|
||||||
.add_systems(Startup, setup_hierarchy_debug)
|
.add_systems(Startup, setup_hierarchy_debug)
|
||||||
//.add_systems(Update, check_for_component)
|
//.add_systems(Update, check_for_component)
|
||||||
//.add_systems(Update, draw_hierarchy_debug)
|
.add_systems(Update, draw_hierarchy_debug)
|
||||||
//.add_systems(Update, check_for_gltf_extras)
|
//.add_systems(Update, check_for_gltf_extras)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -233,9 +233,9 @@ Bevy Side:
|
|||||||
- [x] fix/upgrade scene level animations
|
- [x] fix/upgrade scene level animations
|
||||||
- [ ] rename SceneAnimations to LevelAnimations (more coherent with the rest)
|
- [ ] rename SceneAnimations to LevelAnimations (more coherent with the rest)
|
||||||
- [x] move sub blueprint handling to blueprints_finalize_instances
|
- [x] move sub blueprint handling to blueprints_finalize_instances
|
||||||
- [ ] look into component overriding , it seems broken:
|
- [x] look into component overriding , it seems broken:
|
||||||
- [ ] blueprint level/ collection level components are now visible in instances in Blender
|
- [x] blueprint level/ collection level components are now visible in instances in Blender
|
||||||
- [ ] they do not seem to be transfered to the (instance) entity above:
|
- [x] they do not seem to be transfered to the (instance) entity above:
|
||||||
could they be on the "empty node" ?
|
could they be on the "empty node" ?
|
||||||
|
|
||||||
- [ ] simplify testing example:
|
- [ ] simplify testing example:
|
||||||
|
Loading…
Reference in New Issue
Block a user