From 26fc58cdd05d8acd28c82b1a87d115d0513df9f6 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 15 Mar 2020 16:37:37 +0000 Subject: [PATCH] :construction: Need to remember how pixel-perfect text works --- font.png | Bin 11414 -> 11646 bytes src/bin/pumpkin.rs | 23 ++++++++++++++++--- src/gpu_buffers.rs | 49 ++++++++++++++++++++++++++++++++++++---- src/renderable_model.rs | 2 +- 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/font.png b/font.png index f8eb352963d6480c75bbbbdc5caf05bbdc3fd2d9..ab42c4927f0162ad89908f4da2cf608fd89121ef 100644 GIT binary patch delta 10704 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 BPQCyD delta 10470 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 diff --git a/src/bin/pumpkin.rs b/src/bin/pumpkin.rs index dac8c43..821f445 100644 --- a/src/bin/pumpkin.rs +++ b/src/bin/pumpkin.rs @@ -474,6 +474,11 @@ struct RenderableArrow { color: Vec3, } +struct TriangleStream { + pub verts: gpu_buffers::VertexBuffer, + pub indices: gpu_buffers::IndexBuffer, +} + struct GameGraphics { passes: Vec , @@ -486,6 +491,8 @@ struct GameGraphics { mesh_arrow: RenderableModel, mesh_truck: RenderableModel, + text_stream: TriangleStream, + texture_sky: Texture, texture_grass: Texture, texture_font: Texture, @@ -802,6 +809,14 @@ impl GameGraphics { }, ]; + let text_stream = TriangleStream { + verts: gpu_buffers::VertexBuffer::streaming (4 * 5 * 6 * 1024), + indices: { + let v: Vec = (0u32..6 * 1024).collect (); + gpu_buffers::IndexBuffer::from_slice_u32 (&v) + } + }; + Self { passes, shaders, @@ -813,6 +828,8 @@ impl GameGraphics { mesh_arrow, mesh_truck, + text_stream, + texture_sky, texture_grass, texture_font, @@ -1090,14 +1107,14 @@ impl GameGraphics { let font_size = (8.0, 18.0); - let mvp = Mat4::from_scale ((2.0 * 256.0 / screen_size.0, 2.0 * 72.0 / screen_size.1, 1.0).into ()); + let mvp = Mat4::from_scale ((2.0 * 256.0 / screen_size.0, 2.0 * 256.0 / screen_size.1, 1.0).into ()); glezz::uniform_matrix_4fv (unis [&MVP], &mvp); let pos: Vec = vec! [ + -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 1.0, 0.0, 0.0, - 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, + -1.0, 1.0, 0.0, ]; use std::convert::TryInto; diff --git a/src/gpu_buffers.rs b/src/gpu_buffers.rs index 6e9ef09..cb0aa74 100644 --- a/src/gpu_buffers.rs +++ b/src/gpu_buffers.rs @@ -18,7 +18,7 @@ const FLOAT_SIZE: usize = 4; impl VertexBuffer { // len is the number of floats - fn allocate_buffer (len: usize) -> u32 { + fn allocate_buffer (len: usize, usage: u32) -> u32 { let mut id = 0; unsafe { gl::GenBuffers (1, &mut id); @@ -29,7 +29,7 @@ impl VertexBuffer { gl::ARRAY_BUFFER, (len * FLOAT_SIZE).try_into ().unwrap (), std::ptr::null (), - gl::STATIC_DRAW + usage ); } assert! (id != 0); @@ -41,7 +41,7 @@ impl VertexBuffer { .map (|slice| slice.len ()) .sum (); - let id = Self::allocate_buffer (len); + let id = Self::allocate_buffer (len, gl::STATIC_DRAW); let mut offset = 0; for slice in slices.iter () { @@ -67,6 +67,17 @@ impl VertexBuffer { Self::from_slices (&[slice]) } + // len is the number of floats + + pub fn streaming (len: usize) -> Self { + let id = Self::allocate_buffer (len, gl::STREAM_DRAW); + + Self { + id, + len, + } + } + pub fn bind (&self) { unsafe { gl::BindBuffer (gl::ARRAY_BUFFER, self.id); @@ -87,15 +98,21 @@ impl Drop for VertexBuffer { } } +/// A buffer of triangle indices in OpenGL server memory pub struct IndexBuffer { + /// The OpenGL ID of the buffer id: u32, - // Not bytes. Number of indexes. + + /// The count of 32-bit indices the buffer can store len: usize, + + /// The largest index stored in the buffer when it was created max: u32, } impl IndexBuffer { - pub fn from_slice (slice: &[u8]) -> Self { + /// Interprets a u8 slice as a u32 slice + pub fn from_slice_u8 (slice: &[u8]) -> Self { let mut rdr = Cursor::new (slice); let mut max = None; @@ -132,6 +149,28 @@ impl IndexBuffer { } } + pub fn from_slice_u32 (slice: &[u32]) -> Self { + let max = slice.iter ().max (); + + let id = { + let mut id = 0; + unsafe { + gl::GenBuffers (1, &mut id); + gl::BindBuffer (gl::ELEMENT_ARRAY_BUFFER, id); + + gl::BufferData (gl::ELEMENT_ARRAY_BUFFER, (slice.len () * 4).try_into ().unwrap (), &slice [0] as *const u32 as *const c_void, gl::STATIC_DRAW); + } + assert! (id != 0); + id + }; + + Self { + id, + len: slice.len (), + max: *max.unwrap (), + } + } + pub fn bind (&self) { unsafe { gl::BindBuffer (gl::ELEMENT_ARRAY_BUFFER, self.id); diff --git a/src/renderable_model.rs b/src/renderable_model.rs index 52a0990..6513efe 100644 --- a/src/renderable_model.rs +++ b/src/renderable_model.rs @@ -71,7 +71,7 @@ impl RenderableModel { let vertexes = VertexBuffer::from_slice (&vertex_vec); let index_slice = model.get_all_indexes (); - let indexes = IndexBuffer::from_slice (index_slice); + let indexes = IndexBuffer::from_slice_u8 (index_slice); let max_index: usize = indexes.max ().try_into ().unwrap ();