use {buffer, json};
use Gltf;
pub use json::accessor::ComponentType as DataType;
pub use json::accessor::Type as Dimensions;
#[derive(Clone, Debug)]
pub struct Accessor<'a> {
gltf: &'a Gltf,
index: usize,
json: &'a json::accessor::Accessor,
view: buffer::View<'a>,
}
impl<'a> Accessor<'a> {
pub(crate) fn new(
gltf: &'a Gltf,
index: usize,
json: &'a json::accessor::Accessor,
) -> Self {
let view = gltf.views().nth(json.buffer_view.value()).unwrap();
Self {
gltf,
index,
json,
view,
}
}
pub fn index(&self) -> usize {
self.index
}
pub fn size(&self) -> usize {
self.data_type().size() * self.dimensions().multiplicity()
}
#[doc(hidden)]
pub fn as_json(&self) -> &json::accessor::Accessor {
self.json
}
pub fn view(&self) -> buffer::View<'a> {
self.gltf.views().nth(self.json.buffer_view.value()).unwrap()
}
pub fn offset(&self) -> usize {
self.json.byte_offset as usize
}
pub fn count(&self) -> usize {
self.json.count as usize
}
pub fn data_type(&self) -> DataType {
self.json.component_type.unwrap().0
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
pub fn dimensions(&self) -> Dimensions {
self.json.type_.unwrap()
}
pub fn min(&self) -> Option<json::Value> {
self.json.min.clone()
}
pub fn max(&self) -> Option<json::Value> {
self.json.max.clone()
}
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&str> {
self.json.name.as_ref().map(String::as_str)
}
pub fn normalized(&self) -> bool {
self.json.normalized
}
pub fn sparse(&self) -> Option<sparse::Sparse> {
self.json.sparse.as_ref().map(|json| {
sparse::Sparse::new(self.gltf, json)
})
}
}
pub mod sparse {
use Gltf;
use {buffer, json};
#[derive(Clone, Debug)]
pub enum IndexType {
U8 = 5121,
U16 = 5123,
U32 = 5125,
}
pub struct Indices<'a> {
gltf: &'a Gltf,
json: &'a json::accessor::sparse::Indices,
}
impl<'a> Indices<'a> {
pub(crate) fn new(
gltf: &'a Gltf,
json: &'a json::accessor::sparse::Indices,
) -> Self {
Self {
gltf: gltf,
json: json,
}
}
#[doc(hidden)]
pub fn as_json(&self) -> &json::accessor::sparse::Indices {
self.json
}
pub fn view(&self) -> buffer::View<'a> {
self.gltf.views().nth(self.json.buffer_view.value()).unwrap()
}
pub fn offset(&self) -> u32 {
self.json.byte_offset
}
pub fn index_type(&self) -> IndexType {
match self.json.component_type.unwrap().0 {
json::accessor::ComponentType::U8 => IndexType::U8,
json::accessor::ComponentType::U16 => IndexType::U16,
json::accessor::ComponentType::U32 => IndexType::U32,
_ => unreachable!(),
}
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
pub struct Sparse<'a> {
gltf: &'a Gltf,
json: &'a json::accessor::sparse::Sparse,
}
impl<'a> Sparse<'a> {
pub(crate) fn new(
gltf: &'a Gltf,
json: &'a json::accessor::sparse::Sparse,
) -> Self {
Self {
gltf: gltf,
json: json,
}
}
#[doc(hidden)]
pub fn as_json(&self) -> &json::accessor::sparse::Sparse {
self.json
}
pub fn count(&self) -> u32 {
self.json.count
}
pub fn indices(&self) -> Indices<'a> {
Indices::new(self.gltf, &self.json.indices)
}
pub fn values(&self) -> Values<'a> {
Values::new(self.gltf, &self.json.values)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
pub struct Values<'a> {
gltf: &'a Gltf,
json: &'a json::accessor::sparse::Values,
}
impl<'a> Values<'a> {
pub(crate) fn new(
gltf: &'a Gltf,
json: &'a json::accessor::sparse::Values,
) -> Self {
Self {
gltf: gltf,
json: json,
}
}
#[doc(hidden)]
pub fn as_json(&self) -> &json::accessor::sparse::Values {
self.json
}
pub fn view(&self) -> buffer::View {
self.gltf.views().nth(self.json.buffer_view.value()).unwrap()
}
pub fn offset(&self) -> u32 {
self.json.byte_offset
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl IndexType {
pub fn size(&self) -> usize {
use self::IndexType::*;
match *self {
U8 => 1,
U16 => 2,
U32 => 4,
}
}
}
}