diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs index 2519a4233..8fcc316a4 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs @@ -144,6 +144,8 @@ namespace UniGLTF { GameObject.Destroy(Copy); } + + _textureExporter.Dispose(); } #region Export diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureExporter.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureExporter.cs index e6bb6f0a0..bb132fcae 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureExporter.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/ITextureExporter.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; using UnityEngine; namespace VRMShaders @@ -8,7 +8,7 @@ namespace VRMShaders /// /// glTF 拡張で Texture の用途を増やす必要がある場合は、この interface を継承して実装すればよい。 /// - public interface ITextureExporter + public interface ITextureExporter: IDisposable { /// /// 指定の Texture を、 sRGB 色空間の値を持つ Texture に出力するように指示する。 diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExportParam.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExportParam.cs index 447514a8e..45aeac9a4 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExportParam.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExportParam.cs @@ -12,9 +12,11 @@ namespace VRMShaders public float OptionFactor { get; } public bool NeedsAlpha { get; set; } - public Func Creator { get; set; } + public Func<(Texture2D, bool IsDisposable)> Creator { get; set; } - public TextureExportParam(TextureExportTypes exportType, ColorSpace exportColorSpace, Texture primaryTexture, Texture secondaryTexture, float optionFactor, bool needsAlpha, Func creator) + public TextureExportParam(TextureExportTypes exportType, ColorSpace exportColorSpace, + Texture primaryTexture, Texture secondaryTexture, float optionFactor, bool needsAlpha, + Func<(Texture2D, bool IsDisposable)> creator) { ExportType = exportType; ExportColorSpace = exportColorSpace; diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs index 3b4229dc6..151f30242 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/Texture/Exporter/TextureExporter.cs @@ -8,10 +8,11 @@ namespace VRMShaders /// glTF にエクスポートする変換方式を蓄えて index を確定させる。 /// Exporter の最後で Export() でまとめて変換する。 /// - public sealed class TextureExporter : IDisposable, ITextureExporter + public sealed class TextureExporter : ITextureExporter { private readonly ITextureSerializer _textureSerializer; private readonly List _exportingList = new List(); + private readonly List _disposables = new List(); public TextureExporter(ITextureSerializer textureSerializer) { @@ -20,6 +21,22 @@ namespace VRMShaders public void Dispose() { + foreach (var o in _disposables) + { + if (Application.isEditor) + { + GameObject.DestroyImmediate(o); + } + else + { + GameObject.Destroy(o); + } + } + } + + private void PushDisposable(UnityEngine.Texture2D disposable) + { + _disposables.Add(disposable); } /// @@ -31,7 +48,11 @@ namespace VRMShaders for (var idx = 0; idx < _exportingList.Count; ++idx) { var exporting = _exportingList[idx]; - var texture = exporting.Creator(); + var (texture, isDisposable) = exporting.Creator(); + if (isDisposable) + { + PushDisposable(texture); + } exportedTextures.Add((texture, exporting.ExportColorSpace)); } return exportedTextures; @@ -98,8 +119,8 @@ namespace VRMShaders { _textureSerializer.ModifyTextureAssetBeforeExporting(metallicSmoothTexture); _textureSerializer.ModifyTextureAssetBeforeExporting(occlusionTexture); - return OcclusionMetallicRoughnessConverter.Export(metallicSmoothTexture, smoothness, - occlusionTexture); + return (OcclusionMetallicRoughnessConverter.Export(metallicSmoothTexture, smoothness, + occlusionTexture), true); }); if (TryGetExistsParam(param, out var existsIdx)) { @@ -125,7 +146,7 @@ namespace VRMShaders false, () => { _textureSerializer.ModifyTextureAssetBeforeExporting(src); - return NormalConverter.Export(src); + return (NormalConverter.Export(src), true); }); if (TryGetExistsParam(param, out var existsIdx)) { @@ -142,10 +163,11 @@ namespace VRMShaders } } - private Texture2D ConvertTextureSimple(Texture src, bool needsAlpha, ColorSpace exportColorSpace) + private (Texture2D, bool IsDisposable) ConvertTextureSimple(Texture src, bool needsAlpha, ColorSpace exportColorSpace) { // get Texture2D var texture2D = src as Texture2D; + var isDisposable = false; if (_textureSerializer.CanExportAsEditorAssetFile(texture2D, exportColorSpace)) { // NOTE: 生のファイルとして出力可能な場合、何もせずそのまま Texture2D を渡す。 @@ -156,8 +178,9 @@ namespace VRMShaders { _textureSerializer.ModifyTextureAssetBeforeExporting(src); texture2D = TextureConverter.CopyTexture(src, exportColorSpace, needsAlpha, null); + isDisposable = true; } - return texture2D; + return (texture2D, isDisposable); } private bool TryGetExistsParam(TextureExportParam param, out int existsIdx)