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

68 行
2.5 KiB

using System;
using System.Linq;
using UniGLTF;
using UniJSON;
using UnityEngine;
namespace UniVRM10
{
/// <summary>
/// VRM 拡張に含まれる Material 情報を用いて、マイグレーションを行う.
/// 前提として、glTF の仕様の範囲で glTFMaterial は既に読み込み済みであると仮定する.
/// </summary>
internal static class MigrationMaterials
{
private const string DontUseExtensionShaderName = "VRM_USE_GLTFSHADER";
private const string MaterialPropertiesKey = "materialProperties";
public static void Migrate(glTF gltf, JsonNode vrm0)
{
var needsDisablingVertexColor = false;
var vrm0XMaterialList = vrm0[MaterialPropertiesKey].ArrayItems().ToArray();
try
{
// 1. VRM 拡張がついていない PBR Material のマイグレーション.
MigrationPbrMaterial.Migrate(gltf, vrm0);
// 2. VRM 拡張のうち、古い Unlit 情報からの取得を試みる.
if (MigrationLegacyUnlitMaterial.Migrate(gltf, vrm0XMaterialList))
{
// NOTE: 古い Unlit である場合、頂点カラー情報を破棄する.
needsDisablingVertexColor = true;
}
// 3. VRM 拡張のうち、UnlitTransparentZWrite 情報からの取得を試みる.
if (MigrationUnlitTransparentZWriteMaterial.Migrate(gltf, vrm0XMaterialList))
{
// NOTE: 古い Unlit である場合、頂点カラー情報を破棄する.
needsDisablingVertexColor = true;
}
// 4. VRM 拡張のうち、MToon 情報からの取得を試みる.
// NOTE: MToon だった場合、内部で material.extensions を破棄してしまう.
MigrationMToonMaterial.Migrate(gltf, vrm0);
}
catch (Exception ex)
{
Debug.LogException(ex);
}
if (needsDisablingVertexColor)
{
DisableVertexColor(gltf);
}
}
private static void DisableVertexColor(glTF gltf)
{
foreach (var mesh in gltf.meshes)
{
foreach (var primitive in mesh.primitives)
{
primitive.attributes.COLOR_0 = -1;
}
}
}
}
}