🚧 Need to remember how pixel-perfect text works
parent
7e8902a040
commit
26fc58cdd0
BIN
font.png
BIN
font.png
Binary file not shown.
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
@ -474,6 +474,11 @@ struct RenderableArrow {
|
|||
color: Vec3,
|
||||
}
|
||||
|
||||
struct TriangleStream {
|
||||
pub verts: gpu_buffers::VertexBuffer,
|
||||
pub indices: gpu_buffers::IndexBuffer,
|
||||
}
|
||||
|
||||
struct GameGraphics {
|
||||
passes: Vec <Pass>,
|
||||
|
||||
|
@ -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 <u32> = (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 <f32> = 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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 ();
|
||||
|
||||
|
|
Loading…
Reference in New Issue