diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureExporter.cs index 09ed4ad2b..603a94c2c 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureExporter.cs @@ -17,10 +17,10 @@ namespace UniGLTF /// /// を更新し、textures の index を返す /// + /// もっとも根本の Exporter クラスのみが呼び出すべきである。 + /// 他の拡張機能などが呼び出すべきではない。 + /// /// - /// - /// - /// /// gltf texture index public static int PushGltfTexture(ExportingGltfData data, Texture2D texture, ColorSpace textureColorSpace, ITextureSerializer textureSerializer) { diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs index 11552c84a..4f8707b7b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs @@ -46,8 +46,6 @@ namespace UniGLTF private set; } - public ITextureExporter TextureExporter => m_textureExporter; - protected virtual IMaterialExporter CreateMaterialExporter() { return new MaterialExporter(); @@ -65,7 +63,8 @@ namespace UniGLTF } } - TextureExporter m_textureExporter; + protected ITextureExporter TextureExporter => _textureExporter; + private TextureExporter _textureExporter; GltfExportSettings m_settings; @@ -236,7 +235,7 @@ namespace UniGLTF #region Materials and Textures Materials = uniqueUnityMeshes.GetUniqueMaterials().ToList(); - m_textureExporter = new TextureExporter(textureSerializer); + _textureExporter = new TextureExporter(textureSerializer); var materialExporter = CreateMaterialExporter(); _gltf.materials = Materials.Select(x => materialExporter.ExportMaterial(x, TextureExporter, m_settings)).ToList(); @@ -378,7 +377,7 @@ namespace UniGLTF ExportExtensions(textureSerializer); // Extension で Texture が増える場合があるので最後に呼ぶ - var exported = m_textureExporter.Export(); + var exported = _textureExporter.Export(); for (var exportedTextureIdx = 0; exportedTextureIdx < exported.Count; ++exportedTextureIdx) { var (unityTexture, colorSpace) = exported[exportedTextureIdx]; diff --git a/Assets/VRM/Runtime/IO/VRMExporter.cs b/Assets/VRM/Runtime/IO/VRMExporter.cs index 741d31ad9..47178ed03 100644 --- a/Assets/VRM/Runtime/IO/VRMExporter.cs +++ b/Assets/VRM/Runtime/IO/VRMExporter.cs @@ -118,7 +118,7 @@ namespace VRM VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { - VRM.meta.texture = GltfTextureExporter.PushGltfTexture(_data, meta.Thumbnail, ColorSpace.sRGB, textureSerializer); + VRM.meta.texture = TextureExporter.RegisterExportingAsSRgb(meta.Thumbnail, needsAlpha: true); } VRM.meta.licenseType = meta.LicenseType; diff --git a/Assets/VRMShaders/GLTF/IO/Editor/Texture/Exporter/EditorTextureSerializer.cs b/Assets/VRMShaders/GLTF/IO/Editor/Texture/Exporter/EditorTextureSerializer.cs index f2ea7b9ff..ee0932873 100644 --- a/Assets/VRMShaders/GLTF/IO/Editor/Texture/Exporter/EditorTextureSerializer.cs +++ b/Assets/VRMShaders/GLTF/IO/Editor/Texture/Exporter/EditorTextureSerializer.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Reflection; using UnityEditor; using UnityEngine; @@ -8,7 +7,7 @@ namespace VRMShaders { public sealed class EditorTextureSerializer : ITextureSerializer { - private readonly RuntimeTextureSerializer m_runtimeSerializer = new RuntimeTextureSerializer(); + private readonly RuntimeTextureSerializer _runtimeSerializer = new RuntimeTextureSerializer(); /// /// Texture をオリジナルのテクスチャアセット(png/jpg)ファイルのバイト列そのまま出力してよいかどうか判断する。 @@ -56,7 +55,19 @@ namespace VRMShaders return (bytes, mime); } - return m_runtimeSerializer.ExportBytesWithMime(texture, exportColorSpace); + return _runtimeSerializer.ExportBytesWithMime(texture, exportColorSpace); + } + + /// + /// 出力に使用したいテクスチャに対して、Unity のエディタアセットとしての圧縮設定を OFF にする。 + /// + public void ModifyTextureAssetBeforeExporting(Texture texture) + { + if (EditorTextureUtility.TryGetAsEditorTexture2DAsset(texture, out var texture2D, out var assetImporter)) + { + assetImporter.textureCompression = TextureImporterCompression.Uncompressed; + assetImporter.SaveAndReimport(); + } } /// diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureSerializer.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureSerializer.cs index 8da1bf82b..c14118b8c 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureSerializer.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureSerializer.cs @@ -22,5 +22,12 @@ namespace VRMShaders /// 具体的には Texture2D をコピーする際に、コピー先の Texture2D の色空間を決定するために使用する。 /// (byte[] bytes, string mime) ExportBytesWithMime(Texture2D texture, ColorSpace exportColorSpace); + + /// + /// エクスポートに使用したい Texture に対して、事前準備を行う。 + /// + /// たとえば UnityEditor においては、Texture Asset の圧縮設定を OFF にしたりしたい。 + /// + void ModifyTextureAssetBeforeExporting(Texture texture); } } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/RuntimeTextureSerializer.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/RuntimeTextureSerializer.cs index 9bbd12e3f..c5894a8c4 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/RuntimeTextureSerializer.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/RuntimeTextureSerializer.cs @@ -1,6 +1,5 @@ using System; using UnityEngine; -using VRMShaders; namespace VRMShaders { @@ -39,6 +38,11 @@ namespace VRMShaders } } + public void ModifyTextureAssetBeforeExporting(Texture texture) + { + // NOTE: Do nothing. + } + private static (byte[] bytes, string mime) CopyTextureAndGetBytesWithMime(Texture2D texture, ColorSpace colorSpace) { var needsAlpha = texture.format != TextureFormat.RGB24; diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs index 058bd8d14..3b4229dc6 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs @@ -10,12 +10,12 @@ namespace VRMShaders /// public sealed class TextureExporter : IDisposable, ITextureExporter { - private readonly ITextureSerializer m_textureSerializer; + private readonly ITextureSerializer _textureSerializer; private readonly List _exportingList = new List(); public TextureExporter(ITextureSerializer textureSerializer) { - m_textureSerializer = textureSerializer; + _textureSerializer = textureSerializer; } public void Dispose() @@ -94,7 +94,13 @@ namespace VRMShaders var param = new TextureExportParam(TextureExportTypes.OcclusionMetallicRoughness, ColorSpace.Linear, metallicSmoothTexture, occlusionTexture, smoothness, false, - () => OcclusionMetallicRoughnessConverter.Export(metallicSmoothTexture, smoothness, occlusionTexture)); + () => + { + _textureSerializer.ModifyTextureAssetBeforeExporting(metallicSmoothTexture); + _textureSerializer.ModifyTextureAssetBeforeExporting(occlusionTexture); + return OcclusionMetallicRoughnessConverter.Export(metallicSmoothTexture, smoothness, + occlusionTexture); + }); if (TryGetExistsParam(param, out var existsIdx)) { // Return cacehd @@ -116,7 +122,11 @@ namespace VRMShaders } var param = new TextureExportParam(TextureExportTypes.Normal, ColorSpace.Linear, src, default, default, - false, () => NormalConverter.Export(src)); + false, () => + { + _textureSerializer.ModifyTextureAssetBeforeExporting(src); + return NormalConverter.Export(src); + }); if (TryGetExistsParam(param, out var existsIdx)) { // Return cached; @@ -136,12 +146,15 @@ namespace VRMShaders { // get Texture2D var texture2D = src as Texture2D; - if (m_textureSerializer.CanExportAsEditorAssetFile(texture2D, exportColorSpace)) + if (_textureSerializer.CanExportAsEditorAssetFile(texture2D, exportColorSpace)) { - // do nothing + // NOTE: 生のファイルとして出力可能な場合、何もせずそのまま Texture2D を渡す。 + // ただし、この場合のみ圧縮設定をオフにしなかった場合、挙動としてバグっぽく見えるので、これもオフにする。 + _textureSerializer.ModifyTextureAssetBeforeExporting(src); } else { + _textureSerializer.ModifyTextureAssetBeforeExporting(src); texture2D = TextureConverter.CopyTexture(src, exportColorSpace, needsAlpha, null); } return texture2D;