Просмотр исходного кода

app: use video bg for main theme

darkfi 11 месяцев назад
Родитель
Сommit
045bf7a505
3 измененных файлов с 39 добавлено и 20 удалено
  1. 1 1
      bin/app/src/app/mod.rs
  2. 13 5
      bin/app/src/app/schema/mod.rs
  3. 25 14
      bin/app/src/gfx/mod.rs

+ 1 - 1
bin/app/src/app/mod.rs

@@ -134,7 +134,7 @@ impl App {
         self.sg_root.link(window.clone());
         self.sg_root.link(window.clone());
         self.sg_root.link(setting_root.clone());
         self.sg_root.link(setting_root.clone());
 
 
-        schema::test::make(&self, window.clone(), &i18n_fish).await;
+        schema::make(&self, window.clone(), &i18n_fish).await;
 
 
         //settings::make(&self, window, self.ex.clone()).await;
         //settings::make(&self, window, self.ex.clone()).await;
 
 

+ 13 - 5
bin/app/src/app/schema/mod.rs

@@ -22,7 +22,7 @@ use std::fs::File;
 
 
 use crate::{
 use crate::{
     app::{
     app::{
-        node::{create_image, create_layer, create_shortcut, create_vector_art},
+        node::{create_image, create_layer, create_shortcut, create_vector_art, create_video},
         App,
         App,
     },
     },
     expr::{self, Compiler},
     expr::{self, Compiler},
@@ -30,7 +30,7 @@ use crate::{
     prop::{PropertyAtomicGuard, Role},
     prop::{PropertyAtomicGuard, Role},
     scene::{SceneNodePtr, Slot},
     scene::{SceneNodePtr, Slot},
     shape,
     shape,
-    ui::{emoji_picker, Image, Layer, Shortcut, VectorArt, VectorShape},
+    ui::{emoji_picker, Image, Layer, Shortcut, VectorArt, VectorShape, Video},
     util::i18n::I18nBabelFish,
     util::i18n::I18nBabelFish,
 };
 };
 
 
@@ -56,6 +56,7 @@ mod ui_consts {
     use std::path::PathBuf;
     use std::path::PathBuf;
 
 
     pub const BG_PATH: &str = "bg.png";
     pub const BG_PATH: &str = "bg.png";
+    pub const VID_PATH: &str = "forest/forest_{frame}.png";
     pub use super::android_ui_consts::*;
     pub use super::android_ui_consts::*;
 
 
     pub fn get_chatdb_path() -> PathBuf {
     pub fn get_chatdb_path() -> PathBuf {
@@ -80,6 +81,7 @@ mod desktop_paths {
     use std::path::PathBuf;
     use std::path::PathBuf;
 
 
     pub const BG_PATH: &str = "assets/bg.png";
     pub const BG_PATH: &str = "assets/bg.png";
+    pub const VID_PATH: &str = "assets/forest/forest_{frame}.png";
 
 
     pub fn get_chatdb_path() -> PathBuf {
     pub fn get_chatdb_path() -> PathBuf {
         dirs::data_local_dir().unwrap().join("darkfi/app/chatdb")
         dirs::data_local_dir().unwrap().join("darkfi/app/chatdb")
@@ -232,8 +234,10 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
         let layer_node = layer_node.setup(|me| Layer::new(me, app.render_api.clone())).await;
         let layer_node = layer_node.setup(|me| Layer::new(me, app.render_api.clone())).await;
         window.link(layer_node.clone());
         window.link(layer_node.clone());
 
 
+        let node = create_video("king");
+
         // Create a bg image
         // Create a bg image
-        let node = create_image("bg_image");
+        //let node = create_image("bg_image");
         let prop = node.get_property("rect").unwrap();
         let prop = node.get_property("rect").unwrap();
         prop.set_f32(atom, Role::App, 0, 0.).unwrap();
         prop.set_f32(atom, Role::App, 0, 0.).unwrap();
         prop.set_f32(atom, Role::App, 1, 0.).unwrap();
         prop.set_f32(atom, Role::App, 1, 0.).unwrap();
@@ -269,9 +273,13 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     ").unwrap();
     ").unwrap();
         prop.set_expr(atom, Role::App, 3, code).unwrap();
         prop.set_expr(atom, Role::App, 3, code).unwrap();
 
 
-        node.set_property_str(atom, Role::App, "path", BG_PATH).unwrap();
+        //node.set_property_str(atom, Role::App, "path", BG_PATH).unwrap();
+        node.set_property_str(atom, Role::App, "path", VID_PATH).unwrap();
         node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
         node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-        let node = node.setup(|me| Image::new(me, app.render_api.clone())).await;
+        //let node = node.setup(|me| Image::new(me, app.render_api.clone())).await;
+        //layer_node.link(node);
+        node.set_property_u32(atom, Role::App, "length", 357).unwrap();
+        let node = node.setup(|me| Video::new(me, app.render_api.clone(), app.ex.clone())).await;
         layer_node.link(node);
         layer_node.link(node);
 
 
         // Create a bg mesh on top to fade the bg image
         // Create a bg mesh on top to fade the bg image

+ 25 - 14
bin/app/src/gfx/mod.rs

@@ -54,7 +54,7 @@ use trax::get_trax;
 use crate::{
 use crate::{
     error::{Error, Result},
     error::{Error, Result},
     prop::{BatchGuardId, PropertyAtomicGuard},
     prop::{BatchGuardId, PropertyAtomicGuard},
-    GOD,
+    ExecutorPtr, GOD,
 };
 };
 
 
 // This is very noisy so suppress output by default
 // This is very noisy so suppress output by default
@@ -925,6 +925,9 @@ struct Stage {
 
 
     pruner: PruneMethodHeap,
     pruner: PruneMethodHeap,
     screen_was_off: bool,
     screen_was_off: bool,
+    ex: ExecutorPtr,
+    #[cfg(target_os = "android")]
+    refresh_task: Option<smol::Task<()>>,
 }
 }
 
 
 impl Stage {
 impl Stage {
@@ -943,9 +946,10 @@ impl Stage {
         let method_recv = god.method_recv.clone();
         let method_recv = god.method_recv.clone();
         let event_pub = god.event_pub.clone();
         let event_pub = god.event_pub.clone();
 
 
+        let ex = god.fg_ex.clone();
         let method_queue = Arc::new(SyncMutex::new(vec![]));
         let method_queue = Arc::new(SyncMutex::new(vec![]));
         let method_queue2 = method_queue.clone();
         let method_queue2 = method_queue.clone();
-        let sink_task = god.fg_ex.spawn(async move {
+        let sink_task = ex.spawn(async move {
             // Pull from render_api
             // Pull from render_api
             while let Ok((epoch, method)) = method_recv.recv().await {
             while let Ok((epoch, method)) = method_recv.recv().await {
                 let is_replace_dc = matches!(method, GraphicsMethod::ReplaceGfxDrawCalls { .. });
                 let is_replace_dc = matches!(method, GraphicsMethod::ReplaceGfxDrawCalls { .. });
@@ -959,18 +963,6 @@ impl Stage {
         });
         });
         god.fg_runtime.push_task(sink_task);
         god.fg_runtime.push_task(sink_task);
 
 
-        #[cfg(target_os = "android")]
-        {
-            // For animations do periodic refresh every 40 ms
-            let refresh_task = god.fg_ex.spawn(async move {
-                loop {
-                    darkfi::system::msleep(40).await;
-                    miniquad::window::schedule_update();
-                }
-            });
-            god.fg_runtime.push_task(refresh_task);
-        }
-
         let white_texture = ctx.new_texture_from_rgba8(1, 1, &[255, 255, 255, 255]);
         let white_texture = ctx.new_texture_from_rgba8(1, 1, &[255, 255, 255, 255]);
 
 
         let mut shader_meta: ShaderMeta = shader::meta();
         let mut shader_meta: ShaderMeta = shader::meta();
@@ -1035,6 +1027,9 @@ impl Stage {
 
 
             pruner: PruneMethodHeap::new(epoch),
             pruner: PruneMethodHeap::new(epoch),
             screen_was_off: false,
             screen_was_off: false,
+            ex,
+            #[cfg(target_os = "android")]
+            refresh_task: None,
         }
         }
     }
     }
 
 
@@ -1492,6 +1487,11 @@ impl EventHandler for Stage {
         let methods = std::mem::take(&mut *self.method_queue.lock());
         let methods = std::mem::take(&mut *self.method_queue.lock());
 
 
         if self.egl_ctx_is_disabled() {
         if self.egl_ctx_is_disabled() {
+            #[cfg(target_os = "android")]
+            {
+                self.refresh_task = None;
+            }
+
             // Immediately apply any pending batches when the screen is switched off
             // Immediately apply any pending batches when the screen is switched off
             let batch_ids: Vec<_> = self.batches.keys().cloned().collect();
             let batch_ids: Vec<_> = self.batches.keys().cloned().collect();
             for batch_id in batch_ids {
             for batch_id in batch_ids {
@@ -1505,6 +1505,17 @@ impl EventHandler for Stage {
             return
             return
         }
         }
 
 
+        #[cfg(target_os = "android")]
+        if self.refresh_task.is_none() {
+            // For animations do periodic refresh every 40 ms
+            self.refresh_task = Some(self.ex.spawn(async move {
+                loop {
+                    darkfi::system::msleep(40).await;
+                    miniquad::window::schedule_update();
+                }
+            }));
+        }
+
         // We actually want to skip draining the prune queue the first time so
         // We actually want to skip draining the prune queue the first time so
         // draw actually gets a chance to be called first.
         // draw actually gets a chance to be called first.
         // Otherwise we will just see a black screen for a sec or so.
         // Otherwise we will just see a black screen for a sec or so.