mirror of
https://github.com/bevyengine/bevy.git
synced 2026-05-06 06:06:42 -04:00
535cf401cc
Part 2 of #23619 In **Bevy 0.19** we are landing a subset of Bevy's Next Generation Scene system (often known as BSN), which now lives in the `bevy_scene` / `bevy::scene` crate. However the old `bevy_scene` system still needs to stick around for a bit longer, as it provides some features that Bevy's Next Generation Scene system doesn't (yet!): 1. It is not _yet_ possible to write a World _to_ BSN, so the old system is still necessary for "round trip World serialization". 2. The GLTF scene loader has not yet been ported to BSN, so the old system is still necessary to spawn GLTF scenes in Bevy. For this reason, we have renamed the old `bevy_scene` crate to `bevy_world_serialization`. If you were referencing `bevy_scene::*` or `bevy::scene::*` types, rename those paths to `bevy_world_serialization::*` and `bevy::world_serialization::*` respectively. Additionally, to avoid confusion / conflicts with the new scene system, all "scene" terminology / types have been reframed as "world serialization": - `Scene` -> `WorldAsset` (as this was always just a World wrapper) - `SceneRoot` -> `WorldAssetRoot` - `DynamicScene` -> `DynamicWorld` - `DynamicScene::from_scene` -> `DynamicWorld::from_world_asset` - `DynamicSceneBuilder` -> `DynamicWorldBuilder` - `DynamicSceneRoot` -> `DynamicWorldRoot` - `SceneInstanceReady` -> `WorldInstanceReady` - `SceneLoader` -> `WorldAssetLoader` - `ScenePlugin` -> `WorldSerializationPlugin` - `SceneRootTemplate` -> `WorldAssetRootTemplate` - `SceneSpawner` -> `WorldInstanceSpawner` - `SceneFilter` -> `WorldFilter` - `SceneLoaderError` -> `WorldAssetLoaderError` - `SceneSpawnError` -> `WorldInstanceSpawnError` Note that I went with `bevy_world_serialization` over `bevy_ecs_serialization`, as that is what all of the internal features described themselves as. I think it is both more specific and does a better job of making itself decoupled from `bevy_ecs` proper.
92 lines
2.4 KiB
Rust
92 lines
2.4 KiB
Rust
//! Loads and renders a glTF file as a scene, and list all the different `gltf_extras`.
|
|
|
|
use bevy::{
|
|
gltf::{GltfExtras, GltfMaterialExtras, GltfMeshExtras, GltfSceneExtras},
|
|
prelude::*,
|
|
};
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins)
|
|
.add_systems(Startup, setup)
|
|
.add_systems(Update, check_for_gltf_extras)
|
|
.run();
|
|
}
|
|
|
|
#[derive(Component)]
|
|
struct ExampleDisplay;
|
|
|
|
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
|
commands.spawn((
|
|
Camera3d::default(),
|
|
Transform::from_xyz(2.0, 2.0, 2.0).looking_at(Vec3::ZERO, Vec3::Y),
|
|
));
|
|
|
|
commands.spawn(DirectionalLight {
|
|
shadow_maps_enabled: true,
|
|
..default()
|
|
});
|
|
|
|
// a barebones scene containing one of each gltf_extra type
|
|
commands.spawn(WorldAssetRoot(asset_server.load(
|
|
GltfAssetLabel::Scene(0).from_asset("models/extras/gltf_extras.glb"),
|
|
)));
|
|
|
|
// a place to display the extras on screen
|
|
commands.spawn((
|
|
Text::default(),
|
|
TextFont {
|
|
font_size: FontSize::Px(15.),
|
|
..default()
|
|
},
|
|
Node {
|
|
position_type: PositionType::Absolute,
|
|
top: px(12),
|
|
left: px(12),
|
|
..default()
|
|
},
|
|
ExampleDisplay,
|
|
));
|
|
}
|
|
|
|
fn check_for_gltf_extras(
|
|
gltf_extras_per_entity: Query<(
|
|
Entity,
|
|
Option<&Name>,
|
|
Option<&GltfSceneExtras>,
|
|
Option<&GltfExtras>,
|
|
Option<&GltfMeshExtras>,
|
|
Option<&GltfMaterialExtras>,
|
|
)>,
|
|
mut display: Single<&mut Text, With<ExampleDisplay>>,
|
|
) {
|
|
let mut gltf_extra_infos_lines: Vec<String> = vec![];
|
|
|
|
for (id, name, scene_extras, extras, mesh_extras, material_extras) in
|
|
gltf_extras_per_entity.iter()
|
|
{
|
|
if scene_extras.is_some()
|
|
|| extras.is_some()
|
|
|| mesh_extras.is_some()
|
|
|| material_extras.is_some()
|
|
{
|
|
let formatted_extras = format!(
|
|
"Extras per entity {} ('Name: {}'):
|
|
- scene extras: {:?}
|
|
- primitive extras: {:?}
|
|
- mesh extras: {:?}
|
|
- material extras: {:?}
|
|
",
|
|
id,
|
|
name.unwrap_or(&Name::default()),
|
|
scene_extras,
|
|
extras,
|
|
mesh_extras,
|
|
material_extras
|
|
);
|
|
gltf_extra_infos_lines.push(formatted_extras);
|
|
}
|
|
display.0 = gltf_extra_infos_lines.join("\n");
|
|
}
|
|
}
|