mod.rs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. use std::sync::{Arc, Weak};
  2. use crate::{
  3. error::{Error, Result},
  4. expr::{SExprMachine, SExprVal},
  5. gfx2::{DrawCall, Rectangle},
  6. prop::PropertyPtr,
  7. scene::{SceneGraph, SceneNode, SceneNodeId, SceneNodeType},
  8. };
  9. mod chatview;
  10. pub use chatview::{ChatView, ChatViewPtr};
  11. mod editbox;
  12. pub use editbox::{EditBox, EditBoxPtr};
  13. mod mesh;
  14. pub use mesh::{Mesh, MeshPtr};
  15. mod layer;
  16. pub use layer::{RenderLayer, RenderLayerPtr};
  17. mod text;
  18. pub use text::{Text, TextPtr};
  19. mod win;
  20. pub use win::{Window, WindowPtr};
  21. pub trait Stoppable {
  22. async fn stop(&self);
  23. }
  24. pub struct DrawUpdate {
  25. pub key: u64,
  26. pub draw_calls: Vec<(u64, DrawCall)>,
  27. }
  28. pub struct OnModify<T> {
  29. ex: Arc<smol::Executor<'static>>,
  30. node_name: String,
  31. node_id: SceneNodeId,
  32. me: Weak<T>,
  33. pub tasks: Vec<smol::Task<()>>,
  34. }
  35. impl<T: Send + Sync + 'static> OnModify<T> {
  36. pub fn new(
  37. ex: Arc<smol::Executor<'static>>,
  38. node_name: String,
  39. node_id: SceneNodeId,
  40. me: Weak<T>,
  41. ) -> Self {
  42. Self { ex, node_name, node_id, me, tasks: vec![] }
  43. }
  44. pub fn when_change<F>(&mut self, prop: PropertyPtr, f: impl Fn(Arc<T>) -> F + Send + 'static)
  45. where
  46. F: std::future::Future<Output = ()> + Send + 'static,
  47. {
  48. let node_name = self.node_name.clone();
  49. let node_id = self.node_id;
  50. let on_modify_sub = prop.subscribe_modify();
  51. let prop_name = prop.name.clone();
  52. let me = self.me.clone();
  53. let task = self.ex.spawn(async move {
  54. loop {
  55. let _ = on_modify_sub.receive().await;
  56. debug!(target: "app", "Property '{}':{}/'{}' modified", node_name, node_id, prop_name);
  57. let Some(self_) = me.upgrade() else {
  58. // Should not happen
  59. panic!(
  60. "'{}':{}/'{}' self destroyed before modify_task was stopped!",
  61. node_name, node_id, prop_name
  62. );
  63. };
  64. debug!(target: "app", "property modified");
  65. f(self_).await;
  66. }
  67. });
  68. self.tasks.push(task);
  69. }
  70. }
  71. pub fn eval_rect(rect: PropertyPtr, parent_rect: &Rectangle) -> Result<()> {
  72. if rect.array_len != 4 {
  73. return Err(Error::PropertyWrongLen)
  74. }
  75. for i in 0..4 {
  76. if !rect.is_expr(i)? {
  77. continue
  78. }
  79. let expr = rect.get_expr(i).unwrap();
  80. let machine = SExprMachine {
  81. globals: vec![
  82. ("w".to_string(), SExprVal::Float32(parent_rect.w)),
  83. ("h".to_string(), SExprVal::Float32(parent_rect.h)),
  84. ],
  85. stmts: &expr,
  86. };
  87. let v = machine.call()?.as_f32()?;
  88. rect.set_cache_f32(i, v).unwrap();
  89. }
  90. Ok(())
  91. }
  92. pub fn read_rect(rect_prop: PropertyPtr) -> Result<Rectangle> {
  93. if rect_prop.array_len != 4 {
  94. return Err(Error::PropertyWrongLen)
  95. }
  96. let mut rect = [0.; 4];
  97. for i in 0..4 {
  98. if rect_prop.is_expr(i)? {
  99. rect[i] = rect_prop.get_cached(i)?.as_f32()?;
  100. } else {
  101. rect[i] = rect_prop.get_f32(i)?;
  102. }
  103. }
  104. Ok(Rectangle::from_array(rect))
  105. }
  106. pub fn get_parent_rect(sg: &SceneGraph, node: &SceneNode) -> Option<Rectangle> {
  107. // read our parent
  108. if node.parents.is_empty() {
  109. info!("RenderLayer {:?} has no parents so skipping", node);
  110. return None
  111. }
  112. if node.parents.len() != 1 {
  113. error!("RenderLayer {:?} has too many parents so skipping", node);
  114. return None
  115. }
  116. let parent_id = node.parents[0].id;
  117. let parent_node = sg.get_node(parent_id).unwrap();
  118. let parent_rect = match parent_node.typ {
  119. SceneNodeType::Window => {
  120. let Some(screen_size_prop) = parent_node.get_property("screen_size") else {
  121. error!(
  122. "RenderLayer {:?} parent node {:?} missing screen_size property",
  123. node, parent_node
  124. );
  125. return None
  126. };
  127. let screen_width = screen_size_prop.get_f32(0).unwrap();
  128. let screen_height = screen_size_prop.get_f32(1).unwrap();
  129. let parent_rect = Rectangle::from_array([0., 0., screen_width, screen_height]);
  130. parent_rect
  131. }
  132. SceneNodeType::RenderLayer => {
  133. // get their rect property
  134. let Some(parent_rect) = parent_node.get_property("rect") else {
  135. error!(
  136. "RenderLayer {:?} parent node {:?} missing rect property",
  137. node, parent_node
  138. );
  139. return None
  140. };
  141. // read parent's rect
  142. let Ok(parent_rect) = read_rect(parent_rect) else {
  143. error!(
  144. "RenderLayer {:?} parent node {:?} malformed rect property",
  145. node, parent_node
  146. );
  147. return None
  148. };
  149. parent_rect
  150. }
  151. _ => {
  152. error!(
  153. "RenderLayer {:?} parent node {:?} wrong type {:?}",
  154. node, parent_node, parent_node.typ
  155. );
  156. return None
  157. }
  158. };
  159. Some(parent_rect)
  160. }