use super::bindings::*;
use crate::buffer::*;
use metal;
use std::ops::{Deref};
use std::ffi::{c_void};
pub struct Buffer {
buffer: metal::Buffer
}
impl Buffer {
pub fn from_vertices<VertexIterator: IntoIterator<Item=Vertex2D>>(device: &metal::Device, vertices: VertexIterator) -> Buffer {
let vertices = vertices.into_iter()
.map(|vertex| MetalVertex2D::from(vertex))
.collect::<Vec<_>>();
let buffer = device.new_buffer_with_data(vertices.as_ptr() as *const c_void,
(vertices.len() * std::mem::size_of::<MetalVertex2D>()) as u64,
metal::MTLResourceOptions::CPUCacheModeDefaultCache | metal::MTLResourceOptions::StorageModeManaged);
Buffer {
buffer: buffer
}
}
pub fn from_indices(device: &metal::Device, indices: Vec<u16>) -> Buffer {
let buffer = device.new_buffer_with_data(indices.as_ptr() as *const c_void,
(indices.len() * std::mem::size_of::<u16>()) as u64,
metal::MTLResourceOptions::CPUCacheModeDefaultCache | metal::MTLResourceOptions::StorageModeManaged);
Buffer {
buffer: buffer
}
}
}
impl Deref for Buffer {
type Target = metal::Buffer;
fn deref(&self) -> &metal::Buffer {
&self.buffer
}
}