From 9bf1feb35a419147950473e70642f30ccd6c486a Mon Sep 17 00:00:00 2001 From: Alexey Pitenko Date: Mon, 30 Oct 2023 01:46:33 +0100 Subject: [PATCH] KHR_texture_transform for NormalTexture/OcclusionTexture --- gltf-json/src/extensions/material.rs | 23 +++++++++++++++++++++-- src/material.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/gltf-json/src/extensions/material.rs b/gltf-json/src/extensions/material.rs index 1fc7cc78..dcca61dc 100644 --- a/gltf-json/src/extensions/material.rs +++ b/gltf-json/src/extensions/material.rs @@ -3,6 +3,9 @@ use crate::{material::StrengthFactor, texture, validation::Validate, Extras}; use gltf_derive::Validate; use serde_derive::{Deserialize, Serialize}; +#[cfg(feature = "KHR_texture_transform")] +use super::texture::TextureTransform; + /// The material appearance of a primitive. #[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)] pub struct Material { @@ -122,11 +125,27 @@ pub struct PbrSpecularGlossiness { /// Defines the normal texture of a material. #[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)] -pub struct NormalTexture {} +pub struct NormalTexture { + #[cfg(feature = "KHR_texture_transform")] + #[serde( + default, + rename = "KHR_texture_transform", + skip_serializing_if = "Option::is_none" + )] + pub texture_transform: Option, +} /// Defines the occlusion texture of a material. #[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)] -pub struct OcclusionTexture {} +pub struct OcclusionTexture { + #[cfg(feature = "KHR_texture_transform")] + #[serde( + default, + rename = "KHR_texture_transform", + skip_serializing_if = "Option::is_none" + )] + pub texture_transform: Option, +} /// The diffuse factor of a material. #[cfg(feature = "KHR_materials_pbrSpecularGlossiness")] diff --git a/src/material.rs b/src/material.rs index 0eb209e5..82a1bdb2 100644 --- a/src/material.rs +++ b/src/material.rs @@ -2,6 +2,9 @@ use crate::{texture, Document}; pub use json::material::AlphaMode; +#[cfg(feature = "KHR_texture_transform")] +use crate::texture::TextureTransform; + lazy_static! { static ref DEFAULT_MATERIAL: json::material::Material = Default::default(); } @@ -580,6 +583,18 @@ impl<'a> NormalTexture<'a> { pub fn extras(&self) -> &'a json::Extras { &self.json.extras } + + /// Returns texture transform information + #[cfg(feature = "KHR_texture_transform")] + #[cfg_attr(docsrs, doc(cfg(feature = "KHR_texture_transform")))] + pub fn texture_transform(&self) -> Option> { + self.json + .extensions + .as_ref()? + .texture_transform + .as_ref() + .map(TextureTransform::new) + } } /// Defines the occlusion texture of a material. @@ -619,6 +634,18 @@ impl<'a> OcclusionTexture<'a> { pub fn extras(&self) -> &'a json::Extras { &self.json.extras } + + /// Returns texture transform information + #[cfg(feature = "KHR_texture_transform")] + #[cfg_attr(docsrs, doc(cfg(feature = "KHR_texture_transform")))] + pub fn texture_transform(&self) -> Option> { + self.json + .extensions + .as_ref()? + .texture_transform + .as_ref() + .map(TextureTransform::new) + } } impl<'a> AsRef> for NormalTexture<'a> {