Kaynağa Gözat

app/vector_art: add scale property

jkds 6 ay önce
ebeveyn
işleme
c1e6a097e3

+ 1 - 0
bin/app/Cargo.lock

@@ -1475,6 +1475,7 @@ dependencies = [
  "libc",
  "nu-ansi-term",
  "num-bigint",
+ "parking_lot 0.12.5",
  "pin-project-lite",
  "quinn",
  "rand 0.8.5",

+ 5 - 0
bin/app/src/app/node.rs

@@ -78,6 +78,11 @@ pub fn create_vector_art(name: &str) -> SceneNode {
     prop.allow_exprs();
     node.add_property(prop).unwrap();
 
+    let mut prop = Property::new("scale", PropertyType::Float32, PropertySubType::Null);
+    prop.set_ui_text("Scale", "Scale factor for the vector art");
+    prop.set_defaults_f32(vec![1.0]).unwrap();
+    node.add_property(prop).unwrap();
+
     let prop = Property::new("z_index", PropertyType::Uint32, PropertySubType::Null);
     node.add_property(prop).unwrap();
 

+ 16 - 12
bin/app/src/app/schema/mod.rs

@@ -343,9 +343,10 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-    let mut shape = shape::create_netlogo1([1., 0., 0.25, 1.]).scaled(NETLOGO_SCALE);
-    shape.join(shape::create_netlogo2([0.27, 0.4, 0.4, 1.]).scaled(NETLOGO_SCALE));
-    shape.join(shape::create_netlogo3([0.27, 0.4, 0.4, 1.]).scaled(NETLOGO_SCALE));
+    node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
+    let mut shape = shape::create_netlogo1([1., 0., 0.25, 1.]);
+    shape.join(shape::create_netlogo2([0.27, 0.4, 0.4, 1.]));
+    shape.join(shape::create_netlogo3([0.27, 0.4, 0.4, 1.]));
     let net0_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net0_node);
 
@@ -357,9 +358,10 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-    let mut shape = shape::create_netlogo1([0.49, 0.57, 1., 1.]).scaled(NETLOGO_SCALE);
-    shape.join(shape::create_netlogo2([0.49, 0.57, 1., 1.]).scaled(NETLOGO_SCALE));
-    shape.join(shape::create_netlogo3([0.27, 0.4, 0.4, 1.]).scaled(NETLOGO_SCALE));
+    node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
+    let mut shape = shape::create_netlogo1([0.49, 0.57, 1., 1.]);
+    shape.join(shape::create_netlogo2([0.49, 0.57, 1., 1.]));
+    shape.join(shape::create_netlogo3([0.27, 0.4, 0.4, 1.]));
     let net1_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net1_node);
 
@@ -371,9 +373,10 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-    let mut shape = shape::create_netlogo1([0., 0.94, 1., 1.]).scaled(NETLOGO_SCALE);
-    shape.join(shape::create_netlogo2([0., 0.94, 1., 1.]).scaled(NETLOGO_SCALE));
-    shape.join(shape::create_netlogo3([0., 0.94, 1., 1.]).scaled(NETLOGO_SCALE));
+    node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
+    let mut shape = shape::create_netlogo1([0., 0.94, 1., 1.]);
+    shape.join(shape::create_netlogo2([0., 0.94, 1., 1.]));
+    shape.join(shape::create_netlogo3([0., 0.94, 1., 1.]));
     let net2_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net2_node);
 
@@ -385,9 +388,10 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
     node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-    let mut shape = shape::create_netlogo1([0., 0.94, 1., 1.]).scaled(NETLOGO_SCALE);
-    shape.join(shape::create_netlogo2([0., 0.94, 1., 1.]).scaled(NETLOGO_SCALE));
-    shape.join(shape::create_netlogo3([0., 0.94, 1., 1.]).scaled(NETLOGO_SCALE));
+    node.set_property_f32(atom, Role::App, "scale", NETLOGO_SCALE).unwrap();
+    let mut shape = shape::create_netlogo1([0., 0.94, 1., 1.]);
+    shape.join(shape::create_netlogo2([0., 0.94, 1., 1.]));
+    shape.join(shape::create_netlogo3([0., 0.94, 1., 1.]));
     let net3_node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     netlayer_node.link(net3_node);
 

+ 17 - 3
bin/app/src/ui/vector_art/mod.rs

@@ -23,8 +23,11 @@ use std::sync::Arc;
 use tracing::instrument;
 
 use crate::{
-    gfx::{gfxtag, DrawCall, DrawInstruction, DrawMesh, Rectangle, RenderApi, Renderer},
-    prop::{BatchGuardPtr, PropertyAtomicGuard, PropertyBool, PropertyRect, PropertyUint32, Role},
+    gfx::{gfxtag, DrawCall, DrawInstruction, DrawMesh, Point, Rectangle, RenderApi, Renderer},
+    prop::{
+        BatchGuardPtr, PropertyAtomicGuard, PropertyBool, PropertyFloat32, PropertyRect,
+        PropertyUint32, Role,
+    },
     scene::{Pimpl, SceneNodeWeak},
     ExecutorPtr,
 };
@@ -46,6 +49,7 @@ pub struct VectorArt {
 
     is_visible: PropertyBool,
     rect: PropertyRect,
+    scale: PropertyFloat32,
     z_index: PropertyUint32,
     priority: PropertyUint32,
 
@@ -57,6 +61,7 @@ impl VectorArt {
         let node_ref = &node.upgrade().unwrap();
         let is_visible = PropertyBool::wrap(node_ref, Role::Internal, "is_visible", 0).unwrap();
         let rect = PropertyRect::wrap(node_ref, Role::Internal, "rect").unwrap();
+        let scale = PropertyFloat32::wrap(node_ref, Role::Internal, "scale", 0).unwrap();
         let z_index = PropertyUint32::wrap(node_ref, Role::Internal, "z_index", 0).unwrap();
         let priority = PropertyUint32::wrap(node_ref, Role::Internal, "priority", 0).unwrap();
 
@@ -70,6 +75,7 @@ impl VectorArt {
 
             is_visible,
             rect,
+            scale,
             z_index,
             priority,
 
@@ -101,10 +107,17 @@ impl VectorArt {
         }
 
         let rect = self.rect.get();
-        let verts = self.shape.eval(rect.w, rect.h).expect("bad shape");
+        let scale = self.scale.get();
+        let mut verts = self.shape.eval(rect.w, rect.h).expect("bad shape");
         let indices = self.shape.indices.clone();
         let num_elements = self.shape.indices.len() as i32;
 
+        // Apply scaling
+        for v in &mut verts {
+            v.pos[0] *= scale;
+            v.pos[1] *= scale;
+        }
+
         //debug!(target: "ui::vector_art", "vec_draw_instrs {verts:?} | {indices:?} | {num_elements}");
         let vertex_buffer = self.renderer.new_vertex_buffer(verts, gfxtag!("vectorart"));
         let index_buffer = self.renderer.new_index_buffer(indices, gfxtag!("vectorart"));
@@ -145,6 +158,7 @@ impl UIObject for VectorArt {
         let mut on_modify = OnModify::new(ex, self.node.clone(), me.clone());
         on_modify.when_change(self.is_visible.prop(), Self::redraw);
         on_modify.when_change(self.rect.prop(), Self::redraw);
+        on_modify.when_change(self.scale.prop(), Self::redraw);
         on_modify.when_change(self.z_index.prop(), Self::redraw);
 
         *self.tasks.lock() = on_modify.tasks;