mesh.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /* This file is part of DarkFi (https://dark.fi)
  2. *
  3. * Copyright (C) 2020-2024 Dyne.org foundation
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU Affero General Public License as
  7. * published by the Free Software Foundation, either version 3 of the
  8. * License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU Affero General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Affero General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. use rand::{rngs::OsRng, Rng};
  19. use std::sync::{Arc, Weak};
  20. use crate::{
  21. gfx::{DrawCall, DrawInstruction, DrawMesh, Rectangle, RenderApiPtr, Vertex},
  22. prop::{PropertyPtr, PropertyUint32, Role},
  23. scene::{Pimpl, SceneGraph, SceneGraphPtr2, SceneNodeId},
  24. ExecutorPtr,
  25. };
  26. use super::{eval_rect, get_parent_rect, read_rect, DrawUpdate, OnModify, Stoppable};
  27. pub type MeshPtr = Arc<Mesh>;
  28. pub struct Mesh {
  29. sg: SceneGraphPtr2,
  30. render_api: RenderApiPtr,
  31. _tasks: Vec<smol::Task<()>>,
  32. vertex_buffer: miniquad::BufferId,
  33. index_buffer: miniquad::BufferId,
  34. // Texture
  35. num_elements: i32,
  36. dc_key: u64,
  37. node_id: SceneNodeId,
  38. rect: PropertyPtr,
  39. z_index: PropertyUint32,
  40. }
  41. impl Mesh {
  42. pub async fn new(
  43. ex: ExecutorPtr,
  44. sg: SceneGraphPtr2,
  45. node_id: SceneNodeId,
  46. render_api: RenderApiPtr,
  47. verts: Vec<Vertex>,
  48. indices: Vec<u16>,
  49. ) -> Pimpl {
  50. let num_elements = indices.len() as i32;
  51. let vertex_buffer = render_api.new_vertex_buffer(verts).await.unwrap();
  52. let index_buffer = render_api.new_index_buffer(indices).await.unwrap();
  53. let scene_graph = sg.lock().await;
  54. let node = scene_graph.get_node(node_id).unwrap();
  55. let node_name = node.name.clone();
  56. let rect = node.get_property("rect").expect("Mesh::rect");
  57. let z_index = PropertyUint32::wrap(node, Role::Internal, "z_index", 0).unwrap();
  58. drop(scene_graph);
  59. let self_ = Arc::new_cyclic(|me: &Weak<Self>| {
  60. let mut on_modify = OnModify::new(ex, node_name, node_id, me.clone());
  61. on_modify.when_change(rect.clone(), Self::redraw);
  62. on_modify.when_change(z_index.prop(), Self::redraw);
  63. Self {
  64. sg,
  65. render_api,
  66. _tasks: on_modify.tasks,
  67. vertex_buffer,
  68. index_buffer,
  69. num_elements,
  70. dc_key: OsRng.gen(),
  71. node_id,
  72. rect,
  73. z_index,
  74. }
  75. });
  76. Pimpl::Mesh(self_)
  77. }
  78. async fn redraw(self: Arc<Self>) {
  79. let sg = self.sg.lock().await;
  80. let node = sg.get_node(self.node_id).unwrap();
  81. let Some(parent_rect) = get_parent_rect(&sg, node) else {
  82. return;
  83. };
  84. let Some(draw_update) = self.draw(&sg, &parent_rect) else {
  85. error!(target: "ui::mesh", "Mesh {:?} failed to draw", node);
  86. return;
  87. };
  88. self.render_api.replace_draw_calls(draw_update.draw_calls).await;
  89. debug!(target: "ui::mesh", "replace draw calls done");
  90. }
  91. pub fn draw(&self, sg: &SceneGraph, parent_rect: &Rectangle) -> Option<DrawUpdate> {
  92. debug!(target: "ui::mesh", "Mesh::draw()");
  93. // Only used for debug messages
  94. let node = sg.get_node(self.node_id).unwrap();
  95. let mesh = DrawMesh {
  96. vertex_buffer: self.vertex_buffer,
  97. index_buffer: self.index_buffer,
  98. texture: None,
  99. num_elements: self.num_elements,
  100. };
  101. if let Err(err) = eval_rect(self.rect.clone(), parent_rect) {
  102. panic!("Node {:?} bad rect property: {}", node, err);
  103. }
  104. let Ok(mut rect) = read_rect(self.rect.clone()) else {
  105. panic!("Node {:?} bad rect property", node);
  106. };
  107. rect.x += parent_rect.x;
  108. rect.y += parent_rect.x;
  109. let off_x = rect.x / parent_rect.w;
  110. let off_y = rect.y / parent_rect.h;
  111. let scale_x = rect.w / parent_rect.w;
  112. let scale_y = rect.h / parent_rect.h;
  113. let model = glam::Mat4::from_translation(glam::Vec3::new(off_x, off_y, 0.)) *
  114. glam::Mat4::from_scale(glam::Vec3::new(scale_x, scale_y, 1.));
  115. Some(DrawUpdate {
  116. key: self.dc_key,
  117. draw_calls: vec![(
  118. self.dc_key,
  119. DrawCall {
  120. instrs: vec![DrawInstruction::ApplyMatrix(model), DrawInstruction::Draw(mesh)],
  121. dcs: vec![],
  122. z_index: self.z_index.get(),
  123. },
  124. )],
  125. freed_textures: vec![],
  126. freed_buffers: vec![],
  127. })
  128. }
  129. }
  130. impl Stoppable for Mesh {
  131. async fn stop(&self) {
  132. // TODO: Delete own draw call
  133. // Free buffers
  134. // Should this be in drop?
  135. self.render_api.delete_buffer(self.vertex_buffer);
  136. self.render_api.delete_buffer(self.index_buffer);
  137. }
  138. }