From baf152fdbf06f6270f0c399988ba1bd5b62f3d42 Mon Sep 17 00:00:00 2001 From: Robin KAY Date: Tue, 21 Mar 2023 18:35:10 +0000 Subject: [PATCH] Add hollow example. --- Cargo.toml | 7 ++- README.md | 8 ++- assets/hollow.glb | Bin 0 -> 38668 bytes examples/hollow.rs | 126 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 assets/hollow.glb create mode 100644 examples/hollow.rs diff --git a/Cargo.toml b/Cargo.toml index 4f6429b..c0d0cd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ bevy = { version = "0.10", default-features = false, features = [ "png", "x11", ] } +bevy_mod_gltf_patched = "0.2" [features] default = ["bevy_ui"] @@ -49,4 +50,8 @@ path = "examples/render_layers.rs" [[example]] name = "animated_fox" -path = "examples/animated_fox.rs" \ No newline at end of file +path = "examples/animated_fox.rs" + +[[example]] +name = "hollow" +path = "examples/hollow.rs" \ No newline at end of file diff --git a/README.md b/README.md index 088f1b9..6acb3db 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,18 @@ enabled. cargo run --example render_layers ``` -An animated jointed model with an outline. +An animated jointed glTF model with an outline. ```shell cargo run --example animated_fox ``` +A glTF model with pre-baked outline normals. + +```shell +cargo run --example hollow +``` + ## Versions | This Version | Bevy version | diff --git a/assets/hollow.glb b/assets/hollow.glb new file mode 100644 index 0000000000000000000000000000000000000000..263d6882bcffb7cf3185cfb20f7465631bc68939 GIT binary patch literal 38668 zcmcJ237k*W`~Nu@`@XMX>}D{Vz0W;&>>@iMlx2i$86?YuRJO7uLMV}Jp|WH?_uL^- z`jQewCGDY-HWm86pYu8Q_WbJm|1JOJ)ob#ene(~#oM(TYbDlHzjPBJgmk^@x3L%c> z6XLd>UAs(+A3StuMrP)?37PRN?wl4sWYX~A858=9%(y?kMN(q?kOwAabR9lCGh?Fp zcIdcCV}a7rQWN8cjvF(6+}Mn<6MH={J|n(GyrY@V9hG (O0%X- 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 + // Register outline normal vertex attribute with bevy_mod_gltf_patched + .add_plugin( + GltfPlugin::default() + .add_custom_vertex_attribute("_OUTLINE_NORMAL", ATTRIBUTE_OUTLINE_NORMAL), + ) + .add_plugin(OutlinePlugin) + .insert_resource(AmbientLight { + color: Color::WHITE, + brightness: 1.0, + }) + .add_startup_system(setup) + .add_system(setup_scene_once_loaded) + .add_system(rotates) + .add_system(rotates_hue) + .add_system(close_on_esc) + .run(); +} + +#[derive(Component)] +struct Rotates; + +#[derive(Component)] +struct RotatesHue; + +fn setup(mut commands: Commands, asset_server: Res) { + // Camera + commands.spawn(Camera3dBundle { + transform: Transform::from_xyz(20.0, 20.0, 30.0) + .looking_at(Vec3::new(0.0, 0.0, 0.0), Vec3::Y), + ..default() + }); + + // Light + commands.spawn(DirectionalLightBundle { + transform: Transform::from_rotation(Quat::from_euler(EulerRot::ZYX, 0.0, 1.0, -PI / 4.)), + directional_light: DirectionalLight { + shadows_enabled: true, + ..default() + }, + ..default() + }); + + // Hollow + commands + .spawn(SceneBundle { + scene: asset_server.load("hollow.glb#Scene0"), + ..default() + }) + .insert(Rotates) + .insert(ComputedOutlineDepth::default()); +} + +// Once the scene is loaded, start the animation and add an outline +fn setup_scene_once_loaded( + mut commands: Commands, + scene_query: Query<&SceneInstance>, + scene_manager: Res, + name_query: Query<&Name, With>>, + mut done: Local, +) { + if !*done { + if let Ok(scene) = scene_query.get_single() { + if scene_manager.instance_is_ready(**scene) { + for entity in scene_manager.iter_instance_entities(**scene) { + commands + .entity(entity) + .insert(OutlineBundle { + outline: OutlineVolume { + visible: true, + width: 7.5, + colour: Color::BLUE, + }, + stencil: OutlineStencil { + enabled: true, + offset: 0.0, + }, + ..default() + }) + .insert(InheritOutlineDepth); + if let Ok(name) = name_query.get(entity) { + if name.as_str() == "inside" { + commands.entity(entity).insert(RotatesHue); + } + } + } + *done = true; + } + } + } +} + +fn rotates(mut query: Query<&mut Transform, With>, timer: Res