From d6a9711ceb68ec1a11d9c9577381992d2beffd0e Mon Sep 17 00:00:00 2001 From: shadow cat Date: Fri, 28 Nov 2025 16:09:23 -0500 Subject: [PATCH] fix mask render bug (didn't recreate bind group) --- src/core/text/mod.rs | 18 ++++++++++++++++-- src/layout/painter.rs | 2 +- src/render/data.rs | 2 +- src/render/mod.rs | 12 ++++++++---- src/render/primitive.rs | 4 +++- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/core/text/mod.rs b/src/core/text/mod.rs index 7b7ef44..11ac44c 100644 --- a/src/core/text/mod.rs +++ b/src/core/text/mod.rs @@ -80,10 +80,24 @@ impl TextView { self.tex.as_ref() } pub fn desired_width(&mut self, ctx: &mut SizeCtx) -> Len { - Len::abs(self.render(ctx).size.x) + if let Some(hint) = &self.hint + && let [line] = &self.buf.lines[..] + && line.text().is_empty() + { + ctx.width(hint) + } else { + Len::abs(self.render(ctx).size.x) + } } pub fn desired_height(&mut self, ctx: &mut SizeCtx) -> Len { - Len::abs(self.render(ctx).size.y) + if let Some(hint) = &self.hint + && let [line] = &self.buf.lines[..] + && line.text().is_empty() + { + ctx.height(hint) + } else { + Len::abs(self.render(ctx).size.y) + } } pub fn draw(&mut self, painter: &mut Painter) -> UiRegion { let tex = self.render(&mut painter.size_ctx()); diff --git a/src/layout/painter.rs b/src/layout/painter.rs index 7fd9220..8d04ec3 100644 --- a/src/layout/painter.rs +++ b/src/layout/painter.rs @@ -1,6 +1,6 @@ use crate::{ layout::{ - Axis, PrimitiveLayers, Len, Modules, Size, TextAttrs, TextBuffer, TextData, RenderedText, + Axis, Len, Modules, PrimitiveLayers, RenderedText, Size, TextAttrs, TextBuffer, TextData, TextureHandle, Textures, UiRegion, UiVec2, Vec2, WidgetId, Widgets, }, render::{Mask, MaskIdx, Primitive, PrimitiveHandle, PrimitiveInst}, diff --git a/src/render/data.rs b/src/render/data.rs index 05eeb44..f630bb9 100644 --- a/src/render/data.rs +++ b/src/render/data.rs @@ -44,7 +44,7 @@ impl MaskIdx { } #[repr(C)] -#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] pub struct Mask { pub region: UiRegion, } diff --git a/src/render/mod.rs b/src/render/mod.rs index 8b3ba03..06621e9 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -96,15 +96,19 @@ impl UiRenderer { device, &self.primitive_layout, rlayer.primitives.buffers(), - ) + ); + primitives.updated = false; } } - if self.textures.update(&mut ui.data.textures) { - self.rsc_group = Self::rsc_group(device, &self.rsc_layout, &self.textures, &self.masks) - } + let mut changed = false; + changed |= self.textures.update(&mut ui.data.textures); if ui.data.masks.changed { ui.data.masks.changed = false; self.masks.update(device, queue, &ui.data.masks[..]); + changed = true; + } + if changed { + self.rsc_group = Self::rsc_group(device, &self.rsc_layout, &self.textures, &self.masks); } } diff --git a/src/render/primitive.rs b/src/render/primitive.rs index 62fbec1..2ba991a 100644 --- a/src/render/primitive.rs +++ b/src/render/primitive.rs @@ -40,7 +40,7 @@ macro_rules! primitives { ($($name:ident: $ty:ty => $binding:expr,)*) => { #[derive(Default)] pub struct PrimitiveData { - $($name: PrimitiveVec<$ty>,)* + $(pub(crate) $name: PrimitiveVec<$ty>,)* } pub struct PrimitiveBuffers { @@ -116,6 +116,7 @@ impl Primitives { mask_idx, }: PrimitiveInst

, ) -> PrimitiveHandle { + self.updated = true; let vec = P::vec(&mut self.data); let i = vec.add(primitive); let inst = PrimitiveInstance { @@ -153,6 +154,7 @@ impl Primitives { } pub fn free(&mut self, h: &PrimitiveHandle) -> MaskIdx { + self.updated = true; self.data.free(h.binding, h.data_idx); self.free.push(h.inst_idx); self.instances[h.inst_idx].mask_idx