gfx.rs 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328
  1. use darkfi_serial::{Decodable, Encodable, SerialDecodable, SerialEncodable};
  2. use fontdue::{
  3. layout::{CoordinateSystem, GlyphPosition, Layout, LayoutSettings, TextStyle},
  4. Font, FontSettings,
  5. };
  6. use miniquad::*;
  7. use pyo3::{
  8. prelude::*,
  9. py_run,
  10. types::{IntoPyDict, PyDict},
  11. PyClass,
  12. };
  13. use std::{
  14. array::IntoIter,
  15. fmt,
  16. io::Cursor,
  17. sync::{mpsc, Arc, MutexGuard},
  18. time::{Duration, Instant},
  19. };
  20. use crate::{
  21. error::{Error, Result},
  22. expr::{SExprVal, SExprMachine},
  23. prop::{Property, PropertySubType, PropertyType},
  24. scene::{MethodResponseFn, SceneGraph, SceneGraphPtr, SceneNode, SceneNodeId, SceneNodeType},
  25. shader,
  26. };
  27. trait MouseButtonAsU8 {
  28. fn to_u8(&self) -> u8;
  29. }
  30. impl MouseButtonAsU8 for MouseButton {
  31. fn to_u8(&self) -> u8 {
  32. match self {
  33. MouseButton::Left => 0,
  34. MouseButton::Middle => 1,
  35. MouseButton::Right => 2,
  36. MouseButton::Unknown => 3,
  37. }
  38. }
  39. }
  40. #[derive(Debug, SerialEncodable, SerialDecodable)]
  41. #[repr(C)]
  42. struct Vertex {
  43. pos: [f32; 2],
  44. color: [f32; 4],
  45. uv: [f32; 2],
  46. }
  47. #[derive(SerialEncodable, SerialDecodable)]
  48. #[repr(C)]
  49. struct Face {
  50. idxs: [u32; 3],
  51. }
  52. impl fmt::Debug for Face {
  53. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  54. write!(f, "{:?}", self.idxs)
  55. }
  56. }
  57. struct Mesh {
  58. pub verts: Vec<Vertex>,
  59. pub faces: Vec<Face>,
  60. pub vertex_buffer: BufferId,
  61. pub index_buffer: BufferId,
  62. }
  63. #[derive(Debug)]
  64. struct Rectangle<T> {
  65. x: T,
  66. y: T,
  67. w: T,
  68. h: T,
  69. }
  70. impl<T> Rectangle<T> {
  71. fn from_array(arr: [T; 4]) -> Self {
  72. let mut iter = IntoIter::new(arr);
  73. Self {
  74. x: iter.next().unwrap(),
  75. y: iter.next().unwrap(),
  76. w: iter.next().unwrap(),
  77. h: iter.next().unwrap(),
  78. }
  79. }
  80. }
  81. type ResourceId = u32;
  82. struct ResourceManager<T> {
  83. resources: Vec<(ResourceId, Option<T>)>,
  84. freed: Vec<usize>,
  85. id_counter: ResourceId,
  86. }
  87. impl<T> ResourceManager<T> {
  88. fn new() -> Self {
  89. Self { resources: vec![], freed: vec![], id_counter: 0 }
  90. }
  91. fn alloc(&mut self, rsrc: T) -> ResourceId {
  92. let id = self.id_counter;
  93. self.id_counter += 1;
  94. if self.freed.is_empty() {
  95. let idx = self.resources.len();
  96. self.resources.push((id, Some(rsrc)));
  97. } else {
  98. let idx = self.freed.pop().unwrap();
  99. let _ = std::mem::replace(&mut self.resources[idx], (id, Some(rsrc)));
  100. }
  101. id
  102. }
  103. fn get(&self, id: ResourceId) -> Option<&T> {
  104. for (idx, (rsrc_id, rsrc)) in self.resources.iter().enumerate() {
  105. if self.freed.contains(&idx) {
  106. continue
  107. }
  108. if *rsrc_id == id {
  109. return rsrc.as_ref()
  110. }
  111. }
  112. None
  113. }
  114. fn free(&mut self, id: ResourceId) -> Result<()> {
  115. for (idx, (rsrc_id, rsrc)) in self.resources.iter_mut().enumerate() {
  116. if self.freed.contains(&idx) {
  117. return Err(Error::ResourceNotFound)
  118. }
  119. if *rsrc_id == id {
  120. *rsrc = None;
  121. self.freed.push(idx);
  122. return Ok(())
  123. }
  124. }
  125. Err(Error::ResourceNotFound)
  126. }
  127. }
  128. #[derive(Debug)]
  129. enum GraphicsMethodEvent {
  130. CreateText,
  131. LoadTexture,
  132. CreateMesh,
  133. DeleteTexture,
  134. DeleteMesh,
  135. }
  136. struct Stage {
  137. ctx: Box<dyn RenderingBackend>,
  138. pipeline: Pipeline,
  139. scene_graph: SceneGraphPtr,
  140. textures: ResourceManager<TextureId>,
  141. meshes: ResourceManager<Mesh>,
  142. font: Font,
  143. method_recvr: mpsc::Receiver<(GraphicsMethodEvent, SceneNodeId, Vec<u8>, MethodResponseFn)>,
  144. method_sender: mpsc::SyncSender<(GraphicsMethodEvent, SceneNodeId, Vec<u8>, MethodResponseFn)>,
  145. last_draw_time: Option<Instant>,
  146. }
  147. impl Stage {
  148. const WHITE_TEXTURE_ID: ResourceId = 0;
  149. pub fn new(scene_graph: SceneGraphPtr) -> Stage {
  150. let mut ctx: Box<dyn RenderingBackend> = window::new_rendering_backend();
  151. let white_texture = ctx.new_texture_from_rgba8(1, 1, &[255, 255, 255, 255]);
  152. let mut textures = ResourceManager::new();
  153. let white_texture_id = textures.alloc(white_texture);
  154. assert_eq!(white_texture_id, Self::WHITE_TEXTURE_ID);
  155. let mut shader_meta: ShaderMeta = shader::meta();
  156. shader_meta.uniforms.uniforms.push(UniformDesc::new("Projection", UniformType::Mat4));
  157. shader_meta.uniforms.uniforms.push(UniformDesc::new("Model", UniformType::Mat4));
  158. let shader = ctx
  159. .new_shader(
  160. match ctx.info().backend {
  161. Backend::OpenGl => ShaderSource::Glsl {
  162. vertex: shader::GL_VERTEX,
  163. fragment: shader::GL_FRAGMENT,
  164. },
  165. Backend::Metal => ShaderSource::Msl { program: shader::METAL },
  166. },
  167. shader_meta,
  168. )
  169. .unwrap();
  170. let params = PipelineParams {
  171. color_blend: Some(BlendState::new(
  172. Equation::Add,
  173. BlendFactor::Value(BlendValue::SourceAlpha),
  174. BlendFactor::OneMinusValue(BlendValue::SourceAlpha),
  175. )),
  176. ..Default::default()
  177. };
  178. let pipeline = ctx.new_pipeline(
  179. &[BufferLayout::default()],
  180. &[
  181. VertexAttribute::new("in_pos", VertexFormat::Float2),
  182. VertexAttribute::new("in_color", VertexFormat::Float4),
  183. VertexAttribute::new("in_uv", VertexFormat::Float2),
  184. ],
  185. shader,
  186. params,
  187. );
  188. let (method_sender, method_recvr) = mpsc::sync_channel(100);
  189. let font = {
  190. let mut scene_graph = scene_graph.lock().unwrap();
  191. let font = scene_graph.add_node("font", SceneNodeType::Fonts);
  192. let font_id = font.id;
  193. scene_graph.link(font_id, SceneGraph::ROOT_ID).unwrap();
  194. let inter_regular = scene_graph.add_node("inter-regular", SceneNodeType::Font);
  195. let font = include_bytes!("../Inter-Regular.ttf") as &[u8];
  196. let font = Font::from_bytes(font, FontSettings::default()).unwrap();
  197. //let line_metrics = font.horizontal_line_metrics(1.).unwrap();
  198. //inter_regular.add_property_f32("ascent", line_metrics.ascent).unwrap();
  199. //inter_regular.add_property_f32("descent", line_metrics.descent).unwrap();
  200. //inter_regular.add_property_f32("line_gap", line_metrics.line_gap).unwrap();
  201. //inter_regular.add_property_f32("new_line_size", line_metrics.new_line_size).unwrap();
  202. let sender = method_sender.clone();
  203. let inter_regular_id = inter_regular.id;
  204. let method_fn = Box::new(move |arg_data, response_fn| {
  205. sender.send((
  206. GraphicsMethodEvent::CreateText,
  207. inter_regular_id,
  208. arg_data,
  209. response_fn,
  210. ));
  211. });
  212. inter_regular.add_method(
  213. "create_text",
  214. vec![
  215. ("node_name", "", PropertyType::Str),
  216. ("text", "", PropertyType::Str),
  217. ("font_size", "", PropertyType::Float32),
  218. ],
  219. vec![("node_id", "", PropertyType::SceneNodeId)],
  220. method_fn,
  221. );
  222. scene_graph.link(inter_regular_id, font_id).unwrap();
  223. font
  224. };
  225. let mut stage = Stage {
  226. ctx,
  227. pipeline,
  228. scene_graph,
  229. textures,
  230. meshes: ResourceManager::new(),
  231. font,
  232. method_recvr,
  233. method_sender,
  234. last_draw_time: None
  235. };
  236. stage.setup_scene_graph_window();
  237. debug!("Finished loading GUI");
  238. stage
  239. }
  240. fn setup_scene_graph_window(&mut self) {
  241. let mut scene_graph = self.scene_graph.lock().unwrap();
  242. let window = scene_graph.add_node("window", SceneNodeType::Window);
  243. let (screen_width, screen_height) = window::screen_size();
  244. let mut prop = Property::new("screen_size", PropertyType::Float32, PropertySubType::Pixel);
  245. prop.set_array_len(2);
  246. prop.set_f32(0, screen_width);
  247. prop.set_f32(1, screen_height);
  248. window.add_property(prop).unwrap();
  249. window
  250. .add_signal(
  251. "resize",
  252. "Screen resize event",
  253. vec![
  254. ("screen_width", "", PropertyType::Float32),
  255. ("screen_height", "", PropertyType::Float32),
  256. ],
  257. )
  258. .unwrap();
  259. let sender = self.method_sender.clone();
  260. let window_id = window.id;
  261. let method_fn = Box::new(move |arg_data, response_fn| {
  262. sender.send((GraphicsMethodEvent::LoadTexture, window_id, arg_data, response_fn));
  263. });
  264. window
  265. .add_method(
  266. "load_texture",
  267. vec![("node_name", "", PropertyType::Str), ("path", "", PropertyType::Str)],
  268. vec![("node_id", "", PropertyType::SceneNodeId)],
  269. method_fn,
  270. )
  271. .unwrap();
  272. scene_graph.link(window_id, SceneGraph::ROOT_ID).unwrap();
  273. let input = scene_graph.add_node("input", SceneNodeType::WindowInput);
  274. let input_id = input.id;
  275. scene_graph.link(input_id, window_id).unwrap();
  276. let keyb = scene_graph.add_node("keyboard", SceneNodeType::Keyboard);
  277. keyb.add_signal(
  278. "key_down",
  279. "Key press down event",
  280. vec![
  281. ("shift", "", PropertyType::Bool),
  282. ("ctrl", "", PropertyType::Bool),
  283. ("alt", "", PropertyType::Bool),
  284. ("logo", "", PropertyType::Bool),
  285. ("repeat", "", PropertyType::Bool),
  286. ("keycode", "", PropertyType::Enum),
  287. ],
  288. )
  289. .unwrap();
  290. let keyb_id = keyb.id;
  291. scene_graph.link(keyb_id, input_id).unwrap();
  292. let mouse = scene_graph.add_node("mouse", SceneNodeType::Mouse);
  293. mouse
  294. .add_signal(
  295. "button_up",
  296. "Mouse button up event",
  297. vec![
  298. ("button", "", PropertyType::Enum),
  299. ("x", "", PropertyType::Float32),
  300. ("y", "", PropertyType::Float32),
  301. ],
  302. )
  303. .unwrap();
  304. mouse
  305. .add_signal(
  306. "button_down",
  307. "Mouse button down event",
  308. vec![
  309. ("button", "", PropertyType::Enum),
  310. ("x", "", PropertyType::Float32),
  311. ("y", "", PropertyType::Float32),
  312. ],
  313. )
  314. .unwrap();
  315. mouse
  316. .add_signal(
  317. "wheel",
  318. "Mouse wheel scroll event",
  319. vec![("x", "", PropertyType::Float32), ("y", "", PropertyType::Float32)],
  320. )
  321. .unwrap();
  322. mouse
  323. .add_signal(
  324. "move",
  325. "Mouse cursor move event",
  326. vec![("x", "", PropertyType::Float32), ("y", "", PropertyType::Float32)],
  327. )
  328. .unwrap();
  329. let mouse_id = mouse.id;
  330. scene_graph.link(mouse_id, input_id).unwrap();
  331. }
  332. fn draw_glyph(
  333. ctx: &mut Box<dyn RenderingBackend>,
  334. proj: &glam::Mat4,
  335. model: &glam::Mat4,
  336. font: &Font,
  337. glyph_pos: &GlyphPosition,
  338. color: [f32; 4],
  339. ) {
  340. //let proj =
  341. // glam::Mat4::from_translation(glam::Vec3::new(-1., 1., 0.)) *
  342. // glam::Mat4::from_scale(glam::Vec3::new(2./screen_width, -2./screen_height, 1.));
  343. //let model = glam::Mat4::IDENTITY;
  344. let mut uniforms_data = [0u8; 128];
  345. let data: [u8; 64] = unsafe { std::mem::transmute_copy(proj) };
  346. uniforms_data[0..64].copy_from_slice(&data);
  347. let data: [u8; 64] = unsafe { std::mem::transmute_copy(model) };
  348. uniforms_data[64..].copy_from_slice(&data);
  349. assert_eq!(128, 2 * UniformType::Mat4.size());
  350. ctx.apply_uniforms_from_bytes(uniforms_data.as_ptr(), uniforms_data.len());
  351. let (font_metrics, text_bitmap) = font.rasterize(glyph_pos.parent, glyph_pos.key.px);
  352. let text_bitmap: Vec<_> =
  353. text_bitmap.iter().flat_map(|coverage| vec![255, 255, 255, *coverage]).collect();
  354. let (x, y) = (glyph_pos.x, glyph_pos.y);
  355. let (w, h) = (glyph_pos.width as f32, glyph_pos.height as f32);
  356. // 0 1
  357. // (-1, 1) ----- (1, 1)
  358. // | / |
  359. // | / |
  360. // | / |
  361. // | / |
  362. // (-1, -1) ---- (1, -1)
  363. // 2 3
  364. //
  365. // faces: 021, 123
  366. let vertices: [Vertex; 4] = [
  367. // top left
  368. Vertex { pos: [x, y], color, uv: [0., 0.] },
  369. // top right
  370. Vertex { pos: [x + w, y], color, uv: [1., 0.] },
  371. // bottom left
  372. Vertex { pos: [x, y + h], color, uv: [0., 1.] },
  373. // bottom right
  374. Vertex { pos: [x + w, y + h], color, uv: [1., 1.] },
  375. ];
  376. //debug!("screen size: {:?}", window::screen_size());
  377. let vertex_buffer = ctx.new_buffer(
  378. BufferType::VertexBuffer,
  379. BufferUsage::Immutable,
  380. BufferSource::slice(&vertices),
  381. );
  382. let indices: [u16; 6] = [0, 2, 1, 1, 2, 3];
  383. let index_buffer = ctx.new_buffer(
  384. BufferType::IndexBuffer,
  385. BufferUsage::Immutable,
  386. BufferSource::slice(&indices),
  387. );
  388. let texture = ctx.new_texture_from_rgba8(
  389. font_metrics.width as u16,
  390. font_metrics.height as u16,
  391. &text_bitmap,
  392. );
  393. let bindings =
  394. Bindings { vertex_buffers: vec![vertex_buffer], index_buffer, images: vec![texture] };
  395. ctx.apply_bindings(&bindings);
  396. ctx.draw(0, 6, 1);
  397. ctx.delete_texture(texture);
  398. }
  399. fn method_create_text(&mut self, node_id: SceneNodeId, arg_data: Vec<u8>) -> Result<Vec<u8>> {
  400. let mut cur = Cursor::new(&arg_data);
  401. let node_name = String::decode(&mut cur).unwrap();
  402. let text = String::decode(&mut cur).unwrap();
  403. let font_size = f32::decode(&mut cur).unwrap();
  404. let mut scene_graph = self.scene_graph.lock().unwrap();
  405. let font_node = scene_graph.get_node(node_id).ok_or(Error::NodeNotFound)?;
  406. let font_name = font_node.name.clone();
  407. let font_node_id = font_node.id;
  408. let text_node = scene_graph.add_node(node_name, SceneNodeType::RenderText);
  409. let mut prop = Property::new("text", PropertyType::Str, PropertySubType::Null);
  410. text_node.add_property(prop)?;
  411. let mut prop = Property::new("font_size", PropertyType::Float32, PropertySubType::Pixel);
  412. text_node.add_property(prop)?;
  413. let mut prop = Property::new("color", PropertyType::Float32, PropertySubType::Color);
  414. prop.set_array_len(4);
  415. text_node.add_property(prop)?;
  416. let mut layout = Layout::new(CoordinateSystem::PositiveYDown);
  417. layout.reset(&LayoutSettings { ..LayoutSettings::default() });
  418. let font = match font_name.as_str() {
  419. "inter-regular" => &self.font,
  420. _ => panic!("unknown font name!"),
  421. };
  422. let fonts = [font];
  423. layout.append(&fonts, &TextStyle::new(&text, font_size, 0));
  424. // Calculate the text width
  425. // std::cmp::max() not impl for f32
  426. let max_f32 = |x: f32, y: f32| {
  427. if x > y {
  428. x
  429. } else {
  430. y
  431. }
  432. };
  433. // TODO: this calc isn't multiline, we should add width property to each line
  434. let mut total_width = 0.;
  435. for glyph_pos in layout.glyphs() {
  436. let right = glyph_pos.x + glyph_pos.width as f32;
  437. total_width = max_f32(total_width, right);
  438. }
  439. let mut prop = Property::new("size", PropertyType::Float32, PropertySubType::Pixel);
  440. prop.set_array_len(2);
  441. prop.set_f32(0, total_width).unwrap();
  442. prop.set_f32(1, layout.height()).unwrap();
  443. let text_node_id = text_node.id;
  444. /*
  445. let lines = layout.lines();
  446. if lines.is_some() {
  447. for (idx, line) in lines.unwrap().into_iter().enumerate() {
  448. let line_node_name = format!("line.{}", idx);
  449. let line_node = scene_graph.add_node(line_node_name, SceneNodeType::LinePosition);
  450. //line_node.add_property_u32("idx", idx as u32).unwrap();
  451. //line_node.add_property_f32("baseline_y", line.baseline_y).unwrap();
  452. //line_node.add_property_f32("padding", line.padding).unwrap();
  453. //line_node.add_property_f32("max_ascent", line.max_ascent).unwrap();
  454. //line_node.add_property_f32("min_descent", line.min_descent).unwrap();
  455. //line_node.add_property_f32("max_line_gap", line.max_line_gap).unwrap();
  456. //line_node.add_property_u32("glyph_start", line.glyph_start as u32).unwrap();
  457. //line_node.add_property_u32("glyph_end", line.glyph_end as u32).unwrap();
  458. let line_node_id = line_node.id;
  459. scene_graph.link(line_node_id, text_node_id)?;
  460. }
  461. }
  462. */
  463. scene_graph.link(font_node_id, text_node_id)?;
  464. let mut reply = vec![];
  465. text_node_id.encode(&mut reply).unwrap();
  466. Ok(reply)
  467. }
  468. fn method_load_texture(&mut self, node_id: SceneNodeId, arg_data: Vec<u8>) -> Result<Vec<u8>> {
  469. let mut cur = Cursor::new(&arg_data);
  470. let node_name = String::decode(&mut cur).unwrap();
  471. let filepath = String::decode(&mut cur).unwrap();
  472. let Ok(img) = image::open(filepath) else { return Err(Error::FileNotFound) };
  473. let img = img.to_rgba8();
  474. let width = img.width();
  475. let height = img.height();
  476. let bmp = img.into_raw();
  477. let texture = self.ctx.new_texture_from_rgba8(width as u16, height as u16, &bmp);
  478. let id = self.textures.alloc(texture);
  479. let mut scene_graph = self.scene_graph.lock().unwrap();
  480. let img_node = scene_graph.add_node(node_name, SceneNodeType::RenderTexture);
  481. let mut prop = Property::new("size", PropertyType::Uint32, PropertySubType::Pixel);
  482. prop.set_array_len(2);
  483. prop.set_u32(0, width).unwrap();
  484. prop.set_u32(1, height).unwrap();
  485. img_node.add_property(prop)?;
  486. let mut prop =
  487. Property::new("texture_id", PropertyType::Uint32, PropertySubType::ResourceId);
  488. prop.set_u32(0, id).unwrap();
  489. img_node.add_property(prop)?;
  490. let mut reply = vec![];
  491. img_node.id.encode(&mut reply).unwrap();
  492. Ok(reply)
  493. }
  494. fn method_create_mesh(&mut self, node_id: SceneNodeId, arg_data: Vec<u8>) -> Result<Vec<u8>> {
  495. let mut cur = Cursor::new(&arg_data);
  496. let node_name = String::decode(&mut cur).unwrap();
  497. let verts = Vec::<Vertex>::decode(&mut cur).unwrap();
  498. let faces = Vec::<Face>::decode(&mut cur).unwrap();
  499. let vertex_buffer = self.ctx.new_buffer(
  500. BufferType::VertexBuffer,
  501. BufferUsage::Immutable,
  502. BufferSource::slice(&verts),
  503. );
  504. /*
  505. let bufsrc = unsafe {
  506. BufferSource::pointer(
  507. faces.as_ptr() as _,
  508. std::mem::size_of_val(&faces[..]),
  509. std::mem::size_of::<u32>(),
  510. )
  511. };
  512. */
  513. let index_buffer = self.ctx.new_buffer(
  514. BufferType::IndexBuffer,
  515. BufferUsage::Immutable,
  516. BufferSource::slice(&faces),
  517. );
  518. let mesh = Mesh { verts, faces, vertex_buffer, index_buffer };
  519. let mesh_id = self.meshes.alloc(mesh);
  520. let mut scene_graph = self.scene_graph.lock().unwrap();
  521. let node = scene_graph.add_node(node_name, SceneNodeType::RenderMesh);
  522. let mut prop = Property::new("mesh_id", PropertyType::Uint32, PropertySubType::ResourceId);
  523. prop.set_u32(0, mesh_id).unwrap();
  524. node.add_property(prop)?;
  525. let mut reply = vec![];
  526. node.id.encode(&mut reply).unwrap();
  527. Ok(reply)
  528. }
  529. fn method_delete_texture(
  530. &mut self,
  531. node_id: SceneNodeId,
  532. arg_data: Vec<u8>,
  533. ) -> Result<Vec<u8>> {
  534. let mut cur = Cursor::new(&arg_data);
  535. let texture_id = ResourceId::decode(&mut cur).unwrap();
  536. let texture = self.textures.get(texture_id).ok_or(Error::ResourceNotFound)?;
  537. self.ctx.delete_texture(*texture);
  538. self.textures.free(texture_id);
  539. Ok(vec![])
  540. }
  541. fn method_delete_mesh(&mut self, node_id: SceneNodeId, arg_data: Vec<u8>) -> Result<Vec<u8>> {
  542. let mut cur = Cursor::new(&arg_data);
  543. let mesh_id = ResourceId::decode(&mut cur).unwrap();
  544. let mesh = self.meshes.get(mesh_id).ok_or(Error::ResourceNotFound)?;
  545. self.ctx.delete_buffer(mesh.vertex_buffer);
  546. self.ctx.delete_buffer(mesh.index_buffer);
  547. self.meshes.free(mesh_id);
  548. Ok(vec![])
  549. }
  550. }
  551. struct RenderContext<'a> {
  552. scene_graph: MutexGuard<'a, SceneGraph>,
  553. ctx: &'a mut Box<dyn RenderingBackend>,
  554. pipeline: &'a Pipeline,
  555. proj: glam::Mat4,
  556. textures: &'a ResourceManager<TextureId>,
  557. }
  558. impl<'a> RenderContext<'a> {
  559. fn render_window(&mut self) {
  560. for layer in self
  561. .scene_graph
  562. .lookup_node("/window")
  563. .expect("no window attached!")
  564. .get_children(&[SceneNodeType::RenderLayer])
  565. {
  566. if let Err(err) = self.render_layer(layer.id) {
  567. error!("error rendering layer '{}': {}", layer.name, err)
  568. }
  569. }
  570. }
  571. fn get_rect(layer: &SceneNode) -> Result<Rectangle<i32>> {
  572. let prop = layer.get_property("rect").ok_or(Error::PropertyNotFound)?;
  573. if prop.array_len != 4 {
  574. return Err(Error::PropertyWrongLen)
  575. }
  576. let mut rect = [0; 4];
  577. for i in 0..4 {
  578. if prop.is_expr(i)? {
  579. let (screen_width, screen_height) = window::screen_size();
  580. let expr = prop.get_expr(i).unwrap();
  581. let machine = SExprMachine {
  582. globals: vec![
  583. ("sw".to_string(), SExprVal::Float32(screen_width)),
  584. ("sh".to_string(), SExprVal::Float32(screen_height)),
  585. ],
  586. stmts: &expr
  587. };
  588. rect[i] = machine.call()?.as_u32()? as i32;
  589. } else {
  590. rect[i] = prop.get_u32(i)? as i32;
  591. }
  592. }
  593. Ok(Rectangle::from_array(rect))
  594. }
  595. fn render_layer(
  596. &mut self,
  597. layer_id: SceneNodeId,
  598. // parent rect
  599. ) -> Result<()> {
  600. let layer = self.scene_graph.get_node(layer_id).unwrap();
  601. if !layer.get_property_bool("is_visible")? {
  602. return Ok(())
  603. }
  604. self.ctx.begin_default_pass(PassAction::Nothing);
  605. self.ctx.apply_pipeline(&self.pipeline);
  606. let (_, screen_height) = window::screen_size();
  607. let mut rect = Self::get_rect(&layer)?;
  608. rect.y = screen_height as i32 - (rect.y + rect.h);
  609. self.ctx.apply_viewport(rect.x, rect.y, rect.w, rect.h);
  610. self.ctx.apply_scissor_rect(rect.x, rect.y, rect.w, rect.h);
  611. // get the rectangle
  612. // make sure it's inside the parent's rect
  613. for child in layer.get_children(&[SceneNodeType::RenderMesh]) {
  614. // x, y, w, h as pixels
  615. // note that (x, y) is offset by layer rect so it is the pos within layer
  616. // layer coords are (0, 0) -> (1, 1)
  617. // optionally evaluated using python
  618. // mesh data is (0, 0) to (1, 1)
  619. // so scale by (w, h)
  620. match child.typ {
  621. SceneNodeType::RenderMesh => {
  622. if let Err(err) = self.render_mesh(child.id, &rect) {
  623. error!("error rendering mesh '{}': {}", child.name, err);
  624. }
  625. }
  626. _ => panic!("render_layer(): unknown type"),
  627. }
  628. }
  629. self.ctx.end_render_pass();
  630. Ok(())
  631. }
  632. fn get_dim(mesh: &SceneNode, layer_rect: &Rectangle<i32>) -> Result<Rectangle<f32>> {
  633. let prop = mesh.get_property("rect").ok_or(Error::PropertyNotFound)?;
  634. if prop.array_len != 4 {
  635. return Err(Error::PropertyWrongLen)
  636. }
  637. let mut rect = [0.; 4];
  638. for i in 0..4 {
  639. if prop.is_expr(i)? {
  640. let expr = prop.get_expr(i).unwrap();
  641. let machine = SExprMachine {
  642. globals: vec![
  643. ("lw".to_string(), SExprVal::Uint32(layer_rect.w as u32)),
  644. ("lh".to_string(), SExprVal::Uint32(layer_rect.h as u32)),
  645. ],
  646. stmts: &expr
  647. };
  648. rect[i] = machine.call()?.coerce_f32()?;
  649. } else {
  650. rect[i] = prop.get_f32(i)?;
  651. }
  652. }
  653. Ok(Rectangle::from_array(rect))
  654. }
  655. fn render_mesh(&mut self, mesh_id: SceneNodeId, layer_rect: &Rectangle<i32>) -> Result<()> {
  656. let mesh = self.scene_graph.get_node(mesh_id).unwrap();
  657. let data = mesh.get_property("data").ok_or(Error::PropertyNotFound)?;
  658. let verts = data.get_buf(0)?;
  659. let faces = data.get_buf(1)?;
  660. let vertex_buffer = self.ctx.new_buffer(
  661. BufferType::VertexBuffer,
  662. BufferUsage::Immutable,
  663. BufferSource::slice(&verts),
  664. );
  665. let bufsrc = unsafe {
  666. BufferSource::pointer(
  667. faces.as_ptr() as _,
  668. std::mem::size_of_val(&faces[..]),
  669. std::mem::size_of::<u32>(),
  670. )
  671. };
  672. let index_buffer =
  673. self.ctx.new_buffer(BufferType::IndexBuffer, BufferUsage::Immutable, bufsrc);
  674. // temp
  675. let texture = self.textures.get(Stage::WHITE_TEXTURE_ID).unwrap();
  676. let bindings =
  677. Bindings { vertex_buffers: vec![vertex_buffer], index_buffer, images: vec![*texture] };
  678. self.ctx.apply_bindings(&bindings);
  679. let rect = Self::get_dim(mesh, layer_rect)?;
  680. //debug!("mesh rect: {:?}", rect);
  681. let layer_w = layer_rect.w as f32;
  682. let layer_h = layer_rect.h as f32;
  683. let off_x = rect.x / layer_w;
  684. let off_y = rect.y / layer_h;
  685. let scale_x = rect.w / layer_w;
  686. let scale_y = rect.h / layer_h;
  687. //let model = glam::Mat4::IDENTITY;
  688. let model = glam::Mat4::from_translation(glam::Vec3::new(off_x, off_y, 0.)) *
  689. glam::Mat4::from_scale(glam::Vec3::new(scale_x, scale_y, 1.));
  690. let mut uniforms_data = [0u8; 128];
  691. let data: [u8; 64] = unsafe { std::mem::transmute_copy(&self.proj) };
  692. uniforms_data[0..64].copy_from_slice(&data);
  693. let data: [u8; 64] = unsafe { std::mem::transmute_copy(&model) };
  694. uniforms_data[64..].copy_from_slice(&data);
  695. assert_eq!(128, 2 * UniformType::Mat4.size());
  696. self.ctx.apply_uniforms_from_bytes(uniforms_data.as_ptr(), uniforms_data.len());
  697. self.ctx.draw(0, 3 * faces.len() as i32, 1);
  698. self.ctx.delete_buffer(index_buffer);
  699. self.ctx.delete_buffer(vertex_buffer);
  700. Ok(())
  701. }
  702. }
  703. fn eval_py_str<'py>(code: &str, locals: Py<PyDict>) -> PyResult<f32> {
  704. Python::with_gil(|py| {
  705. let null = ();
  706. // https://stackoverflow.com/questions/35804961/python-eval-is-it-still-dangerous-if-i-disable-builtins-and-attribute-access
  707. // See safe_eval() by tardyp and astrun
  708. // We don't care about resource usage, just accessing system resources.
  709. // Can also use restrictedpython lib to eval the code.
  710. // Also PyPy sandboxing
  711. // and starlark / starlark-rust
  712. py_run!(
  713. py,
  714. null,
  715. r#"
  716. __builtins__.__dict__['__import__'] = None
  717. __builtins__.__dict__['open'] = None
  718. "#
  719. );
  720. let locals = locals.bind(py);
  721. let result: f32 = py.eval_bound(code, None, Some(locals))?.extract()?;
  722. Ok(result)
  723. })
  724. }
  725. /*
  726. fn get_obj_props(obj: &SceneNode) -> Result<(f32, f32, f32, f32, bool)> {
  727. let x = obj.get_property_f32("x")?;
  728. let y = obj.get_property_f32("y")?;
  729. let scale_x = obj.get_property_f32("scale_x")?;
  730. let scale_y = obj.get_property_f32("scale_y")?;
  731. let is_visible = obj.get_property_bool("is_visible")?;
  732. Ok((x, y, scale_x, scale_y, is_visible))
  733. }
  734. fn get_text_props(render_text: &SceneNode) -> Result<(String, f32, [f32; 4])> {
  735. let text = render_text.get_property_str("text")?;
  736. let font_size = render_text.get_property_f32("font_size")?;
  737. let r = render_text.get_property_f32("r")?;
  738. let g = render_text.get_property_f32("g")?;
  739. let b = render_text.get_property_f32("b")?;
  740. let a = render_text.get_property_f32("a")?;
  741. let color = [r, g, b, a];
  742. Ok((text, font_size, color))
  743. }
  744. */
  745. impl EventHandler for Stage {
  746. fn update(&mut self) {
  747. if self.last_draw_time.is_none() {
  748. return
  749. }
  750. // Only allow 20 ms, process as much as we can during that time
  751. let elapsed_since_draw = self.last_draw_time.unwrap().elapsed();
  752. if elapsed_since_draw > Duration::from_millis(20) {
  753. return
  754. }
  755. let allowed_time = Duration::from_millis(20) - elapsed_since_draw;
  756. let deadline = Instant::now() + allowed_time;
  757. loop {
  758. let Ok((event, node_id, arg_data, response_fn)) =
  759. self.method_recvr.recv_deadline(deadline)
  760. else {
  761. break
  762. };
  763. let res = match event {
  764. GraphicsMethodEvent::CreateText => self.method_create_text(node_id, arg_data),
  765. GraphicsMethodEvent::LoadTexture => self.method_load_texture(node_id, arg_data),
  766. GraphicsMethodEvent::CreateMesh => self.method_create_mesh(node_id, arg_data),
  767. GraphicsMethodEvent::DeleteTexture => self.method_delete_texture(node_id, arg_data),
  768. GraphicsMethodEvent::DeleteMesh => self.method_delete_mesh(node_id, arg_data),
  769. };
  770. response_fn(res);
  771. }
  772. }
  773. // Only do drawing here. Apps might not call this when minimized.
  774. fn draw(&mut self) {
  775. self.last_draw_time = Some(Instant::now());
  776. let clear = PassAction::clear_color(0., 0., 0., 1.);
  777. self.ctx.begin_default_pass(clear);
  778. self.ctx.end_render_pass();
  779. let (screen_width, screen_height) = window::screen_size();
  780. // This will make the top left (0, 0) and the bottom right (1, 1)
  781. // Default is (-1, 1) -> (1, -1)
  782. let proj = glam::Mat4::from_translation(glam::Vec3::new(-1., 1., 0.)) *
  783. glam::Mat4::from_scale(glam::Vec3::new(2., -2., 1.));
  784. //let proj = glam::Mat4::IDENTITY;
  785. // Reusable text layout
  786. //let mut layout = Layout::new(CoordinateSystem::PositiveYDown);
  787. let scene_graph = self.scene_graph.lock().unwrap();
  788. let window_id = scene_graph.lookup_node_id("/window").expect("no window attached");
  789. // We need this because scene_graph must remain locked for the duration of the rendering
  790. let mut render_context = RenderContext {
  791. scene_graph,
  792. ctx: &mut self.ctx,
  793. pipeline: &self.pipeline,
  794. proj,
  795. textures: &self.textures,
  796. };
  797. render_context.render_window();
  798. drop(render_context);
  799. /*
  800. for layer in scene_graph
  801. .lookup_node("/window")
  802. .expect("no window attached!")
  803. .iter_children(&scene_graph, SceneNodeType::RenderLayer)
  804. {
  805. let is_visible = layer.get_property_bool("is_visible").unwrap();
  806. if !is_visible {
  807. continue;
  808. }
  809. //self.ctx.begin_default_pass(Default::default());
  810. self.ctx.begin_default_pass(PassAction::Nothing);
  811. self.ctx.apply_pipeline(&self.pipeline);
  812. /*
  813. let rect_x = layer.get_property_u32("rect_x").unwrap();
  814. let rect_y = layer.get_property_u32("rect_y").unwrap();
  815. let rect_w = layer.get_property_u32("rect_w").unwrap();
  816. let rect_h = layer.get_property_u32("rect_h").unwrap();
  817. self.ctx.apply_viewport(rect_x as i32, rect_y as i32, rect_w as i32, rect_h as i32);
  818. self.ctx.apply_scissor_rect(rect_x as i32, rect_y as i32, rect_w as i32, rect_h as i32);
  819. 'outer: for obj in layer.iter_children(&scene_graph, SceneNodeType::RenderObject) {
  820. let Ok((x, y, scale_x, scale_y, is_visible)) = get_obj_props(obj) else {
  821. error!("obj '{}':{} has a property error", obj.name, obj.id);
  822. continue
  823. };
  824. if !is_visible {
  825. continue
  826. }
  827. let model = glam::Mat4::from_translation(glam::Vec3::new(x, y, 0.)) *
  828. glam::Mat4::from_scale(glam::Vec3::new(scale_x, scale_y, 1.));
  829. let texture = 'texture: {
  830. let Some(texture_node) =
  831. obj.iter_children(&scene_graph, SceneNodeType::RenderTexture).next()
  832. else {
  833. break 'texture self.textures.get(Self::WHITE_TEXTURE_ID).unwrap()
  834. };
  835. let Ok(id) = texture_node.get_property_u32("texture_id") else {
  836. error!(
  837. "texture '{}':{} missing property texture_id",
  838. texture_node.name, texture_node.id
  839. );
  840. continue 'outer
  841. };
  842. let Some(texture) = self.textures.get(id) else {
  843. error!(
  844. "texture '{}':{} texture with id {} is missing!",
  845. texture_node.name, texture_node.id, id
  846. );
  847. continue 'outer
  848. };
  849. texture
  850. };
  851. for mesh in obj.iter_children(&scene_graph, SceneNodeType::RenderMesh) {
  852. let Some(verts_prop) = mesh.get_property("verts") else {
  853. error!("mesh '{}':{} missing property verts", mesh.name, mesh.id);
  854. continue
  855. };
  856. let Ok(verts) = verts_prop.get_buf() else {
  857. error!("mesh '{}':{} verts property has wrong type", mesh.name, mesh.id);
  858. continue
  859. };
  860. let Some(faces_prop) = mesh.get_property("faces") else {
  861. error!("mesh '{}':{} missing property faces", mesh.name, mesh.id);
  862. continue
  863. };
  864. let Ok(faces) = faces_prop.get_buf() else {
  865. error!("mesh '{}':{} faces property has wrong type", mesh.name, mesh.id);
  866. continue
  867. };
  868. let vertex_buffer = self.ctx.new_buffer(
  869. BufferType::VertexBuffer,
  870. BufferUsage::Immutable,
  871. BufferSource::slice(&verts),
  872. );
  873. let bufsrc = unsafe {
  874. BufferSource::pointer(
  875. faces.as_ptr() as _,
  876. std::mem::size_of_val(&faces[..]),
  877. std::mem::size_of::<u32>(),
  878. )
  879. };
  880. let index_buffer = self.ctx.new_buffer(
  881. BufferType::IndexBuffer,
  882. BufferUsage::Immutable,
  883. bufsrc,
  884. );
  885. let bindings = Bindings {
  886. vertex_buffers: vec![vertex_buffer],
  887. index_buffer,
  888. images: vec![*texture],
  889. };
  890. self.ctx.apply_bindings(&bindings);
  891. let mut uniforms_data = [0u8; 128];
  892. let data: [u8; 64] = unsafe { std::mem::transmute_copy(&proj) };
  893. uniforms_data[0..64].copy_from_slice(&data);
  894. let data: [u8; 64] = unsafe { std::mem::transmute_copy(&model) };
  895. uniforms_data[64..].copy_from_slice(&data);
  896. assert_eq!(128, 2 * UniformType::Mat4.size());
  897. self.ctx.apply_uniforms_from_bytes(uniforms_data.as_ptr(), uniforms_data.len());
  898. self.ctx.draw(0, 3 * faces.len() as i32, 1);
  899. }
  900. for render_text in obj.iter_children(&scene_graph, SceneNodeType::RenderText) {
  901. let Ok((text, font_size, color)) = get_text_props(render_text) else {
  902. error!(
  903. "text '{}':{} has a property error",
  904. render_text.name, render_text.id
  905. );
  906. continue
  907. };
  908. let Some(font_node) =
  909. render_text.iter_children(&scene_graph, SceneNodeType::Font).next()
  910. else {
  911. error!(
  912. "text '{}':{} missing a font node",
  913. render_text.name, render_text.id
  914. );
  915. continue
  916. };
  917. // No other fonts supported yet
  918. assert_eq!(font_node.name, "inter-regular");
  919. layout.reset(&LayoutSettings { ..LayoutSettings::default() });
  920. let fonts = [&self.font];
  921. layout.append(&fonts, &TextStyle::new(&text, font_size, 0));
  922. for glyph_pos in layout.glyphs() {
  923. Self::draw_glyph(
  924. &mut self.ctx,
  925. &proj,
  926. &model,
  927. &self.font,
  928. glyph_pos,
  929. color,
  930. );
  931. }
  932. }
  933. }
  934. self.ctx.end_render_pass();
  935. */
  936. }
  937. */
  938. self.ctx.commit_frame();
  939. }
  940. fn key_down_event(&mut self, keycode: KeyCode, modifiers: KeyMods, repeat: bool) {
  941. let mut scene_graph = self.scene_graph.lock().unwrap();
  942. let win = scene_graph.lookup_node_mut("/window/input/keyboard").unwrap();
  943. let send_key_down = |key: &str| {
  944. let mut data = vec![];
  945. modifiers.shift.encode(&mut data).unwrap();
  946. modifiers.ctrl.encode(&mut data).unwrap();
  947. modifiers.alt.encode(&mut data).unwrap();
  948. modifiers.logo.encode(&mut data).unwrap();
  949. repeat.encode(&mut data).unwrap();
  950. key.encode(&mut data).unwrap();
  951. win.trigger("key_down", data).unwrap();
  952. };
  953. match keycode {
  954. KeyCode::Space => send_key_down(" "),
  955. KeyCode::Apostrophe => send_key_down("'"),
  956. KeyCode::Comma => send_key_down(","),
  957. KeyCode::Minus => send_key_down("-"),
  958. KeyCode::Period => send_key_down("."),
  959. KeyCode::Slash => send_key_down("/"),
  960. KeyCode::Key0 => send_key_down("0"),
  961. KeyCode::Key1 => send_key_down("1"),
  962. KeyCode::Key2 => send_key_down("2"),
  963. KeyCode::Key3 => send_key_down("3"),
  964. KeyCode::Key4 => send_key_down("4"),
  965. KeyCode::Key5 => send_key_down("5"),
  966. KeyCode::Key6 => send_key_down("6"),
  967. KeyCode::Key7 => send_key_down("7"),
  968. KeyCode::Key8 => send_key_down("8"),
  969. KeyCode::Key9 => send_key_down("9"),
  970. KeyCode::Semicolon => send_key_down(":"),
  971. KeyCode::Equal => send_key_down("="),
  972. KeyCode::A => send_key_down("A"),
  973. KeyCode::B => send_key_down("B"),
  974. KeyCode::C => send_key_down("C"),
  975. KeyCode::D => send_key_down("D"),
  976. KeyCode::E => send_key_down("E"),
  977. KeyCode::F => send_key_down("F"),
  978. KeyCode::G => send_key_down("G"),
  979. KeyCode::H => send_key_down("H"),
  980. KeyCode::I => send_key_down("I"),
  981. KeyCode::J => send_key_down("J"),
  982. KeyCode::K => send_key_down("K"),
  983. KeyCode::L => send_key_down("L"),
  984. KeyCode::M => send_key_down("M"),
  985. KeyCode::N => send_key_down("N"),
  986. KeyCode::O => send_key_down("O"),
  987. KeyCode::P => send_key_down("P"),
  988. KeyCode::Q => send_key_down("Q"),
  989. KeyCode::R => send_key_down("R"),
  990. KeyCode::S => send_key_down("S"),
  991. KeyCode::T => send_key_down("T"),
  992. KeyCode::U => send_key_down("U"),
  993. KeyCode::V => send_key_down("V"),
  994. KeyCode::W => send_key_down("W"),
  995. KeyCode::X => send_key_down("X"),
  996. KeyCode::Y => send_key_down("Y"),
  997. KeyCode::Z => send_key_down("Z"),
  998. KeyCode::LeftBracket => send_key_down("("),
  999. KeyCode::Backslash => send_key_down("\\"),
  1000. KeyCode::RightBracket => send_key_down(")"),
  1001. KeyCode::GraveAccent => send_key_down("GraveAccent"),
  1002. KeyCode::World1 => send_key_down("World1"),
  1003. KeyCode::World2 => send_key_down("World2"),
  1004. KeyCode::Escape => send_key_down("Escape"),
  1005. KeyCode::Enter => send_key_down("Enter"),
  1006. KeyCode::Tab => send_key_down("Tab"),
  1007. KeyCode::Backspace => send_key_down("Backspace"),
  1008. KeyCode::Insert => send_key_down("Insert"),
  1009. KeyCode::Delete => send_key_down("Delete"),
  1010. KeyCode::Right => send_key_down("Right"),
  1011. KeyCode::Left => send_key_down("Left"),
  1012. KeyCode::Down => send_key_down("Down"),
  1013. KeyCode::Up => send_key_down("Up"),
  1014. KeyCode::PageUp => send_key_down("PageUp"),
  1015. KeyCode::PageDown => send_key_down("PageDown"),
  1016. KeyCode::Home => send_key_down("Home"),
  1017. KeyCode::End => send_key_down("End"),
  1018. KeyCode::CapsLock => send_key_down("CapsLock"),
  1019. KeyCode::ScrollLock => send_key_down("ScrollLock"),
  1020. KeyCode::NumLock => send_key_down("NumLock"),
  1021. KeyCode::PrintScreen => send_key_down("PrintScreen"),
  1022. KeyCode::Pause => send_key_down("Pause"),
  1023. KeyCode::F1 => send_key_down("F1"),
  1024. KeyCode::F2 => send_key_down("F2"),
  1025. KeyCode::F3 => send_key_down("F3"),
  1026. KeyCode::F4 => send_key_down("F4"),
  1027. KeyCode::F5 => send_key_down("F5"),
  1028. KeyCode::F6 => send_key_down("F6"),
  1029. KeyCode::F7 => send_key_down("F7"),
  1030. KeyCode::F8 => send_key_down("F8"),
  1031. KeyCode::F9 => send_key_down("F9"),
  1032. KeyCode::F10 => send_key_down("F10"),
  1033. KeyCode::F11 => send_key_down("F11"),
  1034. KeyCode::F12 => send_key_down("F12"),
  1035. KeyCode::F13 => send_key_down("F13"),
  1036. KeyCode::F14 => send_key_down("F14"),
  1037. KeyCode::F15 => send_key_down("F15"),
  1038. KeyCode::F16 => send_key_down("F16"),
  1039. KeyCode::F17 => send_key_down("F17"),
  1040. KeyCode::F18 => send_key_down("F18"),
  1041. KeyCode::F19 => send_key_down("F19"),
  1042. KeyCode::F20 => send_key_down("F20"),
  1043. KeyCode::F21 => send_key_down("F21"),
  1044. KeyCode::F22 => send_key_down("F22"),
  1045. KeyCode::F23 => send_key_down("F23"),
  1046. KeyCode::F24 => send_key_down("F24"),
  1047. KeyCode::F25 => send_key_down("F25"),
  1048. KeyCode::Kp0 => send_key_down("Kp0"),
  1049. KeyCode::Kp1 => send_key_down("Kp1"),
  1050. KeyCode::Kp2 => send_key_down("Kp2"),
  1051. KeyCode::Kp3 => send_key_down("Kp3"),
  1052. KeyCode::Kp4 => send_key_down("Kp4"),
  1053. KeyCode::Kp5 => send_key_down("Kp5"),
  1054. KeyCode::Kp6 => send_key_down("Kp6"),
  1055. KeyCode::Kp7 => send_key_down("Kp7"),
  1056. KeyCode::Kp8 => send_key_down("Kp8"),
  1057. KeyCode::Kp9 => send_key_down("Kp9"),
  1058. KeyCode::KpDecimal => send_key_down("KpDecimal"),
  1059. KeyCode::KpDivide => send_key_down("KpDivide"),
  1060. KeyCode::KpMultiply => send_key_down("KpMultiply"),
  1061. KeyCode::KpSubtract => send_key_down("KpSubtract"),
  1062. KeyCode::KpAdd => send_key_down("KpAdd"),
  1063. KeyCode::KpEnter => send_key_down("KpEnter"),
  1064. KeyCode::KpEqual => send_key_down("KpEqual"),
  1065. KeyCode::LeftShift => send_key_down("LeftShift"),
  1066. KeyCode::LeftControl => send_key_down("LeftControl"),
  1067. KeyCode::LeftAlt => send_key_down("LeftAlt"),
  1068. KeyCode::LeftSuper => send_key_down("LeftSuper"),
  1069. KeyCode::RightShift => send_key_down("RightShift"),
  1070. KeyCode::RightControl => send_key_down("RightControl"),
  1071. KeyCode::RightAlt => send_key_down("RightAlt"),
  1072. KeyCode::RightSuper => send_key_down("RightSuper"),
  1073. KeyCode::Menu => send_key_down("Menu"),
  1074. KeyCode::Unknown => send_key_down("Unknown"),
  1075. }
  1076. }
  1077. fn mouse_motion_event(&mut self, x: f32, y: f32) {
  1078. let mut scene_graph = self.scene_graph.lock().unwrap();
  1079. let mut data = vec![];
  1080. x.encode(&mut data).unwrap();
  1081. y.encode(&mut data).unwrap();
  1082. let mouse = scene_graph.lookup_node_mut("/window/input/mouse").unwrap();
  1083. mouse.trigger("move", data).unwrap();
  1084. }
  1085. fn mouse_wheel_event(&mut self, x: f32, y: f32) {
  1086. let mut scene_graph = self.scene_graph.lock().unwrap();
  1087. let mut data = vec![];
  1088. x.encode(&mut data).unwrap();
  1089. y.encode(&mut data).unwrap();
  1090. let mouse = scene_graph.lookup_node_mut("/window/input/mouse").unwrap();
  1091. mouse.trigger("wheel", data).unwrap();
  1092. }
  1093. fn mouse_button_down_event(&mut self, button: MouseButton, x: f32, y: f32) {
  1094. let mut scene_graph = self.scene_graph.lock().unwrap();
  1095. let mut data = vec![];
  1096. button.to_u8().encode(&mut data).unwrap();
  1097. x.encode(&mut data).unwrap();
  1098. y.encode(&mut data).unwrap();
  1099. let mouse = scene_graph.lookup_node_mut("/window/input/mouse").unwrap();
  1100. mouse.trigger("button_down", data).unwrap();
  1101. }
  1102. fn mouse_button_up_event(&mut self, button: MouseButton, x: f32, y: f32) {
  1103. let mut scene_graph = self.scene_graph.lock().unwrap();
  1104. let mut data = vec![];
  1105. button.to_u8().encode(&mut data).unwrap();
  1106. x.encode(&mut data).unwrap();
  1107. y.encode(&mut data).unwrap();
  1108. let mouse = scene_graph.lookup_node_mut("/window/input/mouse").unwrap();
  1109. mouse.trigger("button_up", data).unwrap();
  1110. }
  1111. fn resize_event(&mut self, width: f32, height: f32) {
  1112. let mut data = vec![];
  1113. width.encode(&mut data).unwrap();
  1114. height.encode(&mut data).unwrap();
  1115. let mut scene_graph = self.scene_graph.lock().unwrap();
  1116. let win = scene_graph.lookup_node_mut("/window").unwrap();
  1117. let prop = win.get_property("screen_size").unwrap();
  1118. prop.set_f32(0, width).unwrap();
  1119. prop.set_f32(1, height).unwrap();
  1120. win.trigger("resize", data).unwrap();
  1121. }
  1122. }
  1123. pub fn run_gui(scene_graph: SceneGraphPtr) {
  1124. #[cfg(target_os = "android")]
  1125. {
  1126. android_logger::init_once(
  1127. android_logger::Config::default().with_max_level(LevelFilter::Debug).with_tag("fagman"),
  1128. );
  1129. }
  1130. #[cfg(target_os = "linux")]
  1131. {
  1132. let term_logger = simplelog::TermLogger::new(
  1133. simplelog::LevelFilter::Debug,
  1134. simplelog::Config::default(),
  1135. simplelog::TerminalMode::Mixed,
  1136. simplelog::ColorChoice::Auto,
  1137. );
  1138. simplelog::CombinedLogger::init(vec![term_logger]).expect("logger");
  1139. }
  1140. let mut conf = miniquad::conf::Conf {
  1141. high_dpi: true,
  1142. window_resizable: true,
  1143. platform: miniquad::conf::Platform {
  1144. linux_backend: miniquad::conf::LinuxBackend::WaylandWithX11Fallback,
  1145. wayland_use_fallback_decorations: false,
  1146. ..Default::default()
  1147. },
  1148. ..Default::default()
  1149. };
  1150. let metal = std::env::args().nth(1).as_deref() == Some("metal");
  1151. conf.platform.apple_gfx_api =
  1152. if metal { conf::AppleGfxApi::Metal } else { conf::AppleGfxApi::OpenGl };
  1153. miniquad::start(conf, || Box::new(Stage::new(scene_graph)));
  1154. }