Prechádzať zdrojové kódy

wallet: add a paperlight color scheme

darkfi 1 rok pred
rodič
commit
64e43d610a

+ 45 - 23
bin/darkwallet/src/app/schema/chat.rs

@@ -48,7 +48,7 @@ use crate::{
     ExecutorPtr,
 };
 
-const LIGHTMODE: bool = false;
+use super::{ColorScheme, COLOR_SCHEME};
 
 mod android_ui_consts {
     use crate::gfx::{Point, Rectangle};
@@ -259,27 +259,31 @@ pub async fn make(
     prop.set_f32(Role::App, 3, CHATEDIT_HEIGHT).unwrap();
     node.set_property_u32(Role::App, "z_index", 2).unwrap();
 
+    let (bg_color, sep_color) = match COLOR_SCHEME {
+        ColorScheme::DarkMode => ([0., 0.11, 0.11, 1.], [0.41, 0.6, 0.65, 1.]),
+        ColorScheme::PaperLight => ([1., 1., 1., 1.], [0., 0.6, 0.65, 1.]),
+    };
     let mut shape = VectorShape::new();
     shape.add_filled_box(
         expr::const_f32(0.),
         expr::const_f32(0.),
         expr::const_f32(EMOJI_BG_W),
         expr::load_var("h"),
-        [0., 0.11, 0.11, 1.],
+        bg_color,
     );
     shape.add_filled_box(
         expr::const_f32(EMOJI_BG_W),
         expr::const_f32(0.),
         expr::const_f32(EMOJI_BG_W + 1.),
         expr::load_var("h"),
-        [0.41, 0.6, 0.65, 1.],
+        sep_color,
     );
     shape.add_filled_box(
         expr::const_f32(0.),
         expr::load_var("h"),
         expr::load_var("w"),
         cc.compile("h + 1").unwrap(),
-        [0.41, 0.6, 0.65, 1.],
+        sep_color,
     );
 
     let node =
@@ -342,10 +346,17 @@ pub async fn make(
     //node.set_property_bool(Role::App, "debug", true).unwrap();
     //node.set_property_str(Role::App, "text", "anon1").unwrap();
     let prop = node.get_property("text_color").unwrap();
-    prop.set_f32(Role::App, 0, 1.).unwrap();
-    prop.set_f32(Role::App, 1, 1.).unwrap();
-    prop.set_f32(Role::App, 2, 1.).unwrap();
-    prop.set_f32(Role::App, 3, 1.).unwrap();
+    if COLOR_SCHEME == ColorScheme::DarkMode {
+        prop.set_f32(Role::App, 0, 1.).unwrap();
+        prop.set_f32(Role::App, 1, 1.).unwrap();
+        prop.set_f32(Role::App, 2, 1.).unwrap();
+        prop.set_f32(Role::App, 3, 1.).unwrap();
+    } else if COLOR_SCHEME == ColorScheme::PaperLight {
+        prop.set_f32(Role::App, 0, 0.).unwrap();
+        prop.set_f32(Role::App, 1, 0.).unwrap();
+        prop.set_f32(Role::App, 2, 0.).unwrap();
+        prop.set_f32(Role::App, 3, 1.).unwrap();
+    }
     node.set_property_u32(Role::App, "z_index", 3).unwrap();
 
     let node = node
@@ -494,12 +505,12 @@ pub async fn make(
     prop.set_f32(Role::App, 2, 0.647).unwrap();
     prop.set_f32(Role::App, 3, 1.).unwrap();
     let prop = node.get_property("text_color").unwrap();
-    if LIGHTMODE {
+    if COLOR_SCHEME == ColorScheme::PaperLight {
         prop.set_f32(Role::App, 0, 0.).unwrap();
         prop.set_f32(Role::App, 1, 0.).unwrap();
         prop.set_f32(Role::App, 2, 0.).unwrap();
         prop.set_f32(Role::App, 3, 1.).unwrap();
-    } else {
+    } else if COLOR_SCHEME == ColorScheme::DarkMode {
         prop.set_f32(Role::App, 0, 1.).unwrap();
         prop.set_f32(Role::App, 1, 1.).unwrap();
         prop.set_f32(Role::App, 2, 1.).unwrap();
@@ -525,12 +536,12 @@ pub async fn make(
     }
 
     let prop = node.get_property("hi_bg_color").unwrap();
-    if LIGHTMODE {
+    if COLOR_SCHEME == ColorScheme::PaperLight {
         prop.set_f32(Role::App, 0, 0.5).unwrap();
         prop.set_f32(Role::App, 1, 0.5).unwrap();
         prop.set_f32(Role::App, 2, 0.5).unwrap();
         prop.set_f32(Role::App, 3, 1.).unwrap();
-    } else {
+    } else if COLOR_SCHEME == ColorScheme::DarkMode {
         prop.set_f32(Role::App, 0, 0.5).unwrap();
         prop.set_f32(Role::App, 1, 0.5).unwrap();
         prop.set_f32(Role::App, 2, 0.5).unwrap();
@@ -595,6 +606,13 @@ pub async fn make(
 
     let editbox_bg_rect_prop = prop.clone();
 
+    let (bg_color, lhs_bg_color, line_color) = match COLOR_SCHEME {
+        ColorScheme::DarkMode => {
+            ([0., 0.13, 0.08, 1.], [0., 0.11, 0.11, 1.], [0.41, 0.6, 0.65, 1.])
+        }
+        ColorScheme::PaperLight => ([1., 1., 1., 1.], [1., 1., 1., 1.], [0., 0., 0., 1.]),
+    };
+
     let mut shape = VectorShape::new();
     // Main green background
     shape.add_filled_box(
@@ -602,7 +620,7 @@ pub async fn make(
         expr::const_f32(0.),
         expr::load_var("w"),
         expr::load_var("h"),
-        [0., 0.13, 0.08, 1.],
+        bg_color,
     );
     // Left hand darker box
     shape.add_filled_box(
@@ -610,7 +628,7 @@ pub async fn make(
         expr::const_f32(1.),
         expr::const_f32(EMOJI_BG_W),
         expr::load_var("h"),
-        [0., 0.11, 0.11, 1.],
+        lhs_bg_color,
     );
     // Top line
     shape.add_filled_box(
@@ -618,7 +636,7 @@ pub async fn make(
         expr::const_f32(0.),
         expr::load_var("w"),
         expr::const_f32(1.),
-        [0.41, 0.6, 0.65, 1.],
+        line_color,
     );
     // Side line
     shape.add_filled_box(
@@ -626,7 +644,7 @@ pub async fn make(
         expr::const_f32(0.),
         expr::const_f32(EMOJI_BG_W + 1.),
         expr::load_var("h"),
-        [0.41, 0.6, 0.65, 1.],
+        line_color,
     );
     // Bottom line
     //shape.add_filled_box(
@@ -665,7 +683,11 @@ pub async fn make(
     prop.set_f32(Role::App, 2, 500.).unwrap();
     prop.set_f32(Role::App, 3, 500.).unwrap();
     node.set_property_u32(Role::App, "z_index", 5).unwrap();
-    let shape = shape::create_emoji_selector().scaled(EMOJI_SCALE);
+    let color = match COLOR_SCHEME {
+        ColorScheme::DarkMode => [0., 1., 1., 1.],
+        ColorScheme::PaperLight => [0., 0., 0., 1.],
+    };
+    let shape = shape::create_emoji_selector(color).scaled(EMOJI_SCALE);
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
     layer_node.clone().link(node);
@@ -726,12 +748,12 @@ pub async fn make(
     node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap();
     //node.set_property_str(Role::App, "text", "hello king!😁🍆jelly 🍆1234").unwrap();
     let prop = node.get_property("text_color").unwrap();
-    if LIGHTMODE {
+    if COLOR_SCHEME == ColorScheme::PaperLight {
         prop.set_f32(Role::App, 0, 0.).unwrap();
         prop.set_f32(Role::App, 1, 0.).unwrap();
         prop.set_f32(Role::App, 2, 0.).unwrap();
         prop.set_f32(Role::App, 3, 1.).unwrap();
-    } else {
+    } else if COLOR_SCHEME == ColorScheme::DarkMode {
         prop.set_f32(Role::App, 0, 1.).unwrap();
         prop.set_f32(Role::App, 1, 1.).unwrap();
         prop.set_f32(Role::App, 2, 1.).unwrap();
@@ -758,24 +780,24 @@ pub async fn make(
     node.set_property_f32(Role::App, "select_descent", CHATEDIT_SELECT_DESCENT).unwrap();
     node.set_property_f32(Role::App, "handle_descent", CHATEDIT_HANDLE_DESCENT).unwrap();
     let prop = node.get_property("hi_bg_color").unwrap();
-    if LIGHTMODE {
+    if COLOR_SCHEME == ColorScheme::PaperLight {
         prop.set_f32(Role::App, 0, 0.5).unwrap();
         prop.set_f32(Role::App, 1, 0.5).unwrap();
         prop.set_f32(Role::App, 2, 0.5).unwrap();
         prop.set_f32(Role::App, 3, 1.).unwrap();
-    } else {
+    } else if COLOR_SCHEME == ColorScheme::DarkMode {
         prop.set_f32(Role::App, 0, 0.).unwrap();
         prop.set_f32(Role::App, 1, 0.27).unwrap();
         prop.set_f32(Role::App, 2, 0.22).unwrap();
         prop.set_f32(Role::App, 3, 1.).unwrap();
     }
     let prop = node.get_property("cmd_bg_color").unwrap();
-    if LIGHTMODE {
+    if COLOR_SCHEME == ColorScheme::PaperLight {
         prop.set_f32(Role::App, 0, 0.5).unwrap();
         prop.set_f32(Role::App, 1, 0.5).unwrap();
         prop.set_f32(Role::App, 2, 0.5).unwrap();
         prop.set_f32(Role::App, 3, 1.).unwrap();
-    } else {
+    } else if COLOR_SCHEME == ColorScheme::DarkMode {
         prop.set_f32(Role::App, 0, 0.).unwrap();
         prop.set_f32(Role::App, 1, 0.30).unwrap();
         prop.set_f32(Role::App, 2, 0.25).unwrap();

+ 37 - 13
bin/darkwallet/src/app/schema/menu.rs

@@ -43,7 +43,7 @@ use crate::{
     ExecutorPtr,
 };
 
-use super::CHANNELS;
+use super::{ColorScheme, CHANNELS, COLOR_SCHEME};
 
 mod android_ui_consts {
     pub const CHANNEL_LABEL_X: f32 = 40.;
@@ -110,8 +110,10 @@ pub async fn make(app: &App, window: SceneNodePtr) {
     let y1 = expr::const_f32(0.);
     let x2 = expr::load_var("w");
     let y2 = expr::const_f32(CHANNEL_LABEL_LINESPACE);
-    let color1 = [0., 0.11, 0.11, 1.];
-    let color2 = [0., 0., 0., 1.];
+    let (color1, color2) = match COLOR_SCHEME {
+        ColorScheme::DarkMode => ([0., 0.11, 0.11, 1.], [0., 0., 0., 1.]),
+        ColorScheme::PaperLight => ([1., 1., 1., 1.], [1., 1., 1., 1.]),
+    };
     let mut verts = vec![
         ShapeVertex::new(x1.clone(), y1.clone(), color1),
         ShapeVertex::new(x2.clone(), y1.clone(), color1),
@@ -147,10 +149,17 @@ pub async fn make(app: &App, window: SceneNodePtr) {
     node.set_property_str(Role::App, "text", "CHANNELS").unwrap();
     //node.set_property_str(Role::App, "text", "anon1").unwrap();
     let prop = node.get_property("text_color").unwrap();
-    prop.set_f32(Role::App, 0, 0.65).unwrap();
-    prop.set_f32(Role::App, 1, 0.87).unwrap();
-    prop.set_f32(Role::App, 2, 0.83).unwrap();
-    prop.set_f32(Role::App, 3, 1.).unwrap();
+    if COLOR_SCHEME == ColorScheme::DarkMode {
+        prop.set_f32(Role::App, 0, 0.65).unwrap();
+        prop.set_f32(Role::App, 1, 0.87).unwrap();
+        prop.set_f32(Role::App, 2, 0.83).unwrap();
+        prop.set_f32(Role::App, 3, 1.).unwrap();
+    } else if COLOR_SCHEME == ColorScheme::PaperLight {
+        prop.set_f32(Role::App, 0, 0.).unwrap();
+        prop.set_f32(Role::App, 1, 0.).unwrap();
+        prop.set_f32(Role::App, 2, 0.).unwrap();
+        prop.set_f32(Role::App, 3, 1.).unwrap();
+    }
     node.set_property_u32(Role::App, "z_index", 1).unwrap();
 
     let node = node
@@ -180,19 +189,27 @@ pub async fn make(app: &App, window: SceneNodePtr) {
         node.set_property_u32(Role::App, "z_index", 0).unwrap();
 
         let mut shape = VectorShape::new();
+        let bg_color = match COLOR_SCHEME {
+            ColorScheme::DarkMode => [0.05, 0.05, 0.05, 1.],
+            ColorScheme::PaperLight => [1., 1., 1., 1.],
+        };
         shape.add_filled_box(
             expr::const_f32(0.),
             expr::const_f32(0.),
             expr::load_var("w"),
             expr::const_f32(CHANNEL_LABEL_LINESPACE),
-            [0.05, 0.05, 0.05, 1.],
+            bg_color,
         );
+        let sep_color = match COLOR_SCHEME {
+            ColorScheme::DarkMode => [0.4, 0.4, 0.4, 1.],
+            ColorScheme::PaperLight => [0.2, 0.2, 0.2, 1.],
+        };
         shape.add_filled_box(
             expr::const_f32(0.),
             expr::const_f32(CHANNEL_LABEL_LINESPACE - 1.),
             expr::load_var("w"),
             expr::const_f32(CHANNEL_LABEL_LINESPACE),
-            [0.4, 0.4, 0.4, 1.],
+            sep_color,
         );
 
         let node = node
@@ -214,10 +231,17 @@ pub async fn make(app: &App, window: SceneNodePtr) {
         //node.set_property_bool(Role::App, "debug", true).unwrap();
         //node.set_property_str(Role::App, "text", "anon1").unwrap();
         let prop = node.get_property("text_color").unwrap();
-        prop.set_f32(Role::App, 0, 1.).unwrap();
-        prop.set_f32(Role::App, 1, 1.).unwrap();
-        prop.set_f32(Role::App, 2, 1.).unwrap();
-        prop.set_f32(Role::App, 3, 1.).unwrap();
+        if COLOR_SCHEME == ColorScheme::DarkMode {
+            prop.set_f32(Role::App, 0, 1.).unwrap();
+            prop.set_f32(Role::App, 1, 1.).unwrap();
+            prop.set_f32(Role::App, 2, 1.).unwrap();
+            prop.set_f32(Role::App, 3, 1.).unwrap();
+        } else if COLOR_SCHEME == ColorScheme::PaperLight {
+            prop.set_f32(Role::App, 0, 0.).unwrap();
+            prop.set_f32(Role::App, 1, 0.).unwrap();
+            prop.set_f32(Role::App, 2, 0.).unwrap();
+            prop.set_f32(Role::App, 3, 1.).unwrap();
+        }
         node.set_property_u32(Role::App, "z_index", 3).unwrap();
 
         let node = node

+ 98 - 63
bin/darkwallet/src/app/schema/mod.rs

@@ -47,6 +47,8 @@ mod chat;
 mod menu;
 //mod test;
 
+pub const COLOR_SCHEME: ColorScheme = ColorScheme::PaperLight;
+
 mod android_ui_consts {
     pub const EMOJI_PICKER_ICON_SIZE: f32 = 100.;
 }
@@ -96,39 +98,46 @@ use ui_consts::*;
 pub static CHANNELS: &'static [&str] =
     &["dev", "media", "hackers", "memes", "philosophy", "markets", "math", "random"];
 
+#[derive(PartialEq)]
+enum ColorScheme {
+    DarkMode,
+    PaperLight,
+}
+
 pub async fn make(app: &App, window: SceneNodePtr) {
     let mut cc = Compiler::new();
 
-    // Bg layer
-    let layer_node = create_layer("bg_layer");
-    let prop = layer_node.get_property("rect").unwrap();
-    prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
-    layer_node.set_property_bool(Role::App, "is_visible", true).unwrap();
-    layer_node.set_property_u32(Role::App, "z_index", 0).unwrap();
-    let layer_node =
-        layer_node.setup(|me| Layer::new(me, app.render_api.clone(), app.ex.clone())).await;
-    window.clone().link(layer_node.clone());
-
-    // Create a bg image
-    let node = create_image("bg_image");
-    let prop = node.get_property("rect").unwrap();
-    prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
-
-    // Image aspect ratio
-    //let R = 1.78;
-    let R = 1.555;
-    cc.add_const_f32("R", R);
-
-    let prop = node.get_property("uv").unwrap();
-    prop.set_f32(Role::App, 0, 0.).unwrap();
-    prop.set_f32(Role::App, 1, 0.).unwrap();
-    #[rustfmt::skip]
+    if COLOR_SCHEME == ColorScheme::DarkMode {
+        // Bg layer
+        let layer_node = create_layer("bg_layer");
+        let prop = layer_node.get_property("rect").unwrap();
+        prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
+        layer_node.set_property_bool(Role::App, "is_visible", true).unwrap();
+        layer_node.set_property_u32(Role::App, "z_index", 0).unwrap();
+        let layer_node =
+            layer_node.setup(|me| Layer::new(me, app.render_api.clone(), app.ex.clone())).await;
+        window.clone().link(layer_node.clone());
+
+        // Create a bg image
+        let node = create_image("bg_image");
+        let prop = node.get_property("rect").unwrap();
+        prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
+
+        // Image aspect ratio
+        //let R = 1.78;
+        let R = 1.555;
+        cc.add_const_f32("R", R);
+
+        let prop = node.get_property("uv").unwrap();
+        prop.set_f32(Role::App, 0, 0.).unwrap();
+        prop.set_f32(Role::App, 1, 0.).unwrap();
+        #[rustfmt::skip]
     let code = cc.compile("
         r = w / h;
         if r < R {
@@ -137,8 +146,8 @@ pub async fn make(app: &App, window: SceneNodePtr) {
             1
         }
     ").unwrap();
-    prop.set_expr(Role::App, 2, code).unwrap();
-    #[rustfmt::skip]
+        prop.set_expr(Role::App, 2, code).unwrap();
+        #[rustfmt::skip]
     let code = cc.compile("
         r = w / h;
         if r < R {
@@ -147,37 +156,63 @@ pub async fn make(app: &App, window: SceneNodePtr) {
             R / r
         }
     ").unwrap();
-    prop.set_expr(Role::App, 3, code).unwrap();
-
-    node.set_property_str(Role::App, "path", BG_PATH).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;
-    layer_node.clone().link(node);
-
-    // Create a bg mesh on top to fade the bg image
-    let node = create_vector_art("bg");
-    let prop = node.get_property("rect").unwrap();
-    prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
-    node.set_property_u32(Role::App, "z_index", 1).unwrap();
-
-    //let c = if LIGHTMODE { 1. } else { 0. };
-    let c = 0.;
-    // Setup the pimpl
-    let node_id = node.id;
-    let mut shape = VectorShape::new();
-    shape.add_filled_box(
-        expr::const_f32(0.),
-        expr::const_f32(0.),
-        expr::load_var("w"),
-        expr::load_var("h"),
-        [c, c, c, 0.3],
-    );
-    let node =
-        node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.clone().link(node);
+        prop.set_expr(Role::App, 3, code).unwrap();
+
+        node.set_property_str(Role::App, "path", BG_PATH).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;
+        layer_node.clone().link(node);
+
+        // Create a bg mesh on top to fade the bg image
+        let node = create_vector_art("bg");
+        let prop = node.get_property("rect").unwrap();
+        prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
+        node.set_property_u32(Role::App, "z_index", 1).unwrap();
+
+        //let c = if LIGHTMODE { 1. } else { 0. };
+        let c = 0.;
+        // Setup the pimpl
+        let node_id = node.id;
+        let mut shape = VectorShape::new();
+        shape.add_filled_box(
+            expr::const_f32(0.),
+            expr::const_f32(0.),
+            expr::load_var("w"),
+            expr::load_var("h"),
+            [c, c, c, 0.3],
+        );
+        let node = node
+            .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+            .await;
+        layer_node.clone().link(node);
+    } else if COLOR_SCHEME == ColorScheme::PaperLight {
+        let node = create_vector_art("bg");
+        let prop = node.get_property("rect").unwrap();
+        prop.set_f32(Role::App, 0, 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, 3, expr::load_var("h")).unwrap();
+        node.set_property_u32(Role::App, "z_index", 1).unwrap();
+
+        let c = 1.;
+        // Setup the pimpl
+        let node_id = node.id;
+        let mut shape = VectorShape::new();
+        shape.add_filled_box(
+            expr::const_f32(0.),
+            expr::const_f32(0.),
+            expr::load_var("w"),
+            expr::load_var("h"),
+            [c, c, c, 0.3],
+        );
+        let node = node
+            .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+            .await;
+        window.clone().link(node);
+    }
 
     let emoji_meshes = emoji_picker::EmojiMeshes::new(
         app.render_api.clone(),

+ 79 - 76
bin/darkwallet/src/shape/emoji_sel.rs

@@ -1,81 +1,84 @@
-use crate::ui::{ShapeVertex, VectorShape};
-pub fn create_emoji_selector() -> VectorShape {
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
+pub fn create_emoji_selector(color: Color) -> VectorShape {
     VectorShape {
         verts: vec![
-            ShapeVertex::from_xy(-0.299137, -0.077869, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.247956, -0.006422, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.258195, -0.252576, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.192966, -0.231704, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.234915, -0.41554, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.164066, -0.441229, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.408315, -0.607404, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.377605, -0.67564, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.67564, -0.615431, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.705138, -0.685273, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.910051, -0.364965, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.983702, -0.390654, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.861884, -0.187551, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.941957, -0.212437, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.816929, -0.085598, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.871313, -0.035826, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.75672, -0.04867, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.809499, -0.004518, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.750298, -0.045459, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.796655, 0.025185, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.342487, -0.045459, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.302946, 0.02358, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.324826, -0.073557, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.285285, -0.004518, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.294399, -0.075557, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.243218, -0.00411, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.253458, -0.250264, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.188228, -0.229392, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.230177, -0.413228, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.159328, -0.438917, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.403577, -0.605092, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.372867, -0.673328, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.670902, -0.613119, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.7004, -0.682961, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.905313, -0.362653, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.978964, -0.388342, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.857147, -0.185239, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.93722, -0.210125, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.812191, -0.083286, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.866575, -0.033514, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.751983, -0.046358, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.804761, -0.002206, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.74556, -0.043147, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.791917, 0.027497, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.337749, -0.043147, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.298209, 0.025892, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.320088, -0.071245, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.280548, -0.002206, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.260481, 0.280672, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.302414, 0.210381, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.312982, 0.409139, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.378212, 0.390579, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.348979, 0.551295, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.423296, 0.571204, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.115467, 0.815986, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.146177, 0.883066, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.11371, 0.81361, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.144364, 0.885764, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.342181, 0.557428, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.419043, 0.572681, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.31395, 0.417031, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.378413, 0.390629, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.256172, 0.276612, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.299407, 0.207885, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.204883, 0.276478, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.25376, 0.206681, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.192886, 0.245393, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(0.245375, 0.175863, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.196323, 0.24595, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.246267, 0.175755, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.20358, 0.278671, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.259304, 0.205008, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.288443, 0.349093, [0., 1., 1., 1.]),
-            ShapeVertex::from_xy(-0.350323, 0.309817, [0., 1., 1., 1.]),
+            ShapeVertex::from_xy(-0.299137, -0.077869, color),
+            ShapeVertex::from_xy(-0.247956, -0.006422, color),
+            ShapeVertex::from_xy(-0.258195, -0.252576, color),
+            ShapeVertex::from_xy(-0.192966, -0.231704, color),
+            ShapeVertex::from_xy(-0.234915, -0.41554, color),
+            ShapeVertex::from_xy(-0.164066, -0.441229, color),
+            ShapeVertex::from_xy(-0.408315, -0.607404, color),
+            ShapeVertex::from_xy(-0.377605, -0.67564, color),
+            ShapeVertex::from_xy(-0.67564, -0.615431, color),
+            ShapeVertex::from_xy(-0.705138, -0.685273, color),
+            ShapeVertex::from_xy(-0.910051, -0.364965, color),
+            ShapeVertex::from_xy(-0.983702, -0.390654, color),
+            ShapeVertex::from_xy(-0.861884, -0.187551, color),
+            ShapeVertex::from_xy(-0.941957, -0.212437, color),
+            ShapeVertex::from_xy(-0.816929, -0.085598, color),
+            ShapeVertex::from_xy(-0.871313, -0.035826, color),
+            ShapeVertex::from_xy(-0.75672, -0.04867, color),
+            ShapeVertex::from_xy(-0.809499, -0.004518, color),
+            ShapeVertex::from_xy(-0.750298, -0.045459, color),
+            ShapeVertex::from_xy(-0.796655, 0.025185, color),
+            ShapeVertex::from_xy(-0.342487, -0.045459, color),
+            ShapeVertex::from_xy(-0.302946, 0.02358, color),
+            ShapeVertex::from_xy(-0.324826, -0.073557, color),
+            ShapeVertex::from_xy(-0.285285, -0.004518, color),
+            ShapeVertex::from_xy(0.294399, -0.075557, color),
+            ShapeVertex::from_xy(0.243218, -0.00411, color),
+            ShapeVertex::from_xy(0.253458, -0.250264, color),
+            ShapeVertex::from_xy(0.188228, -0.229392, color),
+            ShapeVertex::from_xy(0.230177, -0.413228, color),
+            ShapeVertex::from_xy(0.159328, -0.438917, color),
+            ShapeVertex::from_xy(0.403577, -0.605092, color),
+            ShapeVertex::from_xy(0.372867, -0.673328, color),
+            ShapeVertex::from_xy(0.670902, -0.613119, color),
+            ShapeVertex::from_xy(0.7004, -0.682961, color),
+            ShapeVertex::from_xy(0.905313, -0.362653, color),
+            ShapeVertex::from_xy(0.978964, -0.388342, color),
+            ShapeVertex::from_xy(0.857147, -0.185239, color),
+            ShapeVertex::from_xy(0.93722, -0.210125, color),
+            ShapeVertex::from_xy(0.812191, -0.083286, color),
+            ShapeVertex::from_xy(0.866575, -0.033514, color),
+            ShapeVertex::from_xy(0.751983, -0.046358, color),
+            ShapeVertex::from_xy(0.804761, -0.002206, color),
+            ShapeVertex::from_xy(0.74556, -0.043147, color),
+            ShapeVertex::from_xy(0.791917, 0.027497, color),
+            ShapeVertex::from_xy(0.337749, -0.043147, color),
+            ShapeVertex::from_xy(0.298209, 0.025892, color),
+            ShapeVertex::from_xy(0.320088, -0.071245, color),
+            ShapeVertex::from_xy(0.280548, -0.002206, color),
+            ShapeVertex::from_xy(-0.260481, 0.280672, color),
+            ShapeVertex::from_xy(-0.302414, 0.210381, color),
+            ShapeVertex::from_xy(-0.312982, 0.409139, color),
+            ShapeVertex::from_xy(-0.378212, 0.390579, color),
+            ShapeVertex::from_xy(-0.348979, 0.551295, color),
+            ShapeVertex::from_xy(-0.423296, 0.571204, color),
+            ShapeVertex::from_xy(-0.115467, 0.815986, color),
+            ShapeVertex::from_xy(-0.146177, 0.883066, color),
+            ShapeVertex::from_xy(0.11371, 0.81361, color),
+            ShapeVertex::from_xy(0.144364, 0.885764, color),
+            ShapeVertex::from_xy(0.342181, 0.557428, color),
+            ShapeVertex::from_xy(0.419043, 0.572681, color),
+            ShapeVertex::from_xy(0.31395, 0.417031, color),
+            ShapeVertex::from_xy(0.378413, 0.390629, color),
+            ShapeVertex::from_xy(0.256172, 0.276612, color),
+            ShapeVertex::from_xy(0.299407, 0.207885, color),
+            ShapeVertex::from_xy(0.204883, 0.276478, color),
+            ShapeVertex::from_xy(0.25376, 0.206681, color),
+            ShapeVertex::from_xy(0.192886, 0.245393, color),
+            ShapeVertex::from_xy(0.245375, 0.175863, color),
+            ShapeVertex::from_xy(-0.196323, 0.24595, color),
+            ShapeVertex::from_xy(-0.246267, 0.175755, color),
+            ShapeVertex::from_xy(-0.20358, 0.278671, color),
+            ShapeVertex::from_xy(-0.259304, 0.205008, color),
+            ShapeVertex::from_xy(-0.288443, 0.349093, color),
+            ShapeVertex::from_xy(-0.350323, 0.309817, color),
         ],
         indices: vec![
             0, 3, 2, 3, 4, 2, 5, 6, 4, 7, 8, 6, 9, 10, 8, 10, 13, 12, 12, 15, 14, 14, 17, 16, 17,