1use crate::{Extensions, Extras, Idx};
2use alloc::borrow::Cow;
3use ownable::IntoOwned;
4use serde::Deserialize;
5
6#[derive(Debug, Clone, Deserialize, IntoOwned)]
8pub struct Buffer<'a> {
9 #[serde(borrow)]
11 pub name: Option<Cow<'a, str>>,
12
13 #[serde(borrow)]
15 pub uri: Option<Cow<'a, str>>,
16 #[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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
28pub enum BufferViewTargetEnum {
29 ArrayBuffer,
30 ElementArrayBuffer,
31}
32
33#[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#[derive(Debug, Clone, Deserialize, IntoOwned)]
63pub struct BufferView<'a> {
64 #[serde(borrow)]
66 pub name: Option<Cow<'a, str>>,
67
68 pub buffer: Idx<Buffer<'static>>,
70 #[serde(rename = "byteOffset")]
72 #[serde(default)]
73 pub byte_offset: u64,
74 #[serde(rename = "byteLength")]
76 pub byte_length: u64,
77 #[serde(rename = "byteStride")]
79 pub byte_stride: Option<u64>,
80 pub target: Option<BufferViewTarget>,
82
83 #[serde(borrow)]
84 pub extensions: Option<Extensions<'a>>,
85 #[serde(borrow)]
86 pub extras: Option<Extras<'a>>,
87}