Parcourir la source

wallet: image customize UV rect

darkfi il y a 1 an
Parent
commit
209c4f7c1e

+ 7 - 0
bin/darkwallet/src/app/node.rs

@@ -88,6 +88,13 @@ pub fn create_image(name: &str) -> SceneNode {
     prop.allow_exprs();
     prop.allow_exprs();
     node.add_property(prop).unwrap();
     node.add_property(prop).unwrap();
 
 
+    let mut prop = Property::new("uv", PropertyType::Float32, PropertySubType::Pixel);
+    prop.set_array_len(4);
+    prop.allow_exprs();
+    prop.set_range_f32(0., 1.);
+    prop.set_defaults_f32(vec![0., 0., 1., 1.]).unwrap();
+    node.add_property(prop).unwrap();
+
     let prop = Property::new("z_index", PropertyType::Uint32, PropertySubType::Null);
     let prop = Property::new("z_index", PropertyType::Uint32, PropertySubType::Null);
     node.add_property(prop).unwrap();
     node.add_property(prop).unwrap();
 
 

+ 5 - 0
bin/darkwallet/src/app/schema.rs

@@ -486,6 +486,11 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     prop.set_f32(Role::App, 1, 0.).unwrap();
     prop.set_f32(Role::App, 1, 0.).unwrap();
     prop.set_expr(Role::App, 2, expr::load_var("w")).unwrap();
     prop.set_expr(Role::App, 2, expr::load_var("w")).unwrap();
     prop.set_expr(Role::App, 3, expr::load_var("h")).unwrap();
     prop.set_expr(Role::App, 3, expr::load_var("h")).unwrap();
+    let prop = node.get_property("uv").unwrap();
+    prop.set_f32(Role::App, 0, 0.).unwrap();
+    prop.set_f32(Role::App, 1, 0.).unwrap();
+    prop.set_f32(Role::App, 2, 1.).unwrap();
+    prop.set_f32(Role::App, 3, 1.).unwrap();
     node.set_property_str(Role::App, "path", BG_PATH).unwrap();
     node.set_property_str(Role::App, "path", BG_PATH).unwrap();
     node.set_property_u32(Role::App, "z_index", 0).unwrap();
     node.set_property_u32(Role::App, "z_index", 0).unwrap();
     let node = node.setup(|me| Image::new(me, app.render_api.clone(), app.ex.clone())).await;
     let node = node.setup(|me| Image::new(me, app.render_api.clone(), app.ex.clone())).await;

+ 8 - 7
bin/darkwallet/src/ui/image.rs

@@ -47,6 +47,7 @@ pub struct Image {
     dc_key: u64,
     dc_key: u64,
 
 
     rect: PropertyRect,
     rect: PropertyRect,
+    uv: PropertyRect,
     z_index: PropertyUint32,
     z_index: PropertyUint32,
     path: PropertyStr,
     path: PropertyStr,
 
 
@@ -59,6 +60,7 @@ impl Image {
 
 
         let node_ref = &node.upgrade().unwrap();
         let node_ref = &node.upgrade().unwrap();
         let rect = PropertyRect::wrap(node_ref, Role::Internal, "rect").unwrap();
         let rect = PropertyRect::wrap(node_ref, Role::Internal, "rect").unwrap();
+        let uv = PropertyRect::wrap(node_ref, Role::Internal, "uv").unwrap();
         let z_index = PropertyUint32::wrap(node_ref, Role::Internal, "z_index", 0).unwrap();
         let z_index = PropertyUint32::wrap(node_ref, Role::Internal, "z_index", 0).unwrap();
         let path = PropertyStr::wrap(node_ref, Role::Internal, "path", 0).unwrap();
         let path = PropertyStr::wrap(node_ref, Role::Internal, "path", 0).unwrap();
 
 
@@ -68,6 +70,7 @@ impl Image {
         let self_ = Arc::new_cyclic(|me: &Weak<Self>| {
         let self_ = Arc::new_cyclic(|me: &Weak<Self>| {
             let mut on_modify = OnModify::new(ex, node_name, node_id, me.clone());
             let mut on_modify = OnModify::new(ex, node_name, node_id, me.clone());
             on_modify.when_change(rect.prop(), Self::redraw);
             on_modify.when_change(rect.prop(), Self::redraw);
+            on_modify.when_change(uv.prop(), Self::redraw);
             on_modify.when_change(z_index.prop(), Self::redraw);
             on_modify.when_change(z_index.prop(), Self::redraw);
             on_modify.when_change(path.prop(), Self::reload);
             on_modify.when_change(path.prop(), Self::reload);
 
 
@@ -81,6 +84,7 @@ impl Image {
                 dc_key: OsRng.gen(),
                 dc_key: OsRng.gen(),
 
 
                 rect,
                 rect,
+                uv,
                 z_index,
                 z_index,
                 path,
                 path,
 
 
@@ -137,9 +141,7 @@ impl Image {
         };
         };
         self.render_api.replace_draw_calls(draw_update.draw_calls);
         self.render_api.replace_draw_calls(draw_update.draw_calls);
         debug!(target: "ui::image", "replace draw calls done");
         debug!(target: "ui::image", "replace draw calls done");
-        for texture in draw_update.freed_textures {
-            self.render_api.delete_texture(texture);
-        }
+        assert!(draw_update.freed_textures.is_empty());
         for buff in draw_update.freed_buffers {
         for buff in draw_update.freed_buffers {
             self.render_api.delete_buffer(buff);
             self.render_api.delete_buffer(buff);
         }
         }
@@ -148,7 +150,7 @@ impl Image {
     /// Called whenever any property changes.
     /// Called whenever any property changes.
     fn regen_mesh(&self) -> MeshInfo {
     fn regen_mesh(&self) -> MeshInfo {
         let rect = self.rect.get();
         let rect = self.rect.get();
-        let uv = Rectangle::from([0., 0., 1., 1.]);
+        let uv = self.uv.get();
         let mesh_rect = Rectangle::from([0., 0., rect.w, rect.h]);
         let mesh_rect = Rectangle::from([0., 0., rect.w, rect.h]);
         let mut mesh = MeshBuilder::new();
         let mut mesh = MeshBuilder::new();
         mesh.draw_box(&mesh_rect, COLOR_WHITE, &uv);
         mesh.draw_box(&mesh_rect, COLOR_WHITE, &uv);
@@ -158,13 +160,12 @@ impl Image {
     async fn get_draw_calls(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
     async fn get_draw_calls(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
         self.rect.eval(&parent_rect).ok()?;
         self.rect.eval(&parent_rect).ok()?;
         let rect = self.rect.get();
         let rect = self.rect.get();
+        self.uv.eval(&rect).ok()?;
 
 
         let mesh = self.regen_mesh();
         let mesh = self.regen_mesh();
         let old_mesh = std::mem::replace(&mut *self.mesh.lock().unwrap(), Some(mesh.clone()));
         let old_mesh = std::mem::replace(&mut *self.mesh.lock().unwrap(), Some(mesh.clone()));
 
 
-        let Some(texture_id) = *self.texture.lock().unwrap() else {
-            panic!("Node missing texture_id!");
-        };
+        let texture_id = self.texture.lock().unwrap().expect("Node missing texture_id!");
 
 
         // We're finished with these so clean up.
         // We're finished with these so clean up.
         let mut freed_buffers = vec![];
         let mut freed_buffers = vec![];