From 3eac2fb973ca1ac5cc6c3d9597a1206664b520f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Thu, 7 Apr 2022 21:30:52 +0000 Subject: [PATCH] expose extras from gltf nodes (#2154) fixes #2153 expose the `extras` field value as a string --- crates/bevy_gltf/Cargo.toml | 1 + crates/bevy_gltf/src/lib.rs | 10 +++++++- crates/bevy_gltf/src/loader.rs | 45 ++++++++++++++++++++++++---------- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/crates/bevy_gltf/Cargo.toml b/crates/bevy_gltf/Cargo.toml index c29efda18b5b3f..13c0da7038928e 100644 --- a/crates/bevy_gltf/Cargo.toml +++ b/crates/bevy_gltf/Cargo.toml @@ -29,6 +29,7 @@ bevy_utils = { path = "../bevy_utils", version = "0.7.0-dev" } gltf = { version = "1.0.0", default-features = false, features = [ "KHR_lights_punctual", "KHR_materials_unlit", + "extras", "names", "utils", ] } diff --git a/crates/bevy_gltf/src/lib.rs b/crates/bevy_gltf/src/lib.rs index fa55f1031e35d3..b1748f8be86292 100644 --- a/crates/bevy_gltf/src/lib.rs +++ b/crates/bevy_gltf/src/lib.rs @@ -7,8 +7,9 @@ pub use loader::*; use bevy_app::prelude::*; use bevy_asset::{AddAsset, Handle}; +use bevy_ecs::{prelude::Component, reflect::ReflectComponent}; use bevy_pbr::StandardMaterial; -use bevy_reflect::TypeUuid; +use bevy_reflect::{Reflect, TypeUuid}; use bevy_render::mesh::Mesh; use bevy_scene::Scene; @@ -19,6 +20,7 @@ pub struct GltfPlugin; impl Plugin for GltfPlugin { fn build(&self, app: &mut App) { app.init_asset_loader::() + .register_type::() .add_asset::() .add_asset::() .add_asset::() @@ -69,3 +71,9 @@ pub struct GltfPrimitive { pub mesh: Handle, pub material: Option>, } + +#[derive(Clone, Debug, Reflect, Default, Component)] +#[reflect(Component)] +pub struct GltfExtras { + pub value: String, +} diff --git a/crates/bevy_gltf/src/loader.rs b/crates/bevy_gltf/src/loader.rs index 43068b6e3f60b0..fc5d798757e3f6 100644 --- a/crates/bevy_gltf/src/loader.rs +++ b/crates/bevy_gltf/src/loader.rs @@ -703,6 +703,12 @@ fn load_node( node.insert(node_name(gltf_node)); + if let Some(extras) = gltf_node.extras() { + node.insert(super::GltfExtras { + value: extras.get().to_string(), + }); + } + // create camera node if let Some(camera) = gltf_node.camera() { node.insert_bundle(( @@ -780,21 +786,24 @@ fn load_node( let material_asset_path = AssetPath::new_ref(load_context.path(), Some(&material_label)); - let node = parent - .spawn_bundle(PbrBundle { - mesh: load_context.get_handle(mesh_asset_path), - material: load_context.get_handle(material_asset_path), - ..Default::default() - }) - .insert(Aabb::from_min_max( - Vec3::from_slice(&bounds.min), - Vec3::from_slice(&bounds.max), - )) - .id(); - + let mut mesh_entity = parent.spawn_bundle(PbrBundle { + mesh: load_context.get_handle(mesh_asset_path), + material: load_context.get_handle(material_asset_path), + ..Default::default() + }); + mesh_entity.insert(Aabb::from_min_max( + Vec3::from_slice(&bounds.min), + Vec3::from_slice(&bounds.max), + )); + + if let Some(extras) = primitive.extras() { + mesh_entity.insert(super::GltfExtras { + value: extras.get().to_string(), + }); + } // Mark for adding skinned mesh if let Some(skin) = gltf_node.skin() { - entity_to_skin_index_map.insert(node, skin.index()); + entity_to_skin_index_map.insert(mesh_entity.id(), skin.index()); } } } @@ -815,6 +824,11 @@ fn load_node( if let Some(name) = light.name() { entity.insert(Name::new(name.to_string())); } + if let Some(extras) = light.extras() { + entity.insert(super::GltfExtras { + value: extras.get().to_string(), + }); + } } gltf::khr_lights_punctual::Kind::Point => { let mut entity = parent.spawn_bundle(PointLightBundle { @@ -833,6 +847,11 @@ fn load_node( if let Some(name) = light.name() { entity.insert(Name::new(name.to_string())); } + if let Some(extras) = light.extras() { + entity.insert(super::GltfExtras { + value: extras.get().to_string(), + }); + } } gltf::khr_lights_punctual::Kind::Spot { inner_cone_angle: _inner_cone_angle,