62 lines
2.3 KiB
C#
62 lines
2.3 KiB
C#
using System.Collections.Generic;
|
|
using UniGLTF;
|
|
using UnityEngine;
|
|
using VRMShaders;
|
|
|
|
namespace VRM
|
|
{
|
|
public static class VRMMToonTextureImporter
|
|
{
|
|
public static IEnumerable<(SubAssetKey, TextureDescriptor)> EnumerateAllTextures(GltfData data, glTF_VRM_extensions vrm, int materialIdx)
|
|
{
|
|
var vrmMaterial = vrm.materialProperties[materialIdx];
|
|
foreach (var kv in vrmMaterial.textureProperties)
|
|
{
|
|
if (TryGetTextureFromMaterialProperty(data, vrmMaterial, kv.Key, out var texture))
|
|
{
|
|
yield return texture;
|
|
}
|
|
}
|
|
}
|
|
public static bool TryGetTextureFromMaterialProperty(GltfData data, glTF_VRM_Material vrmMaterial, string textureKey, out (SubAssetKey, TextureDescriptor) texture)
|
|
{
|
|
// 任意の shader の import を許容する
|
|
if (/*vrmMaterial.shader == MToon.Utils.ShaderName &&*/ vrmMaterial.textureProperties.TryGetValue(textureKey, out var textureIdx))
|
|
{
|
|
var (offset, scale) = (new Vector2(0, 0), new Vector2(1, 1));
|
|
if (TryGetTextureOffsetAndScale(vrmMaterial, textureKey, out var os))
|
|
{
|
|
offset = os.offset;
|
|
scale = os.scale;
|
|
}
|
|
|
|
switch (textureKey)
|
|
{
|
|
case MToon.Utils.PropBumpMap:
|
|
texture = GltfTextureImporter.CreateNormal(data, textureIdx, offset, scale);
|
|
break;
|
|
default:
|
|
texture = GltfTextureImporter.CreateSrgb(data, textureIdx, offset, scale);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
texture = default;
|
|
return false;
|
|
}
|
|
|
|
public static bool TryGetTextureOffsetAndScale(glTF_VRM_Material vrmMaterial, string unityTextureKey, out (Vector2 offset, Vector2 scale) os)
|
|
{
|
|
if (vrmMaterial.vectorProperties.TryGetValue(unityTextureKey, out var vector))
|
|
{
|
|
os = (new Vector2(vector[0], vector[1]), new Vector2(vector[2], vector[3]));
|
|
return true;
|
|
}
|
|
|
|
os = (new Vector2(0, 0), new Vector2(1, 1));
|
|
return false;
|
|
}
|
|
}
|
|
}
|