diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index ce31fbc6c..cebd8c4a3 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -48,7 +48,7 @@ namespace UniGLTF MaterialDescriptorGenerator = materialGenerator ?? MaterialDescriptorGeneratorUtility.GetValidGltfMaterialDescriptorGenerator(); ExternalObjectMap = externalObjectMap ?? new Dictionary(); - textureDeserializer = textureDeserializer ?? new UnityTextureDeserializer(); + textureDeserializer = textureDeserializer ?? new UnityTextureDeserializer(_settings.ImportedTexturesAccessibility); TextureFactory = new TextureFactory(textureDeserializer, ExternalObjectMap .Where(x => x.Value is Texture) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs index 262a71719..f5b2f4d9e 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs @@ -1,19 +1,31 @@ -namespace UniGLTF +using UnityEngine; + +namespace UniGLTF { + /// + /// ImporterContext層の設定はここに。 + /// さすれば、VRMとVRM10を変えずに設定を追加できる。 + /// public class ImporterContextSettings { public bool LoadAnimation { get; } public Axes InvertAxis { get; } + public ImportedTexturesAccessibility ImportedTexturesAccessibility { get; } /// /// ImporterContextの設定を指定する。 /// /// アニメーションをインポートする場合はtrueを指定(初期値はtrue) /// GLTF から Unity に変換するときに反転させる軸を指定(初期値はAxes.Z) - public ImporterContextSettings(bool loadAnimation = true, Axes invertAxis = Axes.Z) + /// textureのbitmapにアクセスするか(初期値はEditorの場合はtrue。それ以外はfalse) + public ImporterContextSettings( + bool loadAnimation = true, + Axes invertAxis = Axes.Z, + ImportedTexturesAccessibility importedTexturesAccessibility = ImportedTexturesAccessibility.Auto) { LoadAnimation = loadAnimation; InvertAxis = invertAxis; + ImportedTexturesAccessibility = importedTexturesAccessibility; } } } \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/ImportedTextureAccessibility.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/ImportedTextureAccessibility.cs new file mode 100644 index 000000000..d012518e3 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/ImportedTextureAccessibility.cs @@ -0,0 +1,60 @@ +using System; +using UnityEngine; + +namespace UniGLTF +{ + /// + /// Accessibility of imported texture bitmap + /// + public enum ImportedTexturesAccessibility + { + /// + /// Platform dependent. + /// see: ToMarkNonReadable() + /// + Auto, + + /// + /// Bitmaps are accessible. + /// Specify explicitly when exporting an imported model again. + /// + Readable, + + /// + /// It can save memory usage. Recommended. + /// + NonReadable, + } + + public static class TextureReadableParamExtensions + { + /// + /// convert to Texture2D.LoadImage param + /// + public static bool ToMarkNonReadable(this ImportedTexturesAccessibility self) + { + switch (self) + { + case ImportedTexturesAccessibility.Auto: + if (Application.isPlaying) + { + // change behaviour from v0.128.4 + return true; + } + else + { + return false; + } + + case ImportedTexturesAccessibility.Readable: + return false; + + case ImportedTexturesAccessibility.NonReadable: + return true; + + default: + throw new ArgumentException(); + } + } + } +} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/ImportedTextureAccessibility.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/ImportedTextureAccessibility.cs.meta new file mode 100644 index 000000000..ab7e2b3f5 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/ImportedTextureAccessibility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3fd49b42a267f4a449d22012f6997398 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnitySupportedImageTypeDeserializer.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnitySupportedImageTypeDeserializer.cs index 05a71c1df..ee9c052ea 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnitySupportedImageTypeDeserializer.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnitySupportedImageTypeDeserializer.cs @@ -14,12 +14,18 @@ namespace UniGLTF /// /// /// `UnityEngine.ImageConversion.LoadImage` の第二引数 `markNonReadable` に相当。 - /// デフォルト値は `false`。 /// テクスチャ編集を行わないアプリケーションプログラム等では、 /// この値を `true` にすることでメモリ使用量の削減を期待できる。 /// このフラグの効用については `UnityEngine.Texture2D.Apply` に記述がある。 + /// + /// v0.128.4 ImportedTexturesAccessibility を参照 /// - public bool MarkNonReadable { get; set; } = false; + public ImportedTexturesAccessibility ImportedTexturesAccessibility { get; } = ImportedTexturesAccessibility.Auto; + + public UnitySupportedImageTypeDeserializer(ImportedTexturesAccessibility importedTexturesAccessibility) + { + ImportedTexturesAccessibility = importedTexturesAccessibility; + } public async Task LoadTextureAsync(DeserializingTextureInfo textureInfo, IAwaitCaller awaitCaller) { @@ -28,7 +34,7 @@ namespace UniGLTF try { var texture = new Texture2D(2, 2, TextureFormat.ARGB32, textureInfo.UseMipmap, textureInfo.ColorSpace == ColorSpace.Linear); - texture.LoadImage(textureInfo.ImageData, MarkNonReadable); + texture.LoadImage(textureInfo.ImageData, ImportedTexturesAccessibility.ToMarkNonReadable()); await awaitCaller.NextFrame(); texture.wrapModeU = textureInfo.WrapModeU; diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnityTextureDeserializer.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnityTextureDeserializer.cs index 491f89757..39b5af557 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnityTextureDeserializer.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/Import/UnityTextureDeserializer.cs @@ -8,9 +8,14 @@ namespace UniGLTF /// public sealed class UnityTextureDeserializer : ITextureDeserializer { - private readonly UnitySupportedImageTypeDeserializer _unitySupportedDeserializer = new(); + private readonly UnitySupportedImageTypeDeserializer _unitySupportedDeserializer; private readonly KtxTextureDeserializer _ktxTextureDeserializer = new(); + public UnityTextureDeserializer(ImportedTexturesAccessibility importedTexturesAccessibility) + { + _unitySupportedDeserializer = new(importedTexturesAccessibility); + } + public async Task LoadTextureAsync(DeserializingTextureInfo textureInfo, IAwaitCaller awaitCaller) { Texture2D texture = null;