60 lines
2.3 KiB
C#
60 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 key, out var desc))
|
|
{
|
|
yield return (key, desc);
|
|
}
|
|
}
|
|
}
|
|
public static bool TryGetTextureFromMaterialProperty(GltfData data, glTF_VRM_Material vrmMaterial, string textureKey, out SubAssetKey key, out TextureDescriptor desc)
|
|
{
|
|
// 任意の 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:
|
|
return GltfTextureImporter.TryCreateNormal(data, textureIdx, offset, scale, out key, out desc);
|
|
default:
|
|
return GltfTextureImporter.TryCreateSrgb(data, textureIdx, offset, scale, out key, out desc);
|
|
}
|
|
}
|
|
|
|
key = default;
|
|
desc = 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;
|
|
}
|
|
}
|
|
}
|