Skip to main content

gltf_reader/
buffer.rs

1use crate::{Extensions, Extras, Idx};
2use alloc::borrow::Cow;
3use ownable::IntoOwned;
4use serde::Deserialize;
5
6/// A buffer points to binary geometry, animation, or skins.
7#[derive(Debug, Clone, Deserialize, IntoOwned)]
8pub struct Buffer<'a> {
9    /// The user-defined name of this object.
10    #[serde(borrow)]
11    pub name: Option<Cow<'a, str>>,
12
13    /// The URI (or IRI) of the buffer.
14    #[serde(borrow)]
15    pub uri: Option<Cow<'a, str>>,
16    /// The length of the buffer in bytes.
17    #[serde(rename = "byteLength")]
18    pub byte_length: u64,
19
20    #[serde(borrow)]
21    pub extensions: Option<Extensions<'a>>,
22    #[serde(borrow)]
23    pub extras: Option<Extras<'a>>,
24}
25
26/// glTF known targets for buffer views.
27#[derive(Debug, Clone, Copy, PartialEq, Eq)]
28pub enum BufferViewTargetEnum {
29    ArrayBuffer,
30    ElementArrayBuffer,
31}
32
33/// A hint of the intended GPU buffer type to use with a buffer view.
34#[derive(Clone, Copy, PartialEq, Eq, Deserialize, IntoOwned)]
35#[serde(transparent)]
36pub struct BufferViewTarget(pub u64);
37
38impl core::fmt::Debug for BufferViewTarget {
39    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
40        if let Some(e) = self.to_enum() {
41            e.fmt(f)
42        } else {
43            self.0.fmt(f)
44        }
45    }
46}
47
48impl BufferViewTarget {
49    pub const ARRAY_BUFFER: Self = Self(34962);
50    pub const ELEMENT_ARRAY_BUFFER: Self = Self(34963);
51
52    pub fn to_enum(self) -> Option<BufferViewTargetEnum> {
53        Some(match self {
54            Self::ARRAY_BUFFER => BufferViewTargetEnum::ArrayBuffer,
55            Self::ELEMENT_ARRAY_BUFFER => BufferViewTargetEnum::ElementArrayBuffer,
56            _ => return None,
57        })
58    }
59}
60
61/// A view into a buffer generally representing a subset of the buffer.
62#[derive(Debug, Clone, Deserialize, IntoOwned)]
63pub struct BufferView<'a> {
64    /// The user-defined name of this object.
65    #[serde(borrow)]
66    pub name: Option<Cow<'a, str>>,
67
68    /// The index of the buffer.
69    pub buffer: Idx<Buffer<'static>>,
70    /// The offset into the buffer in bytes.
71    #[serde(rename = "byteOffset")]
72    #[serde(default)]
73    pub byte_offset: u64,
74    /// The length of the buffer view in bytes.
75    #[serde(rename = "byteLength")]
76    pub byte_length: u64,
77    /// The stride, in bytes, between vertex attributes.
78    #[serde(rename = "byteStride")]
79    pub byte_stride: Option<u64>,
80    /// The hint representing the intended GPU buffer type to use with this buffer view.
81    pub target: Option<BufferViewTarget>,
82
83    #[serde(borrow)]
84    pub extensions: Option<Extensions<'a>>,
85    #[serde(borrow)]
86    pub extras: Option<Extras<'a>>,
87}