use {extensions, json};
use {Data, Gltf};
pub use json::buffer::Target;
pub struct Buffer<'a> {
gltf: &'a Gltf,
index: usize,
json: &'a json::buffer::Buffer,
}
pub struct View<'a> {
gltf: &'a Gltf,
index: usize,
json: &'a json::buffer::View,
}
impl<'a> Buffer<'a> {
pub fn new(
gltf: &'a Gltf,
index: usize,
json: &'a json::buffer::Buffer,
) -> Self {
Self {
gltf: gltf,
index: index,
json: json,
}
}
pub fn index(&self) -> usize {
self.index
}
pub fn as_json(&self) -> &json::buffer::Buffer {
self.json
}
pub fn length(&self) -> usize {
self.json.byte_length as usize
}
pub fn data(&self) -> Data {
self.gltf.buffer_data(self.index())
}
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&str> {
self.json.name.as_ref().map(String::as_str)
}
pub fn extensions(&self) -> extensions::buffer::Buffer<'a> {
extensions::buffer::Buffer::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl<'a> View<'a> {
pub fn new(
gltf: &'a Gltf,
index: usize,
json: &'a json::buffer::View,
) -> Self {
Self {
gltf: gltf,
index: index,
json: json,
}
}
pub fn index(&self) -> usize {
self.index
}
pub fn as_json(&self) -> &json::buffer::View {
self.json
}
pub fn buffer(&self) -> Buffer<'a> {
self.gltf.buffers().nth(self.json.buffer.value()).unwrap()
}
pub fn length(&self) -> usize {
self.json.byte_length as usize
}
pub fn offset(&self) -> usize {
self.json.byte_offset as usize
}
pub fn stride(&self) -> Option<usize> {
self.json.byte_stride.map(|x| x.0 as usize)
}
pub fn data(&self) -> Data {
self.buffer().data().subview(self.offset(), self.length())
}
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&str> {
self.json.name.as_ref().map(String::as_str)
}
pub fn target(&self) -> Option<Target> {
self.json.target.map(|target| target.unwrap())
}
pub fn extensions(&self) -> extensions::buffer::View<'a> {
extensions::buffer::View::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}