solve refresh rasterized text bug

This commit is contained in:
Matthieu Baumann
2021-11-12 10:05:06 +01:00
parent a8ef58bd53
commit 677ebebb3f
3 changed files with 67 additions and 69 deletions

View File

@@ -520,11 +520,7 @@ impl App {
}
}
{
self.text_renderer.begin_frame();
self.grid.update::<P>(&self.camera, force, &mut self.text_renderer);
self.text_renderer.end_frame();
}
self.grid.update::<P>(&self.camera, force, &mut self.text_renderer);
Ok(())
}

View File

@@ -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<P: Projection>(
@@ -193,65 +195,69 @@ impl ProjetedGrid {
self.hide_labels = false;
}
fn force_update<P: Projection>(&mut self, camera: &CameraViewPort, text_renderer: &mut TextRenderManager) {
let text_height = text_renderer.text_size();
let lines = lines::<P>(camera, 0.0);
self.offsets.clear();
self.sizes.clear();
let (vertices, labels): (Vec<Vec<Vector2<f64>>>, Vec<Option<Label>>) = 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::<P>(camera, 0.0);
self.offsets.clear();
self.sizes.clear();
let (vertices, labels): (Vec<Vec<Vector2<f64>>>, Vec<Option<Label>>) = 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::<f32>().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::<f32>().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::<Vec<_>>();
//self.lines = lines;
self.num_vertices = vertices.len();
let vertices: Vec<f32> = 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::<Vec<_>>();
//self.lines = lines;
self.num_vertices = vertices.len();
let vertices: Vec<f32> = 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();
}
}

View File

@@ -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<f32>) -> Result<(), JsValue>;
}
@@ -126,7 +126,7 @@ impl TextRenderManager {
self.text_size
}
pub fn add_label<A: Into<Rad<f32>>>(&mut self, text: &str, screen_pos: &Vector2<f32>, color: &Color, angle_rot: A) -> Result<(), JsValue> {
pub fn add_label<A: Into<Rad<f32>>>(&mut self, text: &str, screen_pos: &Vector2<f32>, 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) {