reactivity base

This commit is contained in:
2025-08-10 02:05:35 -04:00
parent 56beeb80f3
commit 58d9b32077
12 changed files with 394 additions and 328 deletions

View File

@@ -8,23 +8,19 @@ pub use def::*;
pub use format::*;
pub use point::*;
use crate::{render::data::PrimitiveInstance, UINode};
use crate::{render::data::PrimitiveInstance, WidgetId, Widgets};
use bytemuck::Pod;
pub struct Painter {
pub region: UIRegion,
#[derive(Default)]
pub struct Primitives {
pub instances: Vec<PrimitiveInstance>,
pub data: Vec<u32>,
}
impl Default for Painter {
fn default() -> Self {
Self {
region: UIRegion::full(),
instances: Default::default(),
data: Default::default(),
}
}
pub struct Painter<'a> {
nodes: &'a Widgets,
primitives: Primitives,
pub region: UIRegion,
}
/// NOTE: Self must have at least u32 alignment
@@ -32,19 +28,36 @@ pub trait PrimitiveData: Pod {
const DISCRIM: u32;
}
impl Painter {
pub fn write<D: PrimitiveData>(&mut self, data: D) {
let ptr = self.data.len() as u32;
impl<'a> Painter<'a> {
pub fn new(nodes: &'a Widgets) -> Self {
Self {
nodes,
primitives: Primitives::default(),
region: UIRegion::full(),
}
}
pub fn write<Data: PrimitiveData>(&mut self, data: Data) {
let ptr = self.primitives.data.len() as u32;
let region = self.region;
self.instances.push(PrimitiveInstance { region, ptr });
self.data.push(D::DISCRIM);
self.data
self.primitives
.instances
.push(PrimitiveInstance { region, ptr });
self.primitives.data.push(Data::DISCRIM);
self.primitives
.data
.extend_from_slice(bytemuck::cast_slice::<_, u32>(&[data]));
}
pub fn draw_within(&mut self, node: &impl UINode, region: UIRegion) {
pub fn draw(&mut self, node: &WidgetId) {
self.nodes.get(node).draw(self);
}
pub fn draw_within(&mut self, node: &WidgetId, region: UIRegion) {
let old = self.region;
self.region.select(&region);
node.draw(self);
self.draw(node);
self.region = old;
}
pub fn finish(self) -> Primitives {
self.primitives
}
}