use std::ops::Deref;
use {extensions, image, json, Gltf};
pub use json::texture::{MagFilter, MinFilter, WrappingMode};
#[derive(Clone, Debug)]
pub struct Info<'a> {
texture: Texture<'a>,
json: &'a json::texture::Info,
}
#[derive(Clone, Debug)]
pub struct Sampler<'a> {
#[allow(dead_code)]
gltf: &'a Gltf,
index: usize,
json: &'a json::texture::Sampler,
}
#[derive(Clone, Debug)]
pub struct Texture<'a> {
gltf: &'a Gltf,
index: usize,
json: &'a json::texture::Texture,
}
impl<'a> Sampler<'a> {
pub fn new(gltf: &'a Gltf, index: usize, json: &'a json::texture::Sampler) -> Self {
Self {
gltf: gltf,
index: index,
json: json,
}
}
pub fn index(&self) -> usize {
self.index
}
pub fn as_json(&self) -> &json::texture::Sampler {
self.json
}
pub fn mag_filter(&self) -> Option<MagFilter> {
self.json.mag_filter.map(|filter| filter.unwrap())
}
pub fn min_filter(&self) -> Option<MinFilter> {
self.json.min_filter.map(|filter| filter.unwrap())
}
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&str> {
self.json.name.as_ref().map(String::as_str)
}
pub fn wrap_s(&self) -> WrappingMode {
self.json.wrap_s.unwrap()
}
pub fn wrap_t(&self) -> WrappingMode {
self.json.wrap_t.unwrap()
}
pub fn extensions(&self) -> extensions::texture::Sampler<'a> {
extensions::texture::Sampler::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl<'a> Texture<'a> {
pub fn new(gltf: &'a Gltf, index: usize, json: &'a json::texture::Texture) -> Self {
Self {
gltf: gltf,
index: index,
json: json,
}
}
pub fn index(&self) -> usize {
self.index
}
pub fn as_json(&self) -> &json::texture::Texture {
self.json
}
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&str> {
self.json.name.as_ref().map(String::as_str)
}
pub fn sampler(&self) -> Option<Sampler<'a>> {
self.json.sampler.as_ref().map(|index| {
self.gltf.samplers().nth(index.value() as usize).unwrap()
})
}
pub fn source(&self) -> image::Image<'a> {
self.gltf.images().nth(self.json.source.value() as usize).unwrap()
}
pub fn extensions(&self) -> extensions::texture::Texture<'a> {
extensions::texture::Texture::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl<'a> Info<'a> {
pub fn new(texture: Texture<'a>, json: &'a json::texture::Info) -> Self {
Self {
texture: texture,
json: json,
}
}
pub fn as_json(&self) -> &json::texture::Info {
self.json
}
pub fn tex_coord(&self) -> u32 {
self.json.tex_coord
}
pub fn extensions(&self) -> extensions::texture::Info<'a> {
extensions::texture::Info::new(
self.texture.clone(),
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl<'a> Deref for Info<'a> {
type Target = Texture<'a>;
fn deref(&self) -> &Self::Target {
&self.texture
}
}