From aa1c53f70709eb50e0e1ae4da0f85b16c078e25e Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sat, 5 Jan 2019 15:28:07 +0100 Subject: [PATCH] Text and circle --- docs/emgui_wasm.js | 160 +++++++++++++++++++--------- docs/emgui_wasm_bg.wasm | Bin 350147 -> 346638 bytes docs/frontend.js | 3 +- docs/frontend.ts | 4 +- emgui/src/emgui.rs | 10 +- emgui/src/font.rs | 35 +++++-- emgui/src/layout.rs | 35 +++++-- emgui/src/math.rs | 7 ++ emgui/src/painter.rs | 224 +++++++++++++++++++++++++++++++++++----- emgui/src/style.rs | 10 +- emgui/src/types.rs | 16 +-- emgui_wasm/Cargo.toml | 1 + emgui_wasm/src/lib.rs | 45 ++++---- emgui_wasm/src/webgl.rs | 160 +++++++++++++++++++--------- 14 files changed, 534 insertions(+), 176 deletions(-) diff --git a/docs/emgui_wasm.js b/docs/emgui_wasm.js index a9c002cf..d149981b 100644 --- a/docs/emgui_wasm.js +++ b/docs/emgui_wasm.js @@ -23,54 +23,6 @@ WASM_VECTOR_LEN = buf.length; return ptr; } - - let cachedTextDecoder = new TextDecoder('utf-8'); - - function getStringFromWasm(ptr, len) { - return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len)); - } - - let cachedGlobalArgumentPtr = null; - function globalArgumentPtr() { - if (cachedGlobalArgumentPtr === null) { - cachedGlobalArgumentPtr = wasm.__wbindgen_global_argument_ptr(); - } - return cachedGlobalArgumentPtr; - } - - let cachegetUint32Memory = null; - function getUint32Memory() { - if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== wasm.memory.buffer) { - cachegetUint32Memory = new Uint32Array(wasm.memory.buffer); - } - return cachegetUint32Memory; - } - /** - * @param {string} arg0 - * @returns {string} - */ - __exports.show_gui = function(arg0) { - const ptr0 = passStringToWasm(arg0); - const len0 = WASM_VECTOR_LEN; - const retptr = globalArgumentPtr(); - try { - wasm.show_gui(retptr, ptr0, len0); - const mem = getUint32Memory(); - const rustptr = mem[retptr / 4]; - const rustlen = mem[retptr / 4 + 1]; - - const realRet = getStringFromWasm(rustptr, rustlen).slice(); - wasm.__wbindgen_free(rustptr, rustlen * 1); - return realRet; - - - } finally { - wasm.__wbindgen_free(ptr0, len0 * 1); - - } - - }; - /** * @param {string} arg0 * @returns {Painter} @@ -114,6 +66,12 @@ function getObject(idx) { return heap[idx]; } +let cachedTextDecoder = new TextDecoder('utf-8'); + +function getStringFromWasm(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len)); +} + let heap_next = heap.length; function addHeapObject(obj) { @@ -149,6 +107,14 @@ const __widl_f_get_context_HTMLCanvasElement_target = typeof HTMLCanvasElement = throw new Error(`wasm-bindgen: HTMLCanvasElement.getContext does not exist`); }; +let cachegetUint32Memory = null; +function getUint32Memory() { + if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== wasm.memory.buffer) { + cachegetUint32Memory = new Uint32Array(wasm.memory.buffer); + } + return cachegetUint32Memory; +} + __exports.__widl_f_get_context_HTMLCanvasElement = function(arg0, arg1, arg2, exnptr) { let varg1 = getStringFromWasm(arg1, arg2); try { @@ -201,6 +167,34 @@ __exports.__widl_f_buffer_data_with_array_buffer_view_WebGLRenderingContext = fu __widl_f_buffer_data_with_array_buffer_view_WebGLRenderingContext_target.call(getObject(arg0), arg1, getObject(arg2), arg3); }; +function getArrayU8FromWasm(ptr, len) { + return getUint8Memory().subarray(ptr / 1, ptr / 1 + len); +} + +const __widl_f_tex_image_2d_with_i32_and_i32_and_i32_and_format_and_type_and_opt_u8_array_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.texImage2D || function() { + throw new Error(`wasm-bindgen: WebGLRenderingContext.texImage2D does not exist`); +}; + +__exports.__widl_f_tex_image_2d_with_i32_and_i32_and_i32_and_format_and_type_and_opt_u8_array_WebGLRenderingContext = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, exnptr) { + let varg9 = arg9 == 0 ? undefined : getArrayU8FromWasm(arg9, arg10); + try { + __widl_f_tex_image_2d_with_i32_and_i32_and_i32_and_format_and_type_and_opt_u8_array_WebGLRenderingContext_target.call(getObject(arg0), arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, varg9); + } catch (e) { + const view = getUint32Memory(); + view[exnptr / 4] = 1; + view[exnptr / 4 + 1] = addHeapObject(e); + + } +}; + +const __widl_f_active_texture_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.activeTexture || function() { + throw new Error(`wasm-bindgen: WebGLRenderingContext.activeTexture does not exist`); +}; + +__exports.__widl_f_active_texture_WebGLRenderingContext = function(arg0, arg1) { + __widl_f_active_texture_WebGLRenderingContext_target.call(getObject(arg0), arg1); +}; + const __widl_f_attach_shader_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.attachShader || function() { throw new Error(`wasm-bindgen: WebGLRenderingContext.attachShader does not exist`); }; @@ -217,6 +211,14 @@ __exports.__widl_f_bind_buffer_WebGLRenderingContext = function(arg0, arg1, arg2 __widl_f_bind_buffer_WebGLRenderingContext_target.call(getObject(arg0), arg1, getObject(arg2)); }; +const __widl_f_bind_texture_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.bindTexture || function() { + throw new Error(`wasm-bindgen: WebGLRenderingContext.bindTexture does not exist`); +}; + +__exports.__widl_f_bind_texture_WebGLRenderingContext = function(arg0, arg1, arg2) { + __widl_f_bind_texture_WebGLRenderingContext_target.call(getObject(arg0), arg1, getObject(arg2)); +}; + const __widl_f_blend_func_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.blendFunc || function() { throw new Error(`wasm-bindgen: WebGLRenderingContext.blendFunc does not exist`); }; @@ -282,6 +284,17 @@ __exports.__widl_f_create_shader_WebGLRenderingContext = function(arg0, arg1) { }; +const __widl_f_create_texture_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.createTexture || function() { + throw new Error(`wasm-bindgen: WebGLRenderingContext.createTexture does not exist`); +}; + +__exports.__widl_f_create_texture_WebGLRenderingContext = function(arg0) { + + const val = __widl_f_create_texture_WebGLRenderingContext_target.call(getObject(arg0)); + return isLikeNone(val) ? 0 : addHeapObject(val); + +}; + const __widl_f_draw_elements_with_i32_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.drawElements || function() { throw new Error(`wasm-bindgen: WebGLRenderingContext.drawElements does not exist`); }; @@ -388,6 +401,22 @@ __exports.__widl_f_shader_source_WebGLRenderingContext = function(arg0, arg1, ar __widl_f_shader_source_WebGLRenderingContext_target.call(getObject(arg0), getObject(arg1), varg2); }; +const __widl_f_tex_parameteri_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.texParameteri || function() { + throw new Error(`wasm-bindgen: WebGLRenderingContext.texParameteri does not exist`); +}; + +__exports.__widl_f_tex_parameteri_WebGLRenderingContext = function(arg0, arg1, arg2, arg3) { + __widl_f_tex_parameteri_WebGLRenderingContext_target.call(getObject(arg0), arg1, arg2, arg3); +}; + +const __widl_f_uniform1i_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.uniform1i || function() { + throw new Error(`wasm-bindgen: WebGLRenderingContext.uniform1i does not exist`); +}; + +__exports.__widl_f_uniform1i_WebGLRenderingContext = function(arg0, arg1, arg2) { + __widl_f_uniform1i_WebGLRenderingContext_target.call(getObject(arg0), getObject(arg1), arg2); +}; + const __widl_f_uniform2f_WebGLRenderingContext_target = typeof WebGLRenderingContext === 'undefined' ? null : WebGLRenderingContext.prototype.uniform2f || function() { throw new Error(`wasm-bindgen: WebGLRenderingContext.uniform2f does not exist`); }; @@ -463,6 +492,14 @@ __exports.__wbg_subarray_705096b76e15e94e = function(arg0, arg1, arg2) { return addHeapObject(getObject(arg0).subarray(arg1, arg2)); }; +__exports.__wbg_new_3153ff3e90269012 = function(arg0) { + return addHeapObject(new Uint16Array(getObject(arg0))); +}; + +__exports.__wbg_subarray_6f181829e5fd3854 = function(arg0, arg1, arg2) { + return addHeapObject(getObject(arg0).subarray(arg1, arg2)); +}; + __exports.__wbg_instanceof_Memory_d223615e29613829 = function(idx) { return getObject(idx) instanceof WebAssembly.Memory ? 1 : 0; }; @@ -511,6 +548,21 @@ __exports.__wbindgen_string_new = function(p, l) { return addHeapObject(getStringFromWasm(p, l)); }; +__exports.__wbindgen_number_get = function(n, invalid) { + let obj = getObject(n); + if (typeof(obj) === 'number') return obj; + getUint8Memory()[invalid] = 1; + return 0; +}; + +__exports.__wbindgen_is_null = function(idx) { + return getObject(idx) === null ? 1 : 0; +}; + +__exports.__wbindgen_is_undefined = function(idx) { + return getObject(idx) === undefined ? 1 : 0; +}; + __exports.__wbindgen_boolean_get = function(i) { let v = getObject(i); if (typeof(v) === 'boolean') { @@ -520,6 +572,18 @@ __exports.__wbindgen_boolean_get = function(i) { } }; +__exports.__wbindgen_is_symbol = function(i) { + return typeof(getObject(i)) === 'symbol' ? 1 : 0; +}; + +__exports.__wbindgen_string_get = function(i, len_ptr) { + let obj = getObject(i); + if (typeof(obj) !== 'string') return 0; + const ptr = passStringToWasm(obj); + getUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN; + return ptr; +}; + __exports.__wbindgen_memory = function() { return addHeapObject(wasm.memory); }; function takeObject(idx) { diff --git a/docs/emgui_wasm_bg.wasm b/docs/emgui_wasm_bg.wasm index 91399a394db825824cb0654253805f9350491f87..f9fd3d1df13f0add46388a92cfe9c41164d6eb66 100644 GIT binary patch delta 93275 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

aV4_e)Bxr)|!DULB+ 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 G*#84D#HO+U delta 95972 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 lTFobYDveKE_c2u; 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 Q;C5@Kxpf9Den|}bKZG4Y{Qv*} diff --git a/docs/frontend.js b/docs/frontend.js index 690b0a3c..ff2f2b4c 100644 --- a/docs/frontend.js +++ b/docs/frontend.js @@ -111,8 +111,7 @@ function paint_gui(canvas, input) { var commands = rust_gui(input); for (var _i = 0, commands_1 = commands; _i < commands_1.length; _i++) { var cmd = commands_1[_i]; - var commands_2 = rust_gui(input); - commands_2.unshift({ + commands.unshift({ fill_color: { r: 0, g: 0, b: 0, a: 0 }, kind: "clear" }); diff --git a/docs/frontend.ts b/docs/frontend.ts index 9213b2c4..6a3d33c9 100644 --- a/docs/frontend.ts +++ b/docs/frontend.ts @@ -206,14 +206,12 @@ function paint_gui(canvas, input: RawInput) { } wasm_bindgen.paint_webgl(g_webgl_painter, JSON.stringify(input)); } else { - let commands = rust_gui(input); + const commands = rust_gui(input); for (const cmd of commands) { - const commands = rust_gui(input); commands.unshift({ fill_color: { r: 0, g: 0, b: 0, a: 0 }, kind: "clear", }); - paint_command(canvas, cmd); } } diff --git a/emgui/src/emgui.rs b/emgui/src/emgui.rs index 1ab04aa4..d57a258c 100644 --- a/emgui/src/emgui.rs +++ b/emgui/src/emgui.rs @@ -1,7 +1,7 @@ use crate::{layout, style, types::*}; /// Encapsulates input, layout and painting for ease of use. -#[derive(Clone, Debug, Default)] +#[derive(Clone)] pub struct Emgui { pub last_input: RawInput, pub layout: layout::Layout, @@ -9,6 +9,14 @@ pub struct Emgui { } impl Emgui { + pub fn new() -> Emgui { + Emgui { + last_input: Default::default(), + layout: layout::Layout::new(), + style: Default::default(), + } + } + pub fn new_frame(&mut self, new_input: RawInput) { let gui_input = GuiInput::from_last_and_new(&self.last_input, &new_input); self.last_input = new_input; diff --git a/emgui/src/font.rs b/emgui/src/font.rs index cf7a49ab..df9619f1 100644 --- a/emgui/src/font.rs +++ b/emgui/src/font.rs @@ -5,19 +5,20 @@ use rusttype::{point, Scale}; #[derive(Clone, Copy, Debug, PartialEq)] pub struct GlyphInfo { /// X offset for nice rendering - offset_x: u16, + pub offset_x: u16, /// Y offset for nice rendering - offset_y: u16, + pub offset_y: u16, - min_x: u16, - min_y: u16, + // Texture coordinates: + pub min_x: u16, + pub min_y: u16, /// Inclusive. - max_x: u16, + pub max_x: u16, /// Inclusive - max_y: u16, + pub max_y: u16, } /// Printable ascii characters [33, 126], which excludes 32 (space) and 127 (DEL) @@ -26,6 +27,7 @@ const FIRST_ASCII: usize = 33; /// Inclusive const LAST_ASCII: usize = 126; +// TODO: break out texture atlas into separate struct, and fill it dynamically, potentially from multiple fonts. #[derive(Clone)] pub struct Font { /// Maximum character height @@ -138,8 +140,12 @@ impl Font { (FIRST_ASCII..=LAST_ASCII).map(|c| c as u8 as char) } - pub fn texture(&self) -> (usize, usize, &[u8]) { - (self.atlas_width, self.atlas_height, &self.atlas) + pub fn texture(&self) -> (u16, u16, &[u8]) { + ( + self.atlas_width as u16, + self.atlas_height as u16, + &self.atlas, + ) } pub fn pixel(&self, x: u16, y: u16) -> u8 { @@ -159,6 +165,19 @@ impl Font { } } + /// Returns the start (X) of each character, starting at zero, plus the total width. + /// i.e. returns text.chars().count() + 1 numbers. + pub fn layout_single_line(&self, text: &str) -> Vec { + let mut x_offsets = Vec::new(); + let mut x = 0.0; + for c in text.chars() { + x_offsets.push(x); + x += 7.0; // TODO: kerning + } + x_offsets.push(x); + x_offsets + } + pub fn debug_print_atlas_ascii_art(&self) { for y in 0..self.atlas_height { println!( diff --git a/emgui/src/layout.rs b/emgui/src/layout.rs index ccff0bf0..9e9079b7 100644 --- a/emgui/src/layout.rs +++ b/emgui/src/layout.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use crate::{math::*, types::*}; +use crate::{font::Font, math::*, types::*}; // ---------------------------------------------------------------------------- @@ -95,7 +95,10 @@ struct Memory { // ---------------------------------------------------------------------------- struct TextFragment { - rect: Rect, + /// The start of each character, starting at zero. + x_offsets: Vec, + /// 0 for the first line, n * line_spacing for the rest + y_offset: f32, text: String, } @@ -149,9 +152,10 @@ impl Layouter { type Id = u64; -#[derive(Clone, Debug, Default)] +#[derive(Clone)] pub struct Layout { options: LayoutOptions, + font: Font, // TODO: Arc? input: GuiInput, memory: Memory, id: Id, @@ -161,6 +165,19 @@ pub struct Layout { } impl Layout { + pub fn new() -> Layout { + Layout { + options: Default::default(), + font: Font::new(13), + input: Default::default(), + memory: Default::default(), + id: Default::default(), + layouter: Default::default(), + graphics: Default::default(), + hovering_graphics: Default::default(), + } + } + pub fn input(&self) -> &GuiInput { &self.input } @@ -388,6 +405,7 @@ impl Layout { let mut popup_layout = Layout { options: self.options, input: self.input, + font: self.font.clone(), memory: self.memory.clone(), // TODO: Arc id: self.id, layouter: Default::default(), @@ -450,11 +468,11 @@ impl Layout { let mut max_width = 0.0; let mut text_fragments = Vec::new(); for line in text.split('\n') { - // TODO: break long lines - let line_width = char_size.x * (line.len() as f32); - + let x_offsets = self.font.layout_single_line(&line); + let line_width = *x_offsets.last().unwrap(); text_fragments.push(TextFragment { - rect: Rect::from_min_size(vec2(0.0, cursor_y), vec2(line_width, char_size.y)), + x_offsets, + y_offset: cursor_y, text: line.into(), }); @@ -468,9 +486,10 @@ impl Layout { fn add_text(&mut self, pos: Vec2, text: Vec) { for fragment in text { self.graphics.push(GuiCmd::Text { - pos: pos + vec2(fragment.rect.pos.x, fragment.rect.center().y), + pos: pos + vec2(0.0, fragment.y_offset), style: TextStyle::Label, text: fragment.text, + x_offsets: fragment.x_offsets, }); } } diff --git a/emgui/src/math.rs b/emgui/src/math.rs index eff4bce7..e333aa49 100644 --- a/emgui/src/math.rs +++ b/emgui/src/math.rs @@ -92,6 +92,11 @@ pub fn lerp(min: f32, max: f32, t: f32) -> f32 { (1.0 - t) * min + t * max } +pub fn remap(from: f32, from_min: f32, from_max: f32, to_min: f32, to_max: f32) -> f32 { + let t = (from - from_min) / (from_max - from_min); + lerp(to_min, to_max, t) +} + pub fn remap_clamp(from: f32, from_min: f32, from_max: f32, to_min: f32, to_max: f32) -> f32 { let t = if from <= from_min { 0.0 @@ -102,3 +107,5 @@ pub fn remap_clamp(from: f32, from_min: f32, from_max: f32, to_min: f32, to_max: }; lerp(to_min, to_max, t) } + +pub const TAU: f32 = 2.0 * std::f32::consts::PI; diff --git a/emgui/src/painter.rs b/emgui/src/painter.rs index 76df9aae..66406a37 100644 --- a/emgui/src/painter.rs +++ b/emgui/src/painter.rs @@ -1,6 +1,7 @@ /// Outputs render info in a format suitable for e.g. OpenGL. use crate::{ font::Font, + math::{remap, Vec2, TAU}, types::{Color, PaintCmd}, }; @@ -21,11 +22,102 @@ pub struct Vertex { #[derive(Clone, Debug, Default)] pub struct Frame { pub clear_color: Option, - /// One big triangle strip + /// Draw as triangles (i.e. the length is a multiple of three) pub indices: Vec, pub vertices: Vec, } +impl Frame { + /// Uniformly colored rectangle + pub fn add_rect(&mut self, top_left: Vertex, bottom_right: Vertex) { + let idx = self.vertices.len() as u32; + self.indices.push(idx + 0); + self.indices.push(idx + 1); + self.indices.push(idx + 2); + self.indices.push(idx + 2); + self.indices.push(idx + 1); + self.indices.push(idx + 3); + + let top_right = Vertex { + x: bottom_right.x, + y: top_left.y, + u: bottom_right.u, + v: top_left.v, + color: top_left.color, + }; + let botom_left = Vertex { + x: top_left.x, + y: bottom_right.y, + u: top_left.u, + v: bottom_right.v, + color: top_left.color, + }; + self.vertices.push(top_left); + self.vertices.push(top_right); + self.vertices.push(botom_left); + self.vertices.push(bottom_right); + } + + pub fn fill_closed_path(&mut self, points: &[Vec2], normals: &[Vec2], color: Color) { + self.vertices.extend(points.iter().map(|p| Vertex { + x: p.x, + y: p.y, + u: 0, + v: 0, + color, + })); + // TODO: use normals for anti-aliasing + assert_eq!(points.len(), normals.len()); + let n = points.len() as u32; + let idx = self.vertices.len() as u32; + for i in 2..n { + self.indices.push(idx); + self.indices.push(idx + i - 1); + self.indices.push(idx + i); + } + } + + pub fn draw_closed_path( + &mut self, + points: &[Vec2], + normals: &[Vec2], + width: f32, + color: Color, + ) { + // TODO: anti-aliasing + assert_eq!(points.len(), normals.len()); + let n = points.len() as u32; + let hw = width / 2.0; + + let idx = self.vertices.len() as u32; + for i in 0..n { + self.indices.push(idx + (2 * i + 0) % (2 * n)); + self.indices.push(idx + (2 * i + 1) % (2 * n)); + self.indices.push(idx + (2 * i + 2) % (2 * n)); + self.indices.push(idx + (2 * i + 2) % (2 * n)); + self.indices.push(idx + (2 * i + 1) % (2 * n)); + self.indices.push(idx + (2 * i + 3) % (2 * n)); + } + + for (p, n) in points.iter().zip(normals) { + self.vertices.push(Vertex { + x: p.x + hw * n.x, + y: p.y + hw * n.x, + u: 0, + v: 0, + color, + }); + self.vertices.push(Vertex { + x: p.x - hw * n.x, + y: p.y - hw * n.x, + u: 0, + v: 0, + color, + }); + } + } +} + #[derive(Clone)] pub struct Painter { font: Font, @@ -39,48 +131,132 @@ impl Painter { } /// 8-bit row-major font atlas texture, (width, height, pixels). - pub fn texture(&self) -> (usize, usize, &[u8]) { + pub fn texture(&self) -> (u16, u16, &[u8]) { self.font.texture() } pub fn paint(&self, commands: &[PaintCmd]) -> Frame { + // let mut path_points = Vec::new(); + // let mut path_normals = Vec::new(); + let mut frame = Frame::default(); for cmd in commands { match cmd { - PaintCmd::Circle { .. } => {} // TODO + PaintCmd::Circle { + center, + fill_color, + outline, + radius, + } => { + let n = 64; // TODO: parameter + if let Some(color) = fill_color { + let idx = frame.vertices.len() as u32; + for i in 2..n { + frame.indices.push(idx); + frame.indices.push(idx + i - 1); + frame.indices.push(idx + i); + } + + for i in 0..n { + let angle = remap(i as f32, 0.0, n as f32, 0.0, TAU); + frame.vertices.push(Vertex { + x: center.x + radius * angle.cos(), + y: center.y + radius * angle.sin(), + u: 0, + v: 0, + color: *color, + }); + } + } + if let Some(_outline) = outline { + // TODO + } + } PaintCmd::Clear { fill_color } => { frame.clear_color = Some(*fill_color); } PaintCmd::Line { .. } => {} // TODO PaintCmd::Rect { + fill_color, + outline, pos, size, - fill_color, .. } => { - // TODO: rounded corners, colors etc. - let idx = frame.vertices.len() as u32; - frame.indices.push(idx + 0); - frame.indices.push(idx + 0); - frame.indices.push(idx + 1); - frame.indices.push(idx + 2); - frame.indices.push(idx + 3); - frame.indices.push(idx + 3); + // TODO: rounded corners + // TODO: anti-aliasing + // TODO: FilledRect and RectOutline as separate commands? + if let Some(color) = fill_color { + let vert = |pos: Vec2| Vertex { + x: pos.x, + y: pos.y, + u: 0, + v: 0, + color: *color, + }; + frame.add_rect(vert(*pos), vert(*pos + *size)); + } + if let Some(outline) = outline { + let vert = |x, y| Vertex { + x, + y, + u: 0, + v: 0, + color: outline.color, + }; - let vert = |x, y| Vertex { - x, - y, - u: 0, - v: 0, - color: fill_color.unwrap_or(Color::WHITE), - }; + // Draw this counter-clockwise from top-left corner, + // outer to inner on each step. + let hw = outline.width / 2.0; - frame.vertices.push(vert(pos.x, pos.y)); - frame.vertices.push(vert(pos.x + size.x, pos.y)); - frame.vertices.push(vert(pos.x, pos.y + size.y)); - frame.vertices.push(vert(pos.x + size.x, pos.y + size.y)); + let idx = frame.vertices.len() as u32; + for i in 0..4 { + frame.indices.push(idx + (2 * i + 0) % 8); + frame.indices.push(idx + (2 * i + 1) % 8); + frame.indices.push(idx + (2 * i + 2) % 8); + frame.indices.push(idx + (2 * i + 2) % 8); + frame.indices.push(idx + (2 * i + 1) % 8); + frame.indices.push(idx + (2 * i + 3) % 8); + } + + let min = *pos; + let max = *pos + *size; + frame.vertices.push(vert(min.x - hw, min.y - hw)); + frame.vertices.push(vert(min.x + hw, min.y + hw)); + frame.vertices.push(vert(max.x + hw, min.y - hw)); + frame.vertices.push(vert(max.x - hw, min.y + hw)); + frame.vertices.push(vert(max.x + hw, max.y + hw)); + frame.vertices.push(vert(max.x - hw, max.y - hw)); + frame.vertices.push(vert(min.x - hw, max.y + hw)); + frame.vertices.push(vert(min.x + hw, max.y - hw)); + } + } + PaintCmd::Text { + color, + pos, + text, + x_offsets, + } => { + for (c, x_offset) in text.chars().zip(x_offsets.iter()) { + if let Some(glyph) = self.font.glyph_info(c) { + let top_left = Vertex { + x: pos.x + x_offset + (glyph.offset_x as f32), + y: pos.y + (glyph.offset_y as f32), + u: glyph.min_x, + v: glyph.min_y, + color: *color, + }; + let bottom_right = Vertex { + x: top_left.x + (1 + glyph.max_x - glyph.min_x) as f32, + y: top_left.y + (1 + glyph.max_y - glyph.min_y) as f32, + u: glyph.max_x + 1, + v: glyph.max_y + 1, + color: *color, + }; + frame.add_rect(top_left, bottom_right); + } + } } - PaintCmd::Text { .. } => {} // TODO } } frame diff --git a/emgui/src/style.rs b/emgui/src/style.rs index 6ed72e70..3bb67747 100644 --- a/emgui/src/style.rs +++ b/emgui/src/style.rs @@ -241,18 +241,18 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { } GuiCmd::Text { pos, - text, style: text_style, + text, + x_offsets, } => { - let fill_color = match text_style { + let color = match text_style { TextStyle::Label => style.text_color(), }; out_commands.push(PaintCmd::Text { - fill_color, - font_name: style.font_name.clone(), - font_size: style.font_size, + color, pos, text, + x_offsets, }); } GuiCmd::Window { rect } => { diff --git a/emgui/src/types.rs b/emgui/src/types.rs index 276b4588..ec6b6529 100644 --- a/emgui/src/types.rs +++ b/emgui/src/types.rs @@ -123,6 +123,8 @@ pub enum GuiCmd { pos: Vec2, style: TextStyle, text: String, + /// Start each character in the text, as offset from pos. + x_offsets: Vec, }, /// Background of e.g. a popup Window { @@ -162,16 +164,14 @@ pub enum PaintCmd { pos: Vec2, size: Vec2, }, - /// Paint a single line of mono-space text. - /// The text should start at the given position and flow to the right. - /// The text should be vertically centered at the given position. + /// Paint a single line of text Text { - fill_color: Color, - /// Name, e.g. Palatino - font_name: String, - /// Height in pixels, e.g. 12 - font_size: f32, + color: Color, + /// Top left corner of the first character. pos: Vec2, text: String, + /// Start each character in the text, as offset from pos. + x_offsets: Vec, + // TODO: font info }, } diff --git a/emgui_wasm/Cargo.toml b/emgui_wasm/Cargo.toml index 6425783d..59bfb1dd 100644 --- a/emgui_wasm/Cargo.toml +++ b/emgui_wasm/Cargo.toml @@ -26,6 +26,7 @@ features = [ 'WebGlProgram', 'WebGlRenderingContext', 'WebGlShader', + 'WebGlTexture', 'WebGlUniformLocation', 'Window', ] diff --git a/emgui_wasm/src/lib.rs b/emgui_wasm/src/lib.rs index 0e9a544b..734c0ba3 100644 --- a/emgui_wasm/src/lib.rs +++ b/emgui_wasm/src/lib.rs @@ -16,35 +16,36 @@ use wasm_bindgen::prelude::*; mod app; mod webgl; -#[wasm_bindgen] -pub fn show_gui(raw_input_json: &str) -> String { - // TODO: faster interface than JSON - let raw_input: RawInput = serde_json::from_str(raw_input_json).unwrap(); +// #[wasm_bindgen] +// pub fn show_gui(raw_input_json: &str) -> String { +// // TODO: faster interface than JSON +// let raw_input: RawInput = serde_json::from_str(raw_input_json).unwrap(); - lazy_static::lazy_static! { - static ref APP: Mutex = Default::default(); - static ref EMGUI: Mutex = Default::default(); - } +// lazy_static::lazy_static! { +// static ref APP: Mutex = Default::default(); +// static ref EMGUI: Mutex = Default::default(); +// } - let mut emgui = EMGUI.lock().unwrap(); - emgui.new_frame(raw_input); +// let mut emgui = EMGUI.lock().unwrap(); +// emgui.new_frame(raw_input); - use crate::app::GuiSettings; - APP.lock().unwrap().show_gui(&mut emgui.layout); +// use crate::app::GuiSettings; +// APP.lock().unwrap().show_gui(&mut emgui.layout); - let mut style = emgui.style.clone(); - emgui.layout.foldable("Style", |gui| { - style.show_gui(gui); - }); - emgui.style = style; +// let mut style = emgui.style.clone(); +// emgui.layout.foldable("Style", |gui| { +// style.show_gui(gui); +// }); +// emgui.style = style; - let commands = emgui.paint(); - serde_json::to_string(&commands).unwrap() -} +// let commands = emgui.paint(); +// serde_json::to_string(&commands).unwrap() +// } #[wasm_bindgen] pub fn new_webgl_painter(canvas_id: &str) -> Result { - webgl::Painter::new(canvas_id) + let emgui_painter = emgui::Painter::new(); // TODO: don't create this twice + webgl::Painter::new(canvas_id, emgui_painter.texture()) } struct State { @@ -57,7 +58,7 @@ impl State { fn new() -> State { State { app: Default::default(), - emgui: Default::default(), + emgui: Emgui::new(), emgui_painter: emgui::Painter::new(), } } diff --git a/emgui_wasm/src/webgl.rs b/emgui_wasm/src/webgl.rs index ae8eae04..7ccb724e 100644 --- a/emgui_wasm/src/webgl.rs +++ b/emgui_wasm/src/webgl.rs @@ -1,23 +1,33 @@ +#![allow(dead_code)] + use { js_sys::WebAssembly, wasm_bindgen::{prelude::*, JsCast}, - web_sys::{WebGlBuffer, WebGlProgram, WebGlRenderingContext, WebGlShader}, + web_sys::{WebGlBuffer, WebGlProgram, WebGlRenderingContext, WebGlShader, WebGlTexture}, }; use emgui::Frame; +type Gl = WebGlRenderingContext; + #[wasm_bindgen] pub struct Painter { canvas: web_sys::HtmlCanvasElement, gl: WebGlRenderingContext, + texture: WebGlTexture, program: WebGlProgram, index_buffer: WebGlBuffer, pos_buffer: WebGlBuffer, + tc_buffer: WebGlBuffer, color_buffer: WebGlBuffer, + tex_size: (u16, u16), } impl Painter { - pub fn new(canvas_id: &str) -> Result { + pub fn new( + canvas_id: &str, + (tex_width, tex_height, pixels): (u16, u16, &[u8]), + ) -> Result { let document = web_sys::window().unwrap().document().unwrap(); let canvas = document.get_element_by_id(canvas_id).unwrap(); let canvas: web_sys::HtmlCanvasElement = canvas.dyn_into::()?; @@ -27,19 +37,47 @@ impl Painter { .unwrap() .dyn_into::()?; - gl.enable(WebGlRenderingContext::BLEND); - gl.blend_func( - WebGlRenderingContext::SRC_ALPHA, - WebGlRenderingContext::ONE_MINUS_SRC_ALPHA, - ); + // -------------------------------------------------------------------- + + let texture = gl.create_texture().unwrap(); + gl.bind_texture(Gl::TEXTURE_2D, Some(&texture)); + + // TODO: remove once https://github.com/rustwasm/wasm-bindgen/issues/1005 is fixed. + let mut pixels: Vec<_> = pixels.iter().cloned().collect(); + + let level = 0; + let internal_format = Gl::ALPHA; + let border = 0; + let src_format = Gl::ALPHA; + let src_type = Gl::UNSIGNED_BYTE; + gl.tex_image_2d_with_i32_and_i32_and_i32_and_format_and_type_and_opt_u8_array( + Gl::TEXTURE_2D, + level, + internal_format as i32, + tex_width as i32, + tex_height as i32, + border, + src_format, + src_type, + Some(&mut pixels), + ) + .unwrap(); + gl.tex_parameteri(Gl::TEXTURE_2D, Gl::TEXTURE_WRAP_S, Gl::CLAMP_TO_EDGE as i32); + gl.tex_parameteri(Gl::TEXTURE_2D, Gl::TEXTURE_WRAP_T, Gl::CLAMP_TO_EDGE as i32); + gl.tex_parameteri(Gl::TEXTURE_2D, Gl::TEXTURE_MIN_FILTER, Gl::NEAREST as i32); + + // -------------------------------------------------------------------- let vert_shader = compile_shader( &gl, - WebGlRenderingContext::VERTEX_SHADER, + Gl::VERTEX_SHADER, r#" uniform vec2 u_screen_size; + uniform vec2 u_tex_size; attribute vec2 a_pos; + attribute vec2 a_tc; attribute vec4 a_color; + varying vec2 v_tc; varying vec4 v_color; void main() { gl_Position = vec4( @@ -47,34 +85,41 @@ impl Painter { 1.0 - 2.0 * a_pos.y / u_screen_size.y, 0.0, 1.0); - // v_color = vec4(1.0, 0.0, 0.0, 0.5); + v_tc = a_tc / u_tex_size; v_color = a_color; } "#, )?; let frag_shader = compile_shader( &gl, - WebGlRenderingContext::FRAGMENT_SHADER, + Gl::FRAGMENT_SHADER, r#" + uniform sampler2D u_sampler; precision highp float; + varying vec2 v_tc; varying vec4 v_color; void main() { gl_FragColor = v_color; + gl_FragColor *= texture2D(u_sampler, v_tc).a; } "#, )?; let program = link_program(&gl, [vert_shader, frag_shader].iter())?; let index_buffer = gl.create_buffer().ok_or("failed to create index_buffer")?; let pos_buffer = gl.create_buffer().ok_or("failed to create pos_buffer")?; + let tc_buffer = gl.create_buffer().ok_or("failed to create tc_buffer")?; let color_buffer = gl.create_buffer().ok_or("failed to create color_buffer")?; Ok(Painter { canvas, gl, + texture, program, index_buffer, pos_buffer, + tc_buffer, color_buffer, + tex_size: (tex_width, tex_height), }) } @@ -83,19 +128,26 @@ impl Painter { // -------------------------------------------------------------------- + gl.enable(Gl::BLEND); + gl.blend_func(Gl::SRC_ALPHA, Gl::ONE_MINUS_SRC_ALPHA); gl.use_program(Some(&self.program)); + gl.active_texture(Gl::TEXTURE0); + gl.bind_texture(Gl::TEXTURE_2D, Some(&self.texture)); // -------------------------------------------------------------------- let indices: Vec = frame.indices.iter().map(|idx| *idx as u16).collect(); - let mut positions = Vec::with_capacity(2 * frame.vertices.len()); + let mut positions: Vec = Vec::with_capacity(2 * frame.vertices.len()); + let mut tex_coords: Vec = Vec::with_capacity(2 * frame.vertices.len()); for v in &frame.vertices { positions.push(v.x); positions.push(v.y); + tex_coords.push(v.u); + tex_coords.push(v.v); } - let mut colors = Vec::with_capacity(4 * frame.vertices.len()); + let mut colors: Vec = Vec::with_capacity(4 * frame.vertices.len()); for v in &frame.vertices { colors.push(v.color.r); colors.push(v.color.g); @@ -112,14 +164,11 @@ impl Painter { let indices_array = js_sys::Int16Array::new(&indices_memory_buffer) .subarray(indices_ptr, indices_ptr + indices.len() as u32); - gl.bind_buffer( - WebGlRenderingContext::ELEMENT_ARRAY_BUFFER, - Some(&self.index_buffer), - ); + gl.bind_buffer(Gl::ELEMENT_ARRAY_BUFFER, Some(&self.index_buffer)); gl.buffer_data_with_array_buffer_view( - WebGlRenderingContext::ELEMENT_ARRAY_BUFFER, + Gl::ELEMENT_ARRAY_BUFFER, &indices_array, - WebGlRenderingContext::STATIC_DRAW, // TODO: STREAM ? + Gl::STREAM_DRAW, ); // -------------------------------------------------------------------- @@ -131,29 +180,47 @@ impl Painter { let pos_array = js_sys::Float32Array::new(&pos_memory_buffer) .subarray(pos_ptr, pos_ptr + positions.len() as u32); - gl.bind_buffer(WebGlRenderingContext::ARRAY_BUFFER, Some(&self.pos_buffer)); - gl.buffer_data_with_array_buffer_view( - WebGlRenderingContext::ARRAY_BUFFER, - &pos_array, - WebGlRenderingContext::STATIC_DRAW, // TODO: STREAM ? - ); + gl.bind_buffer(Gl::ARRAY_BUFFER, Some(&self.pos_buffer)); + gl.buffer_data_with_array_buffer_view(Gl::ARRAY_BUFFER, &pos_array, Gl::STREAM_DRAW); let a_pos_loc = gl.get_attrib_location(&self.program, "a_pos"); assert!(a_pos_loc >= 0); let a_pos_loc = a_pos_loc as u32; + let normalize = false; + let stride = 0; + let offset = 0; + gl.vertex_attrib_pointer_with_i32(a_pos_loc, 2, Gl::FLOAT, normalize, stride, offset); + gl.enable_vertex_attrib_array(a_pos_loc); + + // -------------------------------------------------------------------- + + let tc_memory_buffer = wasm_bindgen::memory() + .dyn_into::()? + .buffer(); + let tc_ptr = tex_coords.as_ptr() as u32 / 2; + let tc_array = js_sys::Uint16Array::new(&tc_memory_buffer) + .subarray(tc_ptr, tc_ptr + tex_coords.len() as u32); + + gl.bind_buffer(Gl::ARRAY_BUFFER, Some(&self.tc_buffer)); + gl.buffer_data_with_array_buffer_view(Gl::ARRAY_BUFFER, &tc_array, Gl::STREAM_DRAW); + + let a_tc_loc = gl.get_attrib_location(&self.program, "a_tc"); + assert!(a_tc_loc >= 0); + let a_tc_loc = a_tc_loc as u32; + let normalize = false; let stride = 0; let offset = 0; gl.vertex_attrib_pointer_with_i32( - a_pos_loc, + a_tc_loc, 2, - WebGlRenderingContext::FLOAT, + Gl::UNSIGNED_SHORT, normalize, stride, offset, ); - gl.enable_vertex_attrib_array(a_pos_loc); + gl.enable_vertex_attrib_array(a_tc_loc); // -------------------------------------------------------------------- @@ -164,15 +231,8 @@ impl Painter { let colors_array = js_sys::Uint8Array::new(&colors_memory_buffer) .subarray(colors_ptr, colors_ptr + colors.len() as u32); - gl.bind_buffer( - WebGlRenderingContext::ARRAY_BUFFER, - Some(&self.color_buffer), - ); - gl.buffer_data_with_array_buffer_view( - WebGlRenderingContext::ARRAY_BUFFER, - &colors_array, - WebGlRenderingContext::STATIC_DRAW, // TODO: STREAM ? - ); + gl.bind_buffer(Gl::ARRAY_BUFFER, Some(&self.color_buffer)); + gl.buffer_data_with_array_buffer_view(Gl::ARRAY_BUFFER, &colors_array, Gl::STREAM_DRAW); let a_color_loc = gl.get_attrib_location(&self.program, "a_color"); assert!(a_color_loc >= 0); @@ -184,7 +244,7 @@ impl Painter { gl.vertex_attrib_pointer_with_i32( a_color_loc, 4, - WebGlRenderingContext::UNSIGNED_BYTE, + Gl::UNSIGNED_BYTE, normalize, stride, offset, @@ -201,17 +261,23 @@ impl Painter { self.canvas.width() as f32, self.canvas.height() as f32, ); - // gl.uniform2f(Some(&u_screen_size_loc), 4.0, 1.0); + + let u_tex_size_loc = gl + .get_uniform_location(&self.program, "u_tex_size") + .unwrap(); + gl.uniform2f( + Some(&u_tex_size_loc), + self.tex_size.0 as f32, + self.tex_size.1 as f32, + ); + + let u_sampler_loc = gl.get_uniform_location(&self.program, "u_sampler").unwrap(); + gl.uniform1i(Some(&u_sampler_loc), 0); gl.clear_color(0.05, 0.05, 0.05, 1.0); - gl.clear(WebGlRenderingContext::COLOR_BUFFER_BIT); + gl.clear(Gl::COLOR_BUFFER_BIT); - gl.draw_elements_with_i32( - WebGlRenderingContext::TRIANGLE_STRIP, - indices.len() as i32, - WebGlRenderingContext::UNSIGNED_SHORT, - 0, - ); + gl.draw_elements_with_i32(Gl::TRIANGLES, indices.len() as i32, Gl::UNSIGNED_SHORT, 0); Ok(()) } @@ -229,7 +295,7 @@ fn compile_shader( gl.compile_shader(&shader); if gl - .get_shader_parameter(&shader, WebGlRenderingContext::COMPILE_STATUS) + .get_shader_parameter(&shader, Gl::COMPILE_STATUS) .as_bool() .unwrap_or(false) { @@ -254,7 +320,7 @@ fn link_program<'a, T: IntoIterator>( gl.link_program(&program); if gl - .get_program_parameter(&program, WebGlRenderingContext::LINK_STATUS) + .get_program_parameter(&program, Gl::LINK_STATUS) .as_bool() .unwrap_or(false) {