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)