gltf-reader 0.1.0

A simple glTF 2.0 reader using `serde` and `serde_json`
Documentation
use crate::{Extensions, Extras, Idx};
use alloc::borrow::Cow;
use ownable::IntoOwned;
use serde::Deserialize;

/// A buffer points to binary geometry, animation, or skins.
#[derive(Debug, Clone, Deserialize, IntoOwned)]
pub struct Buffer<'a> {
    /// The user-defined name of this object.
    #[serde(borrow)]
    pub name: Option<Cow<'a, str>>,

    /// The URI (or IRI) of the buffer.
    #[serde(borrow)]
    pub uri: Option<Cow<'a, str>>,
    /// The length of the buffer in bytes.
    #[serde(rename = "byteLength")]
    pub byte_length: u64,

    #[serde(borrow)]
    pub extensions: Option<Extensions<'a>>,
    #[serde(borrow)]
    pub extras: Option<Extras<'a>>,
}

/// glTF known targets for buffer views.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BufferViewTargetEnum {
    ArrayBuffer,
    ElementArrayBuffer,
}

/// A hint of the intended GPU buffer type to use with a buffer view.
#[derive(Clone, Copy, PartialEq, Eq, Deserialize, IntoOwned)]
#[serde(transparent)]
pub struct BufferViewTarget(pub u64);

impl core::fmt::Debug for BufferViewTarget {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        if let Some(e) = self.to_enum() {
            e.fmt(f)
        } else {
            self.0.fmt(f)
        }
    }
}

impl BufferViewTarget {
    pub const ARRAY_BUFFER: Self = Self(34962);
    pub const ELEMENT_ARRAY_BUFFER: Self = Self(34963);

    pub fn to_enum(self) -> Option<BufferViewTargetEnum> {
        Some(match self {
            Self::ARRAY_BUFFER => BufferViewTargetEnum::ArrayBuffer,
            Self::ELEMENT_ARRAY_BUFFER => BufferViewTargetEnum::ElementArrayBuffer,
            _ => return None,
        })
    }
}

/// A view into a buffer generally representing a subset of the buffer.
#[derive(Debug, Clone, Deserialize, IntoOwned)]
pub struct BufferView<'a> {
    /// The user-defined name of this object.
    #[serde(borrow)]
    pub name: Option<Cow<'a, str>>,

    /// The index of the buffer.
    pub buffer: Idx<Buffer<'static>>,
    /// The offset into the buffer in bytes.
    #[serde(rename = "byteOffset")]
    #[serde(default)]
    pub byte_offset: u64,
    /// The length of the buffer view in bytes.
    #[serde(rename = "byteLength")]
    pub byte_length: u64,
    /// The stride, in bytes, between vertex attributes.
    #[serde(rename = "byteStride")]
    pub byte_stride: Option<u64>,
    /// The hint representing the intended GPU buffer type to use with this buffer view.
    pub target: Option<BufferViewTarget>,

    #[serde(borrow)]
    pub extensions: Option<Extensions<'a>>,
    #[serde(borrow)]
    pub extras: Option<Extras<'a>>,
}