diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ExtensionSupportFlags.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ExtensionSupportFlags.cs new file mode 100644 index 000000000..e84684e5f --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ExtensionSupportFlags.cs @@ -0,0 +1,19 @@ +namespace UniGLTF +{ + public sealed class ExtensionSupportFlags + { + /// + /// KHR_texture_basisu 拡張を考慮するかどうか。 + /// + public bool ConsiderKhrTextureBasisu { get; set; } + + /// + /// ファイルに含まれる "全ての" テクスチャの画像が Y 軸反転しているかどうか。 + /// 標準的なファイルは false。 + /// + /// Unity は内部で画像を Y 軸反転させているため、あらかじめ Y 軸反転させておくほうが効率的であり、その場合に対応。 + /// https://docs.unity3d.com/Packages/com.unity.cloud.ktx@3.2/manual/creating-textures.html + /// + public bool IsAllTexturesYFlipped { get; set; } + } +} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ExtensionSupportFlags.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/ExtensionSupportFlags.cs.meta new file mode 100644 index 000000000..63a6f3457 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ExtensionSupportFlags.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5b1a24ae974547b4bfec426c33c5d612 +timeCreated: 1714458314 \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs index 1a8103178..2841754fd 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs @@ -53,6 +53,13 @@ namespace UniGLTF /// public MigrationFlags MigrationFlags { get; } + /// + /// Extension Supporting flags. + /// + /// User can set flags to enable or disable some extensions. + /// + public ExtensionSupportFlags ExtensionSupportFlags { get; } = new ExtensionSupportFlags(); + /// /// URI access /// diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index ae0d35d5d..3f10288a7 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -36,6 +36,7 @@ namespace UniGLTF ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null) { + TryValidateGltfData(data); Data = data; TextureDescriptorGenerator = new GltfTextureDescriptorGenerator(Data); MaterialDescriptorGenerator = materialGenerator ?? new BuiltInGltfMaterialDescriptorGenerator(); @@ -74,6 +75,21 @@ namespace UniGLTF "KHR_draco_mesh_compression", }; + /// + /// GltfData をバリデートし、読み込み不可能な問題があれば例外を投げる + /// + private static void TryValidateGltfData(GltfData data) + { + if (data.ExtensionSupportFlags.ConsiderKhrTextureBasisu && !Application.isPlaying) + { + throw new UniGLTFNotSupportedException("KHR_texture_basisu is only available in play mode."); + } + if (data.ExtensionSupportFlags.ConsiderKhrTextureBasisu && !data.ExtensionSupportFlags.IsAllTexturesYFlipped) + { + throw new UniGLTFNotSupportedException("KHR_texture_basisu is only supported with all textures Y-flipped."); + } + } + #region Load. Build unity objects public virtual async Task LoadAsync(IAwaitCaller awaitCaller, Func MeasureTime = null) { diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs index 659288f37..f373dbe01 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs @@ -12,8 +12,6 @@ namespace UniGLTF /// public static class GltfTextureImporter { - public static bool ImportKhrTextureBasisuExtension { get; set; } = true; - /// /// glTF の Texture が存在せず Image のみのものを、Texture として扱いたい場合の関数. /// @@ -240,9 +238,7 @@ namespace UniGLTF { var texture = data.GLTF.textures[textureIndex]; - // NOTE: Runtime の場合は KHR_texture_basisu 拡張を考える. - if (ImportKhrTextureBasisuExtension && - Application.isPlaying && + if (data.ExtensionSupportFlags.ConsiderKhrTextureBasisu && glTF_KHR_texture_basisu.TryGet(texture, out var basisuExtension)) { var basisuImageIndex = basisuExtension.source;