您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

119 行
4.1 KiB

using System;
using System.Linq;
using UniGLTF;
using UniJSON;
using UnityEngine;
namespace UniVRM10
{
internal static class MigrationMaterialUtil
{
private const string ShaderNameKey = "shader";
private const string VectorPropertiesKey = "vectorProperties";
private const string FloatPropertiesKey = "floatProperties";
private const string TexturePropertiesKey = "textureProperties";
private const string MainTexKey = "_MainTex";
private const string ColorKey = "_Color";
private const string CutoffKey = "_Cutoff";
public static string GetShaderName(JsonNode vrm0XMaterial)
{
try
{
return vrm0XMaterial[ShaderNameKey].GetString();
}
catch (Exception)
{
Debug.LogWarning($"Migration Warning: ShaderName fallback default.");
return string.Empty;
}
}
public static float[] GetBaseColorFactor(JsonNode vrm0XMaterial)
{
try
{
var factor = vrm0XMaterial[VectorPropertiesKey][ColorKey];
if (!factor.IsArray() || factor.GetArrayCount() != 4)
{
throw new Exception("not float4");
}
return factor.ArrayItems().Select(x => x.GetSingle()).ToArray();
}
catch (Exception)
{
Debug.LogWarning($"Migration Warning: BaseColorFactor fallback default.");
return new float[] {1, 1, 1, 1};
}
}
public static glTFMaterialBaseColorTextureInfo GetBaseColorTexture(JsonNode vrm0XMaterial)
{
try
{
var textureInfo = new glTFMaterialBaseColorTextureInfo
{
index = vrm0XMaterial[TexturePropertiesKey][MainTexKey].GetInt32(),
};
var os = GetBaseColorTextureOffsetScale(vrm0XMaterial);
glTF_KHR_texture_transform.Serialize(textureInfo, (os.offsetX, os.offsetY), (os.scaleX, os.scaleY));
return textureInfo;
}
catch (Exception)
{
Debug.LogWarning($"Migration Warning: BaseColorTexture fallback default.");
return null;
}
}
private static (float offsetX, float offsetY, float scaleX, float scaleY) GetBaseColorTextureOffsetScale(JsonNode vrm0XMaterial)
{
try
{
var unityOffsetScale = vrm0XMaterial[VectorPropertiesKey][MainTexKey];
if (!unityOffsetScale.IsArray() || unityOffsetScale.GetArrayCount() != 4)
{
throw new Exception("not float4");
}
var unityOffsetX = unityOffsetScale[0].GetSingle();
var unityOffsetY = unityOffsetScale[1].GetSingle();
var unityScaleX = unityOffsetScale[2].GetSingle();
var unityScaleY = unityOffsetScale[3].GetSingle();
return (unityOffsetX, 1.0f - unityOffsetY - unityScaleY, unityScaleX, unityScaleY);
}
catch (Exception)
{
Debug.LogWarning($"Migration Warning: BaseColorTextureScaleOffset fallback default.");
return (0, 0, 1, 1);
}
}
public static float GetCutoff(JsonNode vrm0XMaterial)
{
try
{
return vrm0XMaterial[FloatPropertiesKey][CutoffKey].GetSingle();
}
catch (Exception)
{
Debug.LogWarning($"Migration Warning: Cutoff fallback default.");
return 0.5f;
}
}
public static int? GetRenderQueue(JsonNode vrm0XMaterial)
{
try
{
return vrm0XMaterial["renderQueue"].GetInt32();
}
catch (Exception)
{
Debug.LogWarning($"Migration Warning: RenderQueue fallback default.");
return default;
}
}
}
}