summaryrefslogtreecommitdiff
path: root/engine/src/opengl/buffer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/opengl/buffer.rs')
-rw-r--r--engine/src/opengl/buffer.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/engine/src/opengl/buffer.rs b/engine/src/opengl/buffer.rs
index 2fabe4d..eded553 100644
--- a/engine/src/opengl/buffer.rs
+++ b/engine/src/opengl/buffer.rs
@@ -1,5 +1,6 @@
use std::marker::PhantomData;
use std::mem::size_of_val;
+use std::ptr::null;
#[derive(Debug)]
pub struct Buffer<Item>
@@ -35,6 +36,37 @@ impl<Item> Buffer<Item>
}
}
+ pub fn store_mapped<Value>(
+ &mut self,
+ values: &[Value],
+ usage: Usage,
+ mut map_func: impl FnMut(&Value) -> Item,
+ )
+ {
+ unsafe {
+ #[allow(clippy::cast_possible_wrap)]
+ gl::NamedBufferData(
+ self.buf,
+ (size_of::<Item>() * values.len()) as gl::types::GLsizeiptr,
+ null(),
+ usage.into_gl(),
+ );
+ }
+
+ for (index, value) in values.iter().enumerate() {
+ let item = map_func(value);
+
+ unsafe {
+ gl::NamedBufferSubData(
+ self.buf,
+ (index * size_of::<Item>()) as gl::types::GLintptr,
+ size_of::<Item>() as gl::types::GLsizeiptr,
+ (&raw const item).cast(),
+ );
+ }
+ }
+ }
+
pub fn object(&self) -> gl::types::GLuint
{
self.buf