diff --git a/src/core/src/app.rs b/src/core/src/app.rs index 47600d2c..2c6c1636 100644 --- a/src/core/src/app.rs +++ b/src/core/src/app.rs @@ -520,11 +520,7 @@ impl App { } } - { - self.text_renderer.begin_frame(); - self.grid.update::

(&self.camera, force, &mut self.text_renderer); - self.text_renderer.end_frame(); - } + self.grid.update::

(&self.camera, force, &mut self.text_renderer); Ok(()) } diff --git a/src/core/src/renderable/grid.rs b/src/core/src/renderable/grid.rs index c7700845..e9da7cfb 100644 --- a/src/core/src/renderable/grid.rs +++ b/src/core/src/renderable/grid.rs @@ -39,6 +39,8 @@ use al_core::{VecData, VertexArrayObject}; use wasm_bindgen::JsCast; use wasm_bindgen::JsValue; +use super::labels::RenderManager; + use super::TextRenderManager; impl ProjetedGrid { pub fn new( @@ -193,65 +195,69 @@ impl ProjetedGrid { self.hide_labels = false; } fn force_update(&mut self, camera: &CameraViewPort, text_renderer: &mut TextRenderManager) { - let text_height = text_renderer.text_size(); - let lines = lines::

(camera, 0.0); - - self.offsets.clear(); - self.sizes.clear(); - let (vertices, labels): (Vec>>, Vec>) = lines - .into_iter() - .map(|line| { - if self.sizes.is_empty() { - self.offsets.push(0); - } else { - let last_offset = *self.offsets.last().unwrap(); - self.offsets.push(last_offset + self.sizes.last().unwrap()); + { + text_renderer.begin_frame(); + let text_height = text_renderer.text_size(); + let lines = lines::

(camera, 0.0); + + self.offsets.clear(); + self.sizes.clear(); + let (vertices, labels): (Vec>>, Vec>) = lines + .into_iter() + .map(|line| { + if self.sizes.is_empty() { + self.offsets.push(0); + } else { + let last_offset = *self.offsets.last().unwrap(); + self.offsets.push(last_offset + self.sizes.last().unwrap()); + } + self.sizes.push(line.vertices.len()); + + (line.vertices, line.label) + }) + .unzip(); + self.labels = labels; + + for label in self.labels.iter() { + if let Some(label) = label { + text_renderer.add_label(&label.content, &label.position.cast::().unwrap(), &self.color, cgmath::Rad(label.rot as f32)); } - self.sizes.push(line.vertices.len()); - - (line.vertices, line.label) - }) - .unzip(); - self.labels = labels; - - for label in self.labels.iter() { - if let Some(label) = label { - text_renderer.add_label(&label.content, &label.position.cast::().unwrap(), &self.color, cgmath::Rad(label.rot as f32)); } - } - - let mut vertices = vertices - .into_iter() - .flatten() - .map(|v| Vector2::new(v.x as f32, v.y as f32)) - .collect::>(); - //self.lines = lines; - self.num_vertices = vertices.len(); - - let vertices: Vec = unsafe { - vertices.set_len(vertices.len() * 2); - std::mem::transmute(vertices) - }; - - let buf_vertices = unsafe { js_sys::Float32Array::view(&vertices) }; - - self.gl.bind_vertex_array(Some(&self.vao)); - self.gl - .bind_buffer(WebGl2RenderingContext::ARRAY_BUFFER, Some(&self.vbo)); - if vertices.len() > self.size_vertices_buf { - self.size_vertices_buf = vertices.len(); - - self.gl.buffer_data_with_array_buffer_view( - WebGl2RenderingContext::ARRAY_BUFFER, - &buf_vertices, - WebGl2RenderingContext::DYNAMIC_DRAW, - ); - } else { - self.gl.buffer_sub_data_with_i32_and_array_buffer_view( - WebGl2RenderingContext::ARRAY_BUFFER, - 0, - &buf_vertices, - ); + + let mut vertices = vertices + .into_iter() + .flatten() + .map(|v| Vector2::new(v.x as f32, v.y as f32)) + .collect::>(); + //self.lines = lines; + self.num_vertices = vertices.len(); + + let vertices: Vec = unsafe { + vertices.set_len(vertices.len() * 2); + std::mem::transmute(vertices) + }; + + let buf_vertices = unsafe { js_sys::Float32Array::view(&vertices) }; + + self.gl.bind_vertex_array(Some(&self.vao)); + self.gl + .bind_buffer(WebGl2RenderingContext::ARRAY_BUFFER, Some(&self.vbo)); + if vertices.len() > self.size_vertices_buf { + self.size_vertices_buf = vertices.len(); + + self.gl.buffer_data_with_array_buffer_view( + WebGl2RenderingContext::ARRAY_BUFFER, + &buf_vertices, + WebGl2RenderingContext::DYNAMIC_DRAW, + ); + } else { + self.gl.buffer_sub_data_with_i32_and_array_buffer_view( + WebGl2RenderingContext::ARRAY_BUFFER, + 0, + &buf_vertices, + ); + } + text_renderer.end_frame(); } } diff --git a/src/core/src/renderable/labels.rs b/src/core/src/renderable/labels.rs index d713fca0..3955b05b 100644 --- a/src/core/src/renderable/labels.rs +++ b/src/core/src/renderable/labels.rs @@ -7,7 +7,7 @@ use al_core::shader::Shader; use std::collections::HashMap; pub trait RenderManager { - fn begin_frame(&mut self) -> Result<(), JsValue>; + fn begin_frame(&mut self); fn end_frame(&mut self); fn draw(&mut self, window_size: &Vector2) -> Result<(), JsValue>; } @@ -126,7 +126,7 @@ impl TextRenderManager { self.text_size } - pub fn add_label>>(&mut self, text: &str, screen_pos: &Vector2, color: &Color, angle_rot: A) -> Result<(), JsValue> { + pub fn add_label>>(&mut self, text: &str, screen_pos: &Vector2, color: &Color, angle_rot: A) { // 1. Loop over the text chars to compute the size of the text to plot let (mut w, mut h) = (0, 0); for c in text.chars() { @@ -192,20 +192,16 @@ impl TextRenderManager { rot: rot.into(), } ); - - Ok(()) } } use cgmath::Vector4; impl RenderManager for TextRenderManager { - fn begin_frame(&mut self) -> Result<(), JsValue> { + fn begin_frame(&mut self) { self.vertices.clear(); self.indices.clear(); self.labels.clear(); - - Ok(()) } fn end_frame(&mut self) {