diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_basisu.cs b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_basisu.cs
new file mode 100644
index 000000000..5d14f1f95
--- /dev/null
+++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_basisu.cs
@@ -0,0 +1,63 @@
+using System;
+using UniJSON;
+
+namespace UniGLTF
+{
+ ///
+ /// `texture` に対する extension.
+ ///
+ /// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_basisu
+ ///
+ [Serializable]
+ public sealed class glTF_KHR_texture_basisu
+ {
+ public const string ExtensionName = "KHR_texture_basisu";
+
+ private static readonly Utf8String ExtensionNameUt8 = Utf8String.From(ExtensionName);
+
+ ///
+ /// glTF Id
+ ///
+ [JsonSchema(Minimum = 0)]
+ public int source = -1;
+
+ public static bool TryGet(glTFTexture texture, out glTF_KHR_texture_basisu basisuExtension)
+ {
+ if (texture?.extensions is glTFExtensionImport importedExtensions)
+ {
+ foreach (var kv in importedExtensions.ObjectItems())
+ {
+ if (kv.Key.GetUtf8String() == ExtensionNameUt8)
+ {
+ basisuExtension = Deserialize(kv.Value);
+ return basisuExtension != null;
+ }
+ }
+ }
+
+ basisuExtension = default;
+ return false;
+ }
+
+ private static glTF_KHR_texture_basisu Deserialize(JsonNode json)
+ {
+ if (json.Value.ValueType != ValueNodeType.Object) return null;
+
+ foreach (var kv in json.ObjectItems())
+ {
+ var key = kv.Key.GetString();
+ switch (key)
+ {
+ case nameof(source):
+ var value = kv.Value.GetInt32();
+ return new glTF_KHR_texture_basisu
+ {
+ source = value,
+ };
+ }
+ }
+
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_basisu.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_basisu.cs.meta
new file mode 100644
index 000000000..45bed0843
--- /dev/null
+++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_basisu.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ed158370be0b4340b9d571c199878591
+timeCreated: 1638944458
\ No newline at end of file
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_transform.cs b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_transform.cs
index fc57616c8..2a2f634d6 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_transform.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_texture_transform.cs
@@ -5,6 +5,11 @@ using UniJSON;
namespace UniGLTF
{
+ ///
+ /// material が参照する `textureInfo` に対する extension.
+ ///
+ /// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform
+ ///
[Serializable]
public class glTF_KHR_texture_transform
{
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/glTFTexture.cs b/Assets/UniGLTF/Runtime/UniGLTF/Format/glTFTexture.cs
index 6ec8065e7..7601237e6 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/Format/glTFTexture.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/glTFTexture.cs
@@ -47,32 +47,6 @@ namespace UniGLTF
[JsonSchema(EnumValues = new object[] { "image/jpeg", "image/png" }, EnumSerializationType = EnumSerializationType.AsString)]
public string mimeType;
- public string GetExt()
- {
- switch (mimeType)
- {
- case "image/png":
- return ".png";
-
- case "image/jpeg":
- return ".jpg";
-
- default:
- if (uri.FastStartsWith("data:image/jpeg;"))
- {
- return ".jpg";
- }
- else if (uri.FastStartsWith("data:image/png;"))
- {
- return ".png";
- }
- else
- {
- return Path.GetExtension(uri)?.ToLowerInvariant() ?? string.Empty;
- }
- }
- }
-
// empty schemas
public glTFExtension extensions;
public glTFExtension extras;
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs
index aedfe0391..59c88990b 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs
@@ -314,23 +314,19 @@ namespace UniGLTF
return result;
}
- public ArraySegment GetBytesFromImage(int imageIndex)
+ public (ArraySegment binary, string mimeType)? GetBytesFromImage(int imageIndex)
{
+ if (imageIndex < 0 || imageIndex >= GLTF.images.Count) return default;
+
var image = GLTF.images[imageIndex];
if (string.IsNullOrEmpty(image.uri))
{
- return GetBytesFromBufferView(image.bufferView);
+ return (GetBytesFromBufferView(image.bufferView), image.mimeType);
}
else
{
- return GetBytesFromUri(image.uri);
+ return (GetBytesFromUri(image.uri), image.mimeType);
}
}
-
- public ArraySegment GetImageBytesFromTextureIndex(int textureIndex)
- {
- var imageIndex = GLTF.textures[textureIndex].source;
- return GetBytesFromImage(imageIndex);
- }
}
}
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfUnlitMaterialImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfUnlitMaterialImporter.cs
index e16b1fbd9..bd422a7a0 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfUnlitMaterialImporter.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfUnlitMaterialImporter.cs
@@ -44,7 +44,7 @@ namespace UniGLTF
{
var (offset, scale) =
GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
- var (key, textureParam) = GltfTextureImporter.CreateSRGB(data,
+ var (key, textureParam) = GltfTextureImporter.CreateSrgb(data,
src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
textureSlots.Add("_MainTex", textureParam);
}
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfPbrTextureImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfPbrTextureImporter.cs
index ca963e882..5d7ab1dfa 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfPbrTextureImporter.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfPbrTextureImporter.cs
@@ -54,7 +54,7 @@ namespace UniGLTF
public static (SubAssetKey, TextureDescriptor) BaseColorTexture(GltfData data, glTFMaterial src)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
- return GltfTextureImporter.CreateSRGB(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
+ return GltfTextureImporter.CreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
}
public static (SubAssetKey, TextureDescriptor) StandardTexture(GltfData data, glTFMaterial src)
@@ -84,7 +84,7 @@ namespace UniGLTF
public static (SubAssetKey, TextureDescriptor) EmissiveTexture(GltfData data, glTFMaterial src)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.emissiveTexture);
- return GltfTextureImporter.CreateSRGB(data, src.emissiveTexture.index, offset, scale);
+ return GltfTextureImporter.CreateSrgb(data, src.emissiveTexture.index, offset, scale);
}
}
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs
index 39e5cea19..c14c779b3 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs
@@ -11,32 +11,44 @@ namespace UniGLTF
///
public static class GltfTextureImporter
{
- public static Byte[] ToArray(ArraySegment bytes)
+ ///
+ /// glTF の Texture が存在せず Image のみのものを、Texture として扱いたい場合の関数.
+ ///
+ public static (SubAssetKey, TextureDescriptor) CreateSrgbFromOnlyImage(GltfData data, int imageIndex, string uniqueName, string uri)
{
- if (bytes.Array == null)
- {
- return new byte[] { };
- }
- else if (bytes.Offset == 0 && bytes.Count == bytes.Array.Length)
- {
- return bytes.Array;
- }
- else
- {
- Byte[] result = new byte[bytes.Count];
- Buffer.BlockCopy(bytes.Array, bytes.Offset, result, 0, result.Length);
- return result;
- }
+ var name = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, uniqueName, uri);
+ var texDesc = new TextureDescriptor(
+ name,
+ Vector2.zero,
+ Vector2.one,
+ default,
+ TextureImportTypes.sRGB,
+ default,
+ default,
+ () =>
+ {
+ var imageBytes = data.GetBytesFromImage(imageIndex);
+ return Task.FromResult<(byte[], string)?>((ToArray(imageBytes?.binary ?? default), null));
+ },
+ default, default, default, default, default);
+ return (texDesc.SubAssetKey, texDesc);
}
- public static (SubAssetKey, TextureDescriptor) CreateSRGB(GltfData data, int textureIndex, Vector2 offset, Vector2 scale)
+ public static (SubAssetKey, TextureDescriptor) CreateSrgb(GltfData data, int textureIndex, Vector2 offset, Vector2 scale)
{
var gltfTexture = data.GLTF.textures[textureIndex];
var gltfImage = data.GLTF.images[gltfTexture.source];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
- GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(textureIndex)));
- var param = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, offset, scale, sampler, TextureImportTypes.sRGB, default, default, getTextureBytesAsync, default, default, default, default, default);
+ var param = new TextureDescriptor(
+ name,
+ offset, scale,
+ sampler,
+ TextureImportTypes.sRGB,
+ default,
+ default,
+ () => Task.FromResult(GetImageBytesFromTextureIndex(data, textureIndex)),
+ default, default, default, default, default);
return (param.SubAssetKey, param);
}
@@ -46,8 +58,16 @@ namespace UniGLTF
var gltfImage = data.GLTF.images[gltfTexture.source];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.Linear, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
- GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(textureIndex)));
- var param = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, offset, scale, sampler, TextureImportTypes.Linear, default, default, getTextureBytesAsync, default, default, default, default, default);
+ var param = new TextureDescriptor(
+ name,
+ offset,
+ scale,
+ sampler,
+ TextureImportTypes.Linear,
+ default,
+ default,
+ () => Task.FromResult(GetImageBytesFromTextureIndex(data, textureIndex)),
+ default, default, default, default, default);
return (param.SubAssetKey, param);
}
@@ -57,8 +77,16 @@ namespace UniGLTF
var gltfImage = data.GLTF.images[gltfTexture.source];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.NormalMap, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
- GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(textureIndex)));
- var param = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, offset, scale, sampler, TextureImportTypes.NormalMap, default, default, getTextureBytesAsync, default, default, default, default, default);
+ var param = new TextureDescriptor(
+ name,
+ offset,
+ scale,
+ sampler,
+ TextureImportTypes.NormalMap,
+ default,
+ default,
+ () => Task.FromResult(GetImageBytesFromTextureIndex(data, textureIndex)),
+ default, default, default, default, default);
return (param.SubAssetKey, param);
}
@@ -73,7 +101,7 @@ namespace UniGLTF
var gltfTexture = data.GLTF.textures[metallicRoughnessTextureIndex.Value];
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source].uri);
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, metallicRoughnessTextureIndex.Value);
- getMetallicRoughnessAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(metallicRoughnessTextureIndex.Value)));
+ getMetallicRoughnessAsync = () => Task.FromResult(GetImageBytesFromTextureIndex(data, metallicRoughnessTextureIndex.Value));
}
GetTextureBytesAsync getOcclusionAsync = default;
@@ -85,10 +113,20 @@ namespace UniGLTF
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source].uri);
}
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, occlusionTextureIndex.Value);
- getOcclusionAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(occlusionTextureIndex.Value)));
+ getOcclusionAsync = () => Task.FromResult(GetImageBytesFromTextureIndex(data, occlusionTextureIndex.Value));
}
- var texDesc = new TextureDescriptor(name, ".png", null, offset, scale, sampler, TextureImportTypes.StandardMap, metallicFactor, roughnessFactor, getMetallicRoughnessAsync, getOcclusionAsync, default, default, default, default);
+ var texDesc = new TextureDescriptor(
+ name,
+ offset,
+ scale,
+ sampler,
+ TextureImportTypes.StandardMap,
+ metallicFactor,
+ roughnessFactor,
+ getMetallicRoughnessAsync,
+ getOcclusionAsync,
+ default, default, default, default);
return (texDesc.SubAssetKey, texDesc);
}
@@ -123,5 +161,62 @@ namespace UniGLTF
return (offset, scale);
}
+
+ public static (byte[] binary, string mimeType)? GetImageBytesFromTextureIndex(GltfData data, int textureIndex)
+ {
+ if (Application.isPlaying)
+ {
+ // NOTE: Runtime の場合は、拡張を考える.
+ var imageIndex = GetImageIndexFromTexture(data, textureIndex);
+
+ if (textureIndex >= 0 && textureIndex < data.GLTF.textures.Count)
+ {
+ var texture = data.GLTF.textures[textureIndex];
+ if (glTF_KHR_texture_basisu.TryGet(texture, out var basisuExtension))
+ {
+ imageIndex = basisuExtension.source;
+ }
+ }
+
+ if (!imageIndex.HasValue) return default;
+
+ var imageBytes = data.GetBytesFromImage(imageIndex.Value);
+ return (ToArray(imageBytes?.binary ?? default), imageBytes?.mimeType);
+ }
+ else
+ {
+ // NOTE: Editor の場合は通常通り読み込む.
+ var imageIndex = GetImageIndexFromTexture(data, textureIndex);
+ if (!imageIndex.HasValue) return default;
+
+ var imageBytes = data.GetBytesFromImage(imageIndex.Value);
+ return (ToArray(imageBytes?.binary ?? default), imageBytes?.mimeType);
+ }
+ }
+
+ private static int? GetImageIndexFromTexture(GltfData data, int textureIndex)
+ {
+ if (textureIndex < 0 || textureIndex >= data.GLTF.textures.Count) return default;
+
+ return data.GLTF.textures[textureIndex].source;
+ }
+
+ private static byte[] ToArray(ArraySegment bytes)
+ {
+ if (bytes.Array == null)
+ {
+ return new byte[] { };
+ }
+ else if (bytes.Offset == 0 && bytes.Count == bytes.Array.Length)
+ {
+ return bytes.Array;
+ }
+ else
+ {
+ var result = new byte[bytes.Count];
+ Buffer.BlockCopy(bytes.Array, bytes.Offset, result, 0, result.Length);
+ return result;
+ }
+ }
}
}
diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs
index 889dd7892..ced6f815d 100644
--- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs
+++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs
@@ -292,7 +292,7 @@ namespace VRM
meta.Title = gltfMeta.title;
if (gltfMeta.texture >= 0)
{
- var (key, param) = GltfTextureImporter.CreateSRGB(Data, gltfMeta.texture, Vector2.zero, Vector2.one);
+ var (key, param) = GltfTextureImporter.CreateSrgb(Data, gltfMeta.texture, Vector2.zero, Vector2.one);
meta.Thumbnail = await TextureFactory.GetTextureAsync(param, awaitCaller) as Texture2D;
}
meta.AllowedUser = gltfMeta.allowedUser;
diff --git a/Assets/VRM/Runtime/IO/VRMMToonTextureImporter.cs b/Assets/VRM/Runtime/IO/VRMMToonTextureImporter.cs
index de8dd3622..52485a320 100644
--- a/Assets/VRM/Runtime/IO/VRMMToonTextureImporter.cs
+++ b/Assets/VRM/Runtime/IO/VRMMToonTextureImporter.cs
@@ -36,7 +36,7 @@ namespace VRM
texture = GltfTextureImporter.CreateNormal(data, textureIdx, offset, scale);
break;
default:
- texture = GltfTextureImporter.CreateSRGB(data, textureIdx, offset, scale);
+ texture = GltfTextureImporter.CreateSrgb(data, textureIdx, offset, scale);
break;
}
return true;
diff --git a/Assets/VRM/Runtime/IO/VrmTextureDescriptorGenerator.cs b/Assets/VRM/Runtime/IO/VrmTextureDescriptorGenerator.cs
index 4e484f878..047d866cb 100644
--- a/Assets/VRM/Runtime/IO/VrmTextureDescriptorGenerator.cs
+++ b/Assets/VRM/Runtime/IO/VrmTextureDescriptorGenerator.cs
@@ -69,7 +69,7 @@ namespace VRM
{
if (vrm.meta.texture > -1)
{
- texture = GltfTextureImporter.CreateSRGB(data, vrm.meta.texture, Vector2.zero, Vector2.one);
+ texture = GltfTextureImporter.CreateSrgb(data, vrm.meta.texture, Vector2.zero, Vector2.one);
return true;
}
diff --git a/Assets/VRM10/Runtime/IO/Texture/Vrm10MToonTextureImporter.cs b/Assets/VRM10/Runtime/IO/Texture/Vrm10MToonTextureImporter.cs
index 7390ded09..edbb26db1 100644
--- a/Assets/VRM10/Runtime/IO/Texture/Vrm10MToonTextureImporter.cs
+++ b/Assets/VRM10/Runtime/IO/Texture/Vrm10MToonTextureImporter.cs
@@ -151,7 +151,7 @@ namespace UniVRM10
try
{
var (offset, scale) = GetTextureOffsetAndScale(info);
- pair = GltfTextureImporter.CreateSRGB(data, info.index, offset, scale);
+ pair = GltfTextureImporter.CreateSrgb(data, info.index, offset, scale);
return true;
}
catch (NullReferenceException)
diff --git a/Assets/VRM10/Runtime/IO/Texture/Vrm10TextureDescriptorGenerator.cs b/Assets/VRM10/Runtime/IO/Texture/Vrm10TextureDescriptorGenerator.cs
index c9de0bd5e..b6e55d56c 100644
--- a/Assets/VRM10/Runtime/IO/Texture/Vrm10TextureDescriptorGenerator.cs
+++ b/Assets/VRM10/Runtime/IO/Texture/Vrm10TextureDescriptorGenerator.cs
@@ -106,18 +106,7 @@ namespace UniVRM10
}
var uniqueName = GlbLowLevelParser.FixNameUnique(used, imageName);
- var objectName = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, uniqueName, gltfImage.uri);
-
- GetTextureBytesAsync getThumbnailImageBytesAsync = () =>
- {
- var bytes = data.GetBytesFromImage(imageIndex);
- return Task.FromResult(GltfTextureImporter.ToArray(bytes));
- };
- var texDesc = new TextureDescriptor(objectName, gltfImage.GetExt(), gltfImage.uri, Vector2.zero, Vector2.one, default, TextureImportTypes.sRGB, default, default,
- getThumbnailImageBytesAsync, default, default,
- default, default, default
- );
- value = (texDesc.SubAssetKey, texDesc);
+ value = GltfTextureImporter.CreateSrgbFromOnlyImage(data, imageIndex, uniqueName, gltfImage.uri);
return true;
}
}
diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/DeserializingTextureInfo.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/DeserializingTextureInfo.cs
index 8907bb794..f7ce5d093 100644
--- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/DeserializingTextureInfo.cs
+++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/DeserializingTextureInfo.cs
@@ -12,6 +12,11 @@ namespace VRMShaders
///
public byte[] ImageData { get; }
+ ///
+ /// Texture の mimeType
+ ///
+ public string DataMimeType { get; }
+
///
/// Texture に求められる色空間
///
@@ -37,9 +42,10 @@ namespace VRMShaders
///
public TextureWrapMode WrapModeV { get; }
- internal DeserializingTextureInfo(byte[] imageData, ColorSpace colorSpace, bool useMipmap, FilterMode filterMode, TextureWrapMode wrapModeU, TextureWrapMode wrapModeV)
+ internal DeserializingTextureInfo(byte[] imageData, string dataMimeType, ColorSpace colorSpace, bool useMipmap, FilterMode filterMode, TextureWrapMode wrapModeU, TextureWrapMode wrapModeV)
{
ImageData = imageData;
+ DataMimeType = dataMimeType;
ColorSpace = colorSpace;
UseMipmap = useMipmap;
FilterMode = filterMode;
@@ -47,9 +53,10 @@ namespace VRMShaders
WrapModeV = wrapModeV;
}
- internal DeserializingTextureInfo(byte[] imageData, ColorSpace colorSpace, SamplerParam samplerParam)
+ internal DeserializingTextureInfo(byte[] imageData, string dataMimeType, ColorSpace colorSpace, SamplerParam samplerParam)
{
ImageData = imageData;
+ DataMimeType = dataMimeType;
ColorSpace = colorSpace;
UseMipmap = samplerParam.EnableMipMap;
FilterMode = samplerParam.FilterMode;
diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureDescriptor.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureDescriptor.cs
index 218ebcad6..37b4ea2c7 100644
--- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureDescriptor.cs
+++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureDescriptor.cs
@@ -13,7 +13,7 @@ namespace VRMShaders
/// File.WriteAllBytes
///
///
- public delegate Task GetTextureBytesAsync();
+ public delegate Task<(byte[] binary, string mimeType)?> GetTextureBytesAsync();
///
/// 入力 glTF ファイルを Import した結果生成される、UnityEngine.Texture のアセット 1 つを確定させる Import 情報。
@@ -21,8 +21,6 @@ namespace VRMShaders
public readonly struct TextureDescriptor
{
public readonly string UnityObjectName;
- public readonly string Ext;
- public readonly string Uri;
public readonly Vector2 Offset;
public readonly Vector2 Scale;
@@ -46,7 +44,7 @@ namespace VRMShaders
///
public SubAssetKey SubAssetKey => new SubAssetKey(SubAssetKey.TextureType, UnityObjectName);
- public TextureDescriptor(string name, string ext, string uri, Vector2 offset, Vector2 scale, SamplerParam sampler, TextureImportTypes textureType, float metallicFactor, float roughnessFactor,
+ public TextureDescriptor(string name, Vector2 offset, Vector2 scale, SamplerParam sampler, TextureImportTypes textureType, float metallicFactor, float roughnessFactor,
GetTextureBytesAsync i0,
GetTextureBytesAsync i1,
GetTextureBytesAsync i2,
@@ -55,8 +53,6 @@ namespace VRMShaders
GetTextureBytesAsync i5)
{
UnityObjectName = name;
- Ext = ext;
- Uri = uri;
Offset = offset;
Scale = scale;
Sampler = sampler;
diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureFactory.cs
index 30f1ac9d8..68a80c458 100644
--- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureFactory.cs
+++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/TextureFactory.cs
@@ -80,7 +80,7 @@ namespace VRMShaders
// https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameterNormalMap.html
var data0 = await texDesc.Index0();
var rawTexture = await TextureDeserializer.LoadTextureAsync(
- new DeserializingTextureInfo(data0, ColorSpace.Linear, texDesc.Sampler),
+ new DeserializingTextureInfo(data0?.binary, data0?.mimeType, ColorSpace.Linear, texDesc.Sampler),
awaitCaller);
rawTexture.name = subAssetKey.Name;
_textureCache.Add(subAssetKey, rawTexture);
@@ -96,14 +96,14 @@ namespace VRMShaders
{
var data0 = await texDesc.Index0();
metallicRoughnessTexture = await TextureDeserializer.LoadTextureAsync(
- new DeserializingTextureInfo(data0, ColorSpace.Linear, texDesc.Sampler),
+ new DeserializingTextureInfo(data0?.binary, data0?.mimeType, ColorSpace.Linear, texDesc.Sampler),
awaitCaller);
}
if (texDesc.Index1 != null)
{
var data1 = await texDesc.Index1();
occlusionTexture = await TextureDeserializer.LoadTextureAsync(
- new DeserializingTextureInfo(data1, ColorSpace.Linear, texDesc.Sampler),
+ new DeserializingTextureInfo(data1?.binary, data1?.mimeType, ColorSpace.Linear, texDesc.Sampler),
awaitCaller);
}
@@ -123,7 +123,7 @@ namespace VRMShaders
{
var data0 = await texDesc.Index0();
var rawTexture = await TextureDeserializer.LoadTextureAsync(
- new DeserializingTextureInfo(data0, ColorSpace.sRGB, texDesc.Sampler),
+ new DeserializingTextureInfo(data0?.binary, data0?.mimeType, ColorSpace.sRGB, texDesc.Sampler),
awaitCaller);
rawTexture.name = subAssetKey.Name;
_textureCache.Add(subAssetKey, rawTexture);
@@ -133,7 +133,7 @@ namespace VRMShaders
{
var data0 = await texDesc.Index0();
var rawTexture = await TextureDeserializer.LoadTextureAsync(
- new DeserializingTextureInfo(data0, ColorSpace.Linear, texDesc.Sampler),
+ new DeserializingTextureInfo(data0?.binary, data0?.mimeType, ColorSpace.Linear, texDesc.Sampler),
awaitCaller);
rawTexture.name = subAssetKey.Name;
_textureCache.Add(subAssetKey, rawTexture);
diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/UnityTextureDeserializer.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/UnityTextureDeserializer.cs
index af5177827..2d5a1b174 100644
--- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/UnityTextureDeserializer.cs
+++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Importer/UnityTextureDeserializer.cs
@@ -11,6 +11,17 @@ namespace VRMShaders
{
public async Task LoadTextureAsync(DeserializingTextureInfo textureInfo, IAwaitCaller awaitCaller)
{
+ switch (textureInfo.DataMimeType)
+ {
+ case "image/png":
+ break;
+ case "image/jpeg":
+ break;
+ default:
+ Debug.LogWarning($"Texture image MIME type `{textureInfo.DataMimeType}` is not supported.");
+ break;
+ }
+
var texture = new Texture2D(2, 2, TextureFormat.ARGB32, textureInfo.UseMipmap, textureInfo.ColorSpace == ColorSpace.Linear);
if (textureInfo.ImageData != null)
{