scene.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. use atomic_float::AtomicF32;
  2. use darkfi_serial::{SerialDecodable, SerialEncodable};
  3. use std::{
  4. fmt,
  5. str::FromStr,
  6. sync::{
  7. atomic::{AtomicBool, AtomicU32, Ordering},
  8. Arc, Mutex, MutexGuard,
  9. },
  10. };
  11. use crate::{
  12. error::{Error, Result},
  13. prop::{Property, PropertyType},
  14. };
  15. pub type SceneNodeId = u32;
  16. #[derive(Debug, Copy, Clone, PartialEq, SerialEncodable, SerialDecodable)]
  17. #[repr(u8)]
  18. pub enum SceneNodeType {
  19. Null = 0,
  20. Root = 1,
  21. Window = 2,
  22. WindowInput = 6,
  23. Keyboard = 7,
  24. Mouse = 8,
  25. RenderLayer = 3,
  26. RenderObject = 4,
  27. RenderMesh = 5,
  28. RenderText = 9,
  29. RenderTexture = 13,
  30. Fonts = 10,
  31. Font = 11,
  32. LinePosition = 12,
  33. }
  34. pub struct ScenePath(Vec<String>);
  35. impl<S: Into<String>> From<S> for ScenePath {
  36. fn from(path: S) -> Self {
  37. let path: String = path.into();
  38. (&path).parse().expect("invalid ScenePath &str")
  39. }
  40. }
  41. impl fmt::Display for ScenePath {
  42. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  43. write!(f, "/")?;
  44. for token in &self.0 {
  45. write!(f, "{}/", token)?;
  46. }
  47. Ok(())
  48. }
  49. }
  50. impl FromStr for ScenePath {
  51. type Err = Error;
  52. fn from_str(s: &str) -> Result<Self> {
  53. if s.is_empty() || s.chars().nth(0).unwrap() != '/' {
  54. return Err(Error::InvalidScenePath);
  55. }
  56. if s == "/" {
  57. return Ok(ScenePath(vec![]));
  58. }
  59. let mut tokens = s.split('/');
  60. // Should start with a /
  61. let initial = tokens.next().expect("should not be empty");
  62. if !initial.is_empty() {
  63. return Err(Error::InvalidScenePath);
  64. }
  65. let mut path = vec![];
  66. for token in tokens {
  67. // There should not be any double slashes //
  68. if token.is_empty() {
  69. return Err(Error::InvalidScenePath);
  70. }
  71. path.push(token.to_string());
  72. }
  73. Ok(ScenePath(path))
  74. }
  75. }
  76. pub type SceneGraphPtr = Arc<Mutex<SceneGraph>>;
  77. pub struct SceneGraph {
  78. // Node 0 is always the root
  79. nodes: Vec<SceneNode>,
  80. freed: Vec<SceneNodeId>,
  81. }
  82. impl SceneGraph {
  83. pub const ROOT_ID: SceneNodeId = 0;
  84. pub fn new() -> Self {
  85. let root = SceneNode {
  86. name: "/".to_string(),
  87. id: 0,
  88. typ: SceneNodeType::Root,
  89. parents: vec![],
  90. children: vec![],
  91. props: vec![],
  92. sigs: vec![],
  93. methods: vec![],
  94. };
  95. Self { nodes: vec![root], freed: vec![] }
  96. }
  97. pub fn add_node<S: Into<String>>(&mut self, name: S, typ: SceneNodeType) -> &mut SceneNode {
  98. let node = SceneNode {
  99. name: name.into(),
  100. // We set this at the end
  101. id: 0,
  102. typ,
  103. parents: vec![],
  104. children: vec![],
  105. props: vec![],
  106. sigs: vec![],
  107. methods: vec![],
  108. };
  109. let node_id = if self.freed.is_empty() {
  110. let node_id = self.nodes.len() as SceneNodeId;
  111. self.nodes.push(node);
  112. node_id
  113. } else {
  114. let node_id = self.freed.pop().unwrap();
  115. let _ = std::mem::replace(&mut self.nodes[node_id as usize], node);
  116. node_id
  117. };
  118. self.nodes[node_id as usize].id = node_id;
  119. &mut self.nodes[node_id as usize]
  120. }
  121. pub fn remove_node(&mut self, id: SceneNodeId) -> Result<()> {
  122. let node = self.get_node_mut(id).ok_or(Error::NodeNotFound)?;
  123. if !node.parents.is_empty() {
  124. return Err(Error::NodeHasParents);
  125. }
  126. if !node.children.is_empty() {
  127. return Err(Error::NodeHasChildren);
  128. }
  129. node.name.clear();
  130. node.typ = SceneNodeType::Null;
  131. node.props.clear();
  132. self.freed.push(id);
  133. Ok(())
  134. }
  135. fn root(&self) -> &SceneNode {
  136. &self.nodes[0]
  137. }
  138. fn root_mut(&mut self) -> &mut SceneNode {
  139. &mut self.nodes[0]
  140. }
  141. fn exists(&self, id: SceneNodeId) -> bool {
  142. id < self.nodes.len() as SceneNodeId && !self.freed.contains(&id)
  143. }
  144. pub fn get_node(&self, id: SceneNodeId) -> Option<&SceneNode> {
  145. if self.exists(id) {
  146. Some(&self.nodes[id as usize])
  147. } else {
  148. None
  149. }
  150. }
  151. pub fn get_node_mut(&mut self, id: SceneNodeId) -> Option<&mut SceneNode> {
  152. if self.exists(id) {
  153. Some(&mut self.nodes[id as usize])
  154. } else {
  155. None
  156. }
  157. }
  158. pub fn link(&mut self, child_id: SceneNodeId, parent_id: SceneNodeId) -> Result<()> {
  159. // Check both nodes are not already linked
  160. let is_linked = self.is_linked(child_id, parent_id)?;
  161. if is_linked {
  162. return Err(Error::NodesAreLinked);
  163. }
  164. let parent = self.get_node(parent_id).unwrap();
  165. let parent_inf =
  166. SceneNodeInfo { name: parent.name.clone(), id: parent_id, typ: parent.typ };
  167. let child_name = &self.get_node(child_id).unwrap().name;
  168. if parent.has_child(child_name) {
  169. return Err(Error::NodeChildNameConflict);
  170. }
  171. // Link parent into child
  172. let child = self.get_node_mut(child_id).unwrap();
  173. if child.has_parent(&parent_inf.name) {
  174. return Err(Error::NodeParentNameConflict);
  175. }
  176. let child_inf = SceneNodeInfo { name: child.name.clone(), id: child_id, typ: child.typ };
  177. assert!(!child.has_parent_id(parent_id));
  178. child.parents.push(parent_inf);
  179. // Link child into parent
  180. let parent = self.get_node_mut(parent_id).unwrap();
  181. assert!(!parent.has_child(&child_inf.name));
  182. parent.children.push(child_inf);
  183. Ok(())
  184. }
  185. pub fn unlink(&mut self, child_id: SceneNodeId, parent_id: SceneNodeId) -> Result<()> {
  186. // Check both nodes are actually linked
  187. let is_linked = self.is_linked(child_id, parent_id)?;
  188. if !is_linked {
  189. return Err(Error::NodesNotLinked);
  190. }
  191. // Unlink parent from child
  192. let child = self.get_node_mut(child_id).unwrap();
  193. child.remove_parent(parent_id);
  194. // Unlink child from parent
  195. let parent = self.get_node_mut(parent_id).unwrap();
  196. parent.remove_child(child_id);
  197. Ok(())
  198. }
  199. pub fn is_linked(&self, child_id: SceneNodeId, parent_id: SceneNodeId) -> Result<bool> {
  200. let parent = self.get_node(parent_id).ok_or(Error::ParentNodeNotFound)?;
  201. let child = self.get_node(child_id).ok_or(Error::ChildNodeNotFound)?;
  202. let parent_has_child = parent.has_child_id(child_id);
  203. let child_has_parent = child.has_parent_id(parent_id);
  204. // Internal consistency checks
  205. if parent_has_child {
  206. assert!(child_has_parent);
  207. } else {
  208. assert!(!child_has_parent);
  209. }
  210. Ok(parent_has_child)
  211. }
  212. pub fn lookup_node_id<P: Into<ScenePath>>(&self, path: P) -> Option<SceneNodeId> {
  213. let path: ScenePath = path.into();
  214. let mut current_id = Self::ROOT_ID;
  215. for node_name in path.0 {
  216. let parent_node = self.get_node(current_id).unwrap();
  217. match parent_node.get_child(&node_name) {
  218. Some(child_id) => {
  219. current_id = child_id;
  220. }
  221. None => return None,
  222. }
  223. }
  224. Some(current_id)
  225. }
  226. pub fn lookup_node<P: Into<ScenePath>>(&self, path: P) -> Option<&SceneNode> {
  227. let node_id = self.lookup_node_id(path)?;
  228. Some(self.get_node(node_id).unwrap())
  229. }
  230. pub fn lookup_node_mut<P: Into<ScenePath>>(&mut self, path: P) -> Option<&mut SceneNode> {
  231. let node_id = self.lookup_node_id(path)?;
  232. Some(self.get_node_mut(node_id).unwrap())
  233. }
  234. pub fn rename_node<S: Into<String>>(
  235. &mut self,
  236. node_id: SceneNodeId,
  237. node_name: S,
  238. ) -> Result<()> {
  239. let node_name = node_name.into();
  240. for sibling_inf in self.node_siblings(node_id)? {
  241. if sibling_inf.name == node_name {
  242. return Err(Error::NodeSiblingNameConflict)
  243. }
  244. }
  245. let node = self.get_node_mut(node_id).unwrap();
  246. node.name = node_name.clone();
  247. // Now update it for all children and parents too
  248. let parent_ids: Vec<_> = node.parents.iter().map(|parent_inf| parent_inf.id).collect();
  249. let child_ids: Vec<_> = node.children.iter().map(|child_inf| child_inf.id).collect();
  250. drop(node);
  251. 'next_parent: for parent_id in parent_ids {
  252. let parent = self.get_node_mut(parent_id).unwrap();
  253. for child in &mut parent.children {
  254. if child.id == node_id {
  255. child.name = node_name.clone();
  256. continue 'next_parent
  257. }
  258. }
  259. panic!("child {} not found in parent {}!", node_id, parent.id)
  260. }
  261. 'next_child: for child_id in child_ids {
  262. let child = self.get_node_mut(child_id).unwrap();
  263. for parent in &mut child.parents {
  264. if parent.id == node_id {
  265. parent.name = node_name.clone();
  266. continue 'next_child
  267. }
  268. }
  269. panic!("parent {} not found in child {}!", node_id, child.id)
  270. }
  271. Ok(())
  272. }
  273. fn node_siblings(&self, node_id: SceneNodeId) -> Result<Vec<SceneNodeInfo>> {
  274. let mut siblings = vec![];
  275. let node = self.get_node(node_id).ok_or(Error::NodeNotFound)?;
  276. for parent_inf in &node.parents {
  277. let parent = self.get_node(parent_inf.id).ok_or(Error::ParentNodeNotFound)?;
  278. let mut sibling_infs = parent
  279. .children
  280. .iter()
  281. .cloned()
  282. .filter(|child_inf| child_inf.id != node_id)
  283. .collect();
  284. siblings.append(&mut sibling_infs);
  285. }
  286. Ok(siblings)
  287. }
  288. pub fn scan_dangling(&self) -> Vec<SceneNodeId> {
  289. let mut dangling = vec![];
  290. for node in &self.nodes {
  291. if node.id == Self::ROOT_ID {
  292. continue
  293. }
  294. if self.freed.contains(&node.id) {
  295. continue
  296. }
  297. if node.parents.is_empty() {
  298. dangling.push(node.id);
  299. }
  300. }
  301. dangling
  302. }
  303. }
  304. #[derive(Clone)]
  305. pub struct SceneNodeInfo {
  306. pub name: String,
  307. pub id: SceneNodeId,
  308. pub typ: SceneNodeType,
  309. }
  310. pub struct SceneNode {
  311. pub name: String,
  312. pub id: SceneNodeId,
  313. pub typ: SceneNodeType,
  314. pub parents: Vec<SceneNodeInfo>,
  315. pub children: Vec<SceneNodeInfo>,
  316. pub props: Vec<Arc<Property>>,
  317. pub sigs: Vec<Signal>,
  318. pub methods: Vec<Method>,
  319. }
  320. impl SceneNode {
  321. fn has_parent_id(&self, parent_id: SceneNodeId) -> bool {
  322. self.parents.iter().any(|parent| parent.id == parent_id)
  323. }
  324. fn has_child_id(&self, child_id: SceneNodeId) -> bool {
  325. self.children.iter().any(|child| child.id == child_id)
  326. }
  327. fn has_parent(&self, parent_name: &str) -> bool {
  328. self.parents.iter().any(|parent| parent.name == parent_name)
  329. }
  330. fn has_child(&self, child_name: &str) -> bool {
  331. self.children.iter().any(|child| child.name == child_name)
  332. }
  333. fn get_child(&self, child_name: &str) -> Option<SceneNodeId> {
  334. for child in &self.children {
  335. if child.name == child_name {
  336. return Some(child.id);
  337. }
  338. }
  339. None
  340. }
  341. // Panics if parent is not linked
  342. fn remove_parent(&mut self, parent_id: SceneNodeId) {
  343. let parent_idx = self.parents.iter().position(|parent| parent.id == parent_id).unwrap();
  344. self.parents.swap_remove(parent_idx);
  345. }
  346. // Panics if child is not linked
  347. fn remove_child(&mut self, child_id: SceneNodeId) {
  348. let child_idx = self.children.iter().position(|child| child.id == child_id).unwrap();
  349. self.children.swap_remove(child_idx);
  350. }
  351. pub fn iter_children<'a>(
  352. &'a self,
  353. scene_graph: &'a SceneGraph,
  354. typ: SceneNodeType,
  355. ) -> impl Iterator<Item = &'a Self> + 'a {
  356. self.children
  357. .iter()
  358. .filter(move |child_inf| child_inf.typ == typ)
  359. .map(|child_inf| scene_graph.get_node(child_inf.id).unwrap())
  360. }
  361. pub fn add_property(&mut self, prop: Property) -> Result<()> {
  362. if self.has_property(&prop.name) {
  363. return Err(Error::PropertyAlreadyExists);
  364. }
  365. self.props.push(Arc::new(prop));
  366. Ok(())
  367. }
  368. fn has_property(&self, name: &str) -> bool {
  369. self.props.iter().any(|prop| prop.name == name)
  370. }
  371. pub fn get_property(&self, name: &str) -> Option<Arc<Property>> {
  372. self.props.iter().find(|prop| prop.name == name).map(|prop| prop.clone())
  373. }
  374. // Convenience methods
  375. pub fn get_property_bool(&self, name: &str) -> Result<bool> {
  376. self.get_property(name).ok_or(Error::PropertyNotFound)?.get_bool(0)
  377. }
  378. pub fn get_property_u32(&self, name: &str) -> Result<u32> {
  379. self.get_property(name).ok_or(Error::PropertyNotFound)?.get_u32(0)
  380. }
  381. pub fn get_property_f32(&self, name: &str) -> Result<f32> {
  382. self.get_property(name).ok_or(Error::PropertyNotFound)?.get_f32(0)
  383. }
  384. pub fn get_property_str(&self, name: &str) -> Result<String> {
  385. self.get_property(name).ok_or(Error::PropertyNotFound)?.get_str(0)
  386. }
  387. pub fn get_property_node_id(&self, name: &str) -> Result<SceneNodeId> {
  388. self.get_property(name).ok_or(Error::PropertyNotFound)?.get_node_id(0)
  389. }
  390. //// Setters
  391. //pub fn set_property_bool(&self, name: &str, val: bool) -> Result<()> {
  392. // self.get_property(name).ok_or(Error::PropertyNotFound)?.set_bool(val)
  393. //}
  394. //pub fn set_property_u32(&self, name: &str, val: u32) -> Result<()> {
  395. // self.get_property(name).ok_or(Error::PropertyNotFound)?.set_u32(val)
  396. //}
  397. //pub fn set_property_f32(&self, name: &str, val: f32) -> Result<()> {
  398. // self.get_property(name).ok_or(Error::PropertyNotFound)?.set_f32(val)
  399. //}
  400. //pub fn set_property_str<S: Into<String>>(&self, name: &str, val: S) -> Result<()> {
  401. // self.get_property(name).ok_or(Error::PropertyNotFound)?.set_str(val)
  402. //}
  403. //pub fn set_property_node_id(&self, name: &str, val: SceneNodeId) -> Result<()> {
  404. // self.get_property(name).ok_or(Error::PropertyNotFound)?.set_node_id(val)
  405. //}
  406. pub fn add_signal<S: Into<String>>(
  407. &mut self,
  408. name: S,
  409. desc: S,
  410. fmt: Vec<(S, S, PropertyType)>,
  411. ) -> Result<()> {
  412. let name = name.into();
  413. if self.has_signal(&name) {
  414. return Err(Error::SignalAlreadyExists);
  415. }
  416. let fmt = fmt
  417. .into_iter()
  418. .map(|(n, d, t)| CallArg { name: n.into(), desc: d.into(), typ: t })
  419. .collect();
  420. self.sigs.push(Signal {
  421. name: name.into(),
  422. desc: desc.into(),
  423. fmt,
  424. slots: vec![],
  425. freed: vec![],
  426. });
  427. Ok(())
  428. }
  429. fn has_signal(&self, name: &str) -> bool {
  430. self.sigs.iter().any(|sig| sig.name == name)
  431. }
  432. pub fn get_signal(&self, name: &str) -> Option<&Signal> {
  433. self.sigs.iter().find(|sig| sig.name == name)
  434. }
  435. fn get_signal_mut(&mut self, name: &str) -> Option<&mut Signal> {
  436. self.sigs.iter_mut().find(|sig| sig.name == name)
  437. }
  438. pub fn register(&mut self, sig_name: &str, slot: Slot) -> Result<SlotId> {
  439. let sig = self.get_signal_mut(sig_name).ok_or(Error::SignalNotFound)?;
  440. let slot_id = if sig.freed.is_empty() {
  441. let slot_id = sig.slots.len() as SlotId;
  442. sig.slots.push(slot);
  443. slot_id
  444. } else {
  445. let slot_id = sig.freed.pop().unwrap();
  446. let _ = std::mem::replace(&mut sig.slots[slot_id as usize], slot);
  447. slot_id
  448. };
  449. Ok(slot_id)
  450. }
  451. pub fn unregister(&mut self, sig_name: &str, slot_id: SlotId) -> Result<()> {
  452. let sig = self.get_signal_mut(sig_name).ok_or(Error::SignalNotFound)?;
  453. if !sig.slot_exists(slot_id) {
  454. return Err(Error::SlotNotFound);
  455. }
  456. sig.freed.push(slot_id);
  457. Ok(())
  458. }
  459. pub fn trigger(&self, sig_name: &str, data: Vec<u8>) -> Result<()> {
  460. let sig = self.get_signal(sig_name).ok_or(Error::SignalNotFound)?;
  461. for (_, slot) in sig.get_slots() {
  462. // Trigger the slot
  463. slot.call(data.clone());
  464. }
  465. Ok(())
  466. }
  467. pub fn add_method<S: Into<String>>(
  468. &mut self,
  469. name: S,
  470. args: Vec<(S, S, PropertyType)>,
  471. result: Vec<(S, S, PropertyType)>,
  472. method_fn: MethodRequestFn,
  473. ) -> Result<()> {
  474. let name = name.into();
  475. if self.has_signal(&name) {
  476. return Err(Error::MethodAlreadyExists);
  477. }
  478. let args = args
  479. .into_iter()
  480. .map(|(n, d, t)| CallArg { name: n.into(), desc: d.into(), typ: t })
  481. .collect();
  482. let result = result
  483. .into_iter()
  484. .map(|(n, d, t)| CallArg { name: n.into(), desc: d.into(), typ: t })
  485. .collect();
  486. self.methods.push(Method { name: name.into(), args, result, method_fn });
  487. Ok(())
  488. }
  489. pub fn get_method(&self, name: &str) -> Option<&Method> {
  490. self.methods.iter().find(|method| method.name == name)
  491. }
  492. fn get_method_mut(&mut self, name: &str) -> Option<&mut Method> {
  493. self.methods.iter_mut().find(|method| method.name == name)
  494. }
  495. pub fn call_method(
  496. &mut self,
  497. name: &str,
  498. arg_data: Vec<u8>,
  499. response_fn: MethodResponseFn,
  500. ) -> Result<()> {
  501. let method = self.get_method(name).ok_or(Error::MethodNotFound)?;
  502. (method.method_fn)(arg_data, response_fn);
  503. Ok(())
  504. }
  505. }
  506. #[derive(Debug, Clone, SerialEncodable, SerialDecodable)]
  507. pub struct CallArg {
  508. pub name: String,
  509. pub desc: String,
  510. pub typ: PropertyType,
  511. }
  512. type SlotFn = Box<dyn Fn(Vec<u8>) + Send>;
  513. pub type SlotId = u32;
  514. pub struct Slot {
  515. pub name: String,
  516. pub func: SlotFn,
  517. }
  518. impl Slot {
  519. fn call(&self, data: Vec<u8>) {
  520. (self.func)(data)
  521. }
  522. }
  523. pub struct Signal {
  524. pub name: String,
  525. pub desc: String,
  526. pub fmt: Vec<CallArg>,
  527. slots: Vec<Slot>,
  528. freed: Vec<SlotId>,
  529. }
  530. impl Signal {
  531. fn slot_exists(&self, slot_id: SlotId) -> bool {
  532. if slot_id >= self.slots.len() as SlotId {
  533. return false;
  534. }
  535. return !self.freed.contains(&slot_id);
  536. }
  537. pub fn get_slots<'a>(&'a self) -> impl Iterator<Item = (SlotId, &'a Slot)> {
  538. self.slots
  539. .iter()
  540. .enumerate()
  541. .filter(|(slot_id, _)| !self.freed.contains(&(*slot_id as SlotId)))
  542. .map(|(slot_id, slot)| (slot_id as SlotId, slot))
  543. }
  544. pub fn lookup_slot_id(&self, slot_name: &str) -> Option<SlotId> {
  545. for (slot_id, slot) in self.get_slots() {
  546. if slot.name == slot_name {
  547. return Some(slot_id);
  548. }
  549. }
  550. None
  551. }
  552. }
  553. type MethodRequestFn = Box<dyn Fn(Vec<u8>, MethodResponseFn) + Send>;
  554. pub type MethodResponseFn = Box<dyn Fn(Result<Vec<u8>>) + Send>;
  555. pub struct Method {
  556. pub name: String,
  557. pub args: Vec<CallArg>,
  558. pub result: Vec<CallArg>,
  559. method_fn: MethodRequestFn,
  560. }