mirror of
https://github.com/slint-ui/slint.git
synced 2025-10-02 22:54:36 +00:00

Removed the drop and create from the ComponentVTable: since we are not using VBox<ComponentVTable>, this simplifies a bit the code of the interpreter and everything else. But there is still a lot of changes everywhere to support that the Component is pinned. This is just for the component. Which would be required if later we want to access the properties as Pin<Property<_>>. But we have not yet ability to do projections
64 lines
2.2 KiB
Rust
64 lines
2.2 KiB
Rust
use super::abi::datastructures::ItemRef;
|
|
use super::graphics::{
|
|
Frame, GraphicsBackend, HasRenderingPrimitive, RenderingCache, RenderingPrimitivesBuilder,
|
|
};
|
|
use super::EvaluationContext;
|
|
use cgmath::{Matrix4, SquareMatrix, Vector3};
|
|
|
|
pub(crate) fn update_item_rendering_data<Backend: GraphicsBackend>(
|
|
context: &EvaluationContext,
|
|
item: ItemRef<'_>,
|
|
rendering_cache: &mut RenderingCache<Backend>,
|
|
rendering_primitives_builder: &mut Backend::RenderingPrimitivesBuilder,
|
|
) {
|
|
let item_rendering_primitive = item.rendering_primitive(context);
|
|
|
|
let rendering_data = item.cached_rendering_data_offset();
|
|
|
|
let last_rendering_primitive =
|
|
rendering_data.low_level_rendering_primitive(&rendering_cache).map(|ll| ll.primitive());
|
|
|
|
if let Some(last_rendering_primitive) = last_rendering_primitive {
|
|
if *last_rendering_primitive == item_rendering_primitive {
|
|
//println!("Keeping ... {:?}", item_rendering_info);
|
|
return;
|
|
}
|
|
}
|
|
|
|
println!(
|
|
"Updating rendering primitives for ... {:?} (old data: {:?})",
|
|
item_rendering_primitive, last_rendering_primitive
|
|
);
|
|
|
|
rendering_data.cache_index.set(
|
|
rendering_cache
|
|
.allocate_entry(rendering_primitives_builder.create(item_rendering_primitive)),
|
|
);
|
|
rendering_data.cache_ok.set(true);
|
|
}
|
|
|
|
pub(crate) fn render_component_items<Backend: GraphicsBackend>(
|
|
component: crate::ComponentRefPin,
|
|
frame: &mut Backend::Frame,
|
|
rendering_cache: &RenderingCache<Backend>,
|
|
) {
|
|
let transform = Matrix4::identity();
|
|
|
|
crate::item_tree::visit_items(
|
|
component,
|
|
|context, item, transform| {
|
|
let origin = item.geometry(context).origin;
|
|
let transform =
|
|
transform * Matrix4::from_translation(Vector3::new(origin.x, origin.y, 0.));
|
|
|
|
let cached_rendering_data = item.cached_rendering_data_offset();
|
|
if cached_rendering_data.cache_ok.get() {
|
|
let primitive = rendering_cache.entry_at(cached_rendering_data.cache_index.get());
|
|
frame.render_primitive(&primitive, &transform);
|
|
}
|
|
|
|
transform
|
|
},
|
|
transform,
|
|
);
|
|
}
|