From 2622ff786672637678f81161c8106f0947fa5422 Mon Sep 17 00:00:00 2001 From: Nixon Date: Mon, 16 Sep 2024 17:46:18 +0800 Subject: [PATCH 1/3] feat: add render layers support --- src/renderer.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index 3d19503..5782f5a 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,7 +1,7 @@ use std::marker::PhantomData; use crate::{prelude::*, typst_element::prelude::*}; -use bevy::{prelude::*, utils::HashMap}; +use bevy::{prelude::*, render::view::RenderLayers, utils::HashMap}; use bevy_vello::prelude::*; use typst_vello::TypstScene; @@ -149,6 +149,7 @@ fn render_velyst_scene( mut commands: Commands, mut q_scenes: Query<(&mut VelloScene, &mut Style)>, mut scene: ResMut>, + func: Res, ) { let scene = scene.bypass_change_detection(); @@ -166,7 +167,7 @@ fn render_velyst_scene( coordinate_space: CoordinateSpace::ScreenSpace, ..default() }) - .insert(NodeBundle::default()) + .insert((NodeBundle::default(), func.render_layers())) .id(), ); } @@ -359,6 +360,10 @@ pub struct TypstLabel(TypLabel); pub trait TypstFunc: Resource { fn func_name(&self) -> &str; + fn render_layers(&self) -> RenderLayers { + RenderLayers::layer(0) + } + // TODO: Create macro to automatically generate the content function. fn content(&self, func: foundations::Func) -> Content; From 768ec244897c64c3f9e02330c8474e4f2dbe3d82 Mon Sep 17 00:00:00 2001 From: Nixon Date: Mon, 16 Sep 2024 21:58:21 +0800 Subject: [PATCH 2/3] fix: hide cached NodeBundle when not in used --- src/renderer.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index 5782f5a..476afa2 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -176,7 +176,7 @@ fn render_velyst_scene( /// Construct the interaction tree using bevy ui nodes. fn construct_interaction_tree( mut commands: Commands, - mut q_nodes: Query<(&mut Style, &mut Transform, &mut ZIndex)>, + mut q_nodes: Query<(&mut Style, &mut Transform, &mut ZIndex, &mut Visibility)>, mut scene: ResMut>, ) { let scene = scene.bypass_change_detection(); @@ -215,7 +215,7 @@ fn construct_interaction_tree( let height = Val::Px(group.size().y as f32); let scale = Vec3::new(coeffs[0] as f32, coeffs[3] as f32, 0.0); - if let Some((mut style, mut transform, mut z_index)) = scene + if let Some((mut style, mut transform, mut z_index, mut viz)) = scene .cached_entities .get_mut(&label) .and_then(|entities| entities.iter_mut().find(|(_, used)| *used == false)) @@ -233,6 +233,8 @@ fn construct_interaction_tree( transform.scale = scale; // ZIndex *z_index = ZIndex::Local(i as i32); + // Visibility + *viz = Visibility::Inherited; } else { let new_entity = commands .spawn(( @@ -267,6 +269,17 @@ fn construct_interaction_tree( } } } + + for entities in scene.cached_entities.values() { + for (entity, used) in entities { + match *used { + true => continue, + false => { + commands.entity(*entity).insert(Visibility::Hidden); + } + } + } + } } #[derive(Resource, Deref, DerefMut)] From 068926bcb7e8f56b9318ad1a58f17a0deb1f87bb Mon Sep 17 00:00:00 2001 From: Nixon Date: Mon, 16 Sep 2024 23:38:29 +0800 Subject: [PATCH 3/3] chore: add comments --- src/renderer.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderer.rs b/src/renderer.rs index 476afa2..2703762 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -215,6 +215,7 @@ fn construct_interaction_tree( let height = Val::Px(group.size().y as f32); let scale = Vec3::new(coeffs[0] as f32, coeffs[3] as f32, 0.0); + // Reuse cached nodes when available, otherwise, spawn a new one. if let Some((mut style, mut transform, mut z_index, mut viz)) = scene .cached_entities .get_mut(&label) @@ -270,6 +271,7 @@ fn construct_interaction_tree( } } + // Hide unused cached nodes for entities in scene.cached_entities.values() { for (entity, used) in entities { match *used { @@ -373,6 +375,7 @@ pub struct TypstLabel(TypLabel); pub trait TypstFunc: Resource { fn func_name(&self) -> &str; + // TODO: Create macro to automatically generate the render layers function. fn render_layers(&self) -> RenderLayers { RenderLayers::layer(0) }