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;