diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs index 1395221b7..63d352b11 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs @@ -164,7 +164,7 @@ namespace UniGLTF RestoreOlderVersionValues(); FixMeshNameUnique(); - FixTextureAndImageNameUnique(); + FixTextureNameUnique(); FixMaterialNameUnique(); FixNodeName(); @@ -223,86 +223,42 @@ namespace UniGLTF /// gltfTexture.name を Unity Asset 名として運用する。 /// ユニークである必要がある。 /// - void FixTextureAndImageNameUnique() + void FixTextureNameUnique() { + var used = new HashSet(); + for (int i = 0; i < GLTF.textures.Count; ++i) { - // process images - var used = new HashSet(); - for (int i = 0; i < GLTF.images.Count; ++i) + var gltfTexture = GLTF.textures[i]; + if (string.IsNullOrEmpty(gltfTexture.name)) { - var image = GLTF.images[i]; - if (string.IsNullOrEmpty(image.name)) - { - RenameImageFromTexture(i); - } - - if (string.IsNullOrEmpty(image.name)) - { - var newName = $"image_{i}"; - if (!used.Add(newName)) - { - newName = "image_" + Guid.NewGuid().ToString("N"); - if (!used.Add(newName)) - { - throw new Exception(); - } - } - image.name = newName; - // Debug.LogWarning($"no name: => {image.name}"); - } - else - { - var lower = image.name.ToLower(); - if (used.Contains(lower)) - { - // rename - var uname = lower + "_" + Guid.NewGuid().ToString("N"); - Debug.LogWarning($"same name: {lower} => {uname}"); - image.name = uname; - lower = uname; - } - used.Add(lower); - } + // use image name + gltfTexture.name = GLTF.images[gltfTexture.source].name; } - } - - { - // process textures - var used = new HashSet(); - for (int i = 0; i < GLTF.textures.Count; ++i) + if (string.IsNullOrEmpty(gltfTexture.name)) { - var gltfTexture = GLTF.textures[i]; - if (string.IsNullOrEmpty(gltfTexture.name)) + var newName = $"texture_{i}"; + if (!used.Add(newName)) { - // use image name - gltfTexture.name = GLTF.images[gltfTexture.source].name; - } - if (string.IsNullOrEmpty(gltfTexture.name)) - { - var newName = $"image_{i}"; + newName = "texture_" + Guid.NewGuid().ToString("N"); if (!used.Add(newName)) { - newName = "image_" + Guid.NewGuid().ToString("N"); - if (!used.Add(newName)) - { - throw new Exception(); - } + throw new Exception(); } - gltfTexture.name = newName; } - else + gltfTexture.name = newName; + } + else + { + var lower = gltfTexture.name.ToLower(); + if (used.Contains(lower)) { - var lower = gltfTexture.name.ToLower(); - if (used.Contains(lower)) - { - // rename - var uname = lower + "_" + Guid.NewGuid().ToString("N"); - Debug.LogWarning($"same name: {lower} => {uname}"); - gltfTexture.name = uname; - lower = uname; - } - used.Add(lower); + // rename + var uname = lower + "_" + Guid.NewGuid().ToString("N"); + Debug.LogWarning($"same name: {lower} => {uname}"); + gltfTexture.name = uname; + lower = uname; } + used.Add(lower); } } } @@ -463,12 +419,16 @@ namespace UniGLTF public IEnumerable EnumerateTextures() { + var used = new HashSet(); for (int i = 0; i < GLTF.materials.Count; ++i) { var m = GLTF.materials[i]; foreach (var x in EnumerateTextures(m)) { - yield return x; + if (used.Add(x.Name)) + { + yield return x; + } } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/GetTextureParam.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/GetTextureParam.cs index 47fa55d56..bc3f1c5b7 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/GetTextureParam.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/GetTextureParam.cs @@ -8,7 +8,7 @@ namespace UniGLTF public const string METALLIC_GLOSS_PROP = "_MetallicGlossMap"; public const string OCCLUSION_PROP = "_OcclusionMap"; - public string Name; + public readonly string Name; public readonly string TextureType; public readonly float MetallicFactor; public readonly ushort? Index0; @@ -69,13 +69,13 @@ namespace UniGLTF public static GetTextureParam CreateMetallic(glTF gltf, int textureIndex, float metallicFactor) { var name = gltf.textures[textureIndex].name; - return new GetTextureParam(name, METALLIC_GLOSS_PROP, metallicFactor, textureIndex, default, default, default, default, default); + return new GetTextureParam(name + ".metallicRoughness", METALLIC_GLOSS_PROP, metallicFactor, textureIndex, default, default, default, default, default); } public static GetTextureParam CreateOcclusion(glTF gltf, int textureIndex) { var name = gltf.textures[textureIndex].name; - return new GetTextureParam(name, OCCLUSION_PROP, default, textureIndex, default, default, default, default, default); + return new GetTextureParam(name + ".occlusion", OCCLUSION_PROP, default, textureIndex, default, default, default, default, default); } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/TextureFactory.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/TextureFactory.cs index 558b33255..1b0ff44d1 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/TextureFactory.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureLoader/TextureFactory.cs @@ -50,11 +50,10 @@ namespace UniGLTF { if (param.Index0.HasValue && m_externalMap != null) { - var gltfTexture = m_gltf.textures[param.Index0.Value]; - if (m_externalMap.TryGetValue(gltfTexture.name, out external)) + if (m_externalMap.TryGetValue(param.Name, out external)) { - Debug.Log($"use external: {gltfTexture.name}"); - m_textureCache.Add(param, new TextureLoadInfo(external, used, true)); + // Debug.Log($"use external: {param.Name}"); + m_textureCache.Add(param.Name, new TextureLoadInfo(external, used, true)); return external; } } @@ -94,7 +93,7 @@ namespace UniGLTF } } - Dictionary m_textureCache = new Dictionary(); + Dictionary m_textureCache = new Dictionary(); public IEnumerable Textures => m_textureCache.Values; @@ -108,15 +107,15 @@ namespace UniGLTF #endif } - async Awaitable GetOrCreateBaseTexture(glTF gltf, int index, bool used) + async Awaitable GetOrCreateBaseTexture(glTF gltf, int textureIndex, bool used) { - var defaultParam = GetTextureParam.Create(gltf, index); - if (!m_textureCache.TryGetValue(defaultParam, out TextureLoadInfo cacheInfo)) + var name = gltf.textures[textureIndex].name; + if (!m_textureCache.TryGetValue(name, out TextureLoadInfo cacheInfo)) { - cacheInfo = await LoadTextureAsync(index, used); - m_textureCache.Add(defaultParam, cacheInfo); + cacheInfo = await LoadTextureAsync(textureIndex, used); + m_textureCache.Add(name, cacheInfo); } - return cacheInfo.Texture; + return cacheInfo; } /// @@ -129,7 +128,7 @@ namespace UniGLTF /// public async Awaitable GetTextureAsync(glTF gltf, GetTextureParam param) { - if (m_textureCache.TryGetValue(param, out TextureLoadInfo cacheInfo)) + if (m_textureCache.TryGetValue(param.Name, out TextureLoadInfo cacheInfo)) { return cacheInfo.Texture; } @@ -145,16 +144,17 @@ namespace UniGLTF if (Application.isPlaying) { var baseTexture = await GetOrCreateBaseTexture(gltf, param.Index0.Value, false); - var converted = new NormalConverter().GetImportTexture(baseTexture); + var converted = new NormalConverter().GetImportTexture(baseTexture.Texture); var info = new TextureLoadInfo(converted, true, false); - m_textureCache.Add(param, info); + m_textureCache.Add(param.Name, info); return info.Texture; } else { #if UNITY_EDITOR var info = await LoadTextureAsync(param.Index0.Value, true); - m_textureCache.Add(GetTextureParam.CreateNormal(gltf, param.Index0.Value), info); + var name = gltf.textures[param.Index0.Value].name; + m_textureCache.Add(name, info); var textureAssetPath = AssetDatabase.GetAssetPath(info.Texture); TextureIO.MarkTextureAssetAsNormalMap(textureAssetPath); @@ -167,25 +167,27 @@ namespace UniGLTF { // Bake roughnessFactor values into a texture. var baseTexture = await GetOrCreateBaseTexture(gltf, param.Index0.Value, false); - var converted = new MetallicRoughnessConverter(param.MetallicFactor).GetImportTexture(baseTexture); + var converted = new MetallicRoughnessConverter(param.MetallicFactor).GetImportTexture(baseTexture.Texture); + converted.name = param.Name; var info = new TextureLoadInfo(converted, true, false); - m_textureCache.Add(param, info); + m_textureCache.Add(param.Name, info); return info.Texture; } case GetTextureParam.OCCLUSION_PROP: { var baseTexture = await GetOrCreateBaseTexture(gltf, param.Index0.Value, false); - var converted = new OcclusionConverter().GetImportTexture(baseTexture); + var converted = new OcclusionConverter().GetImportTexture(baseTexture.Texture); + converted.name = param.Name; var info = new TextureLoadInfo(converted, true, false); - m_textureCache.Add(param, info); + m_textureCache.Add(param.Name, info); return info.Texture; } default: { var baseTexture = await GetOrCreateBaseTexture(gltf, param.Index0.Value, true); - return baseTexture; + return baseTexture.Texture; } throw new NotImplementedException();