您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
100 行
4.9 KiB
100 行
4.9 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using UniGLTF;
|
|
using UniJSON;
|
|
using UnityEngine;
|
|
|
|
namespace UniVRM10
|
|
{
|
|
/// <summary>
|
|
/// Migration Target: VRM file with Unlit material exported with UniVRM v0.43 or lower.
|
|
///
|
|
/// 過去の UniVRM において、KHR_materials_unlit 拡張を使わず、VRM 拡張を用いて Unlit を表現していた Material をマイグレーションする。
|
|
/// KHR_materials_unlit を用いてマイグレーションする.
|
|
/// </summary>
|
|
internal static class MigrationLegacyUnlitMaterial
|
|
{
|
|
public static bool Migrate(glTF gltf, IReadOnlyList<JsonNode> vrm0XMaterials)
|
|
{
|
|
var anyMigrated = false;
|
|
|
|
for (var materialIdx = 0; materialIdx < gltf.materials.Count; ++materialIdx)
|
|
{
|
|
try
|
|
{
|
|
var newMaterial = Migrate(vrm0XMaterials[materialIdx], gltf.materials[materialIdx].name);
|
|
if (newMaterial != null)
|
|
{
|
|
// NOTE: マイグレーション対象だった場合、上書きする.
|
|
gltf.materials[materialIdx] = newMaterial;
|
|
anyMigrated = true;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogException(ex);
|
|
}
|
|
}
|
|
|
|
return anyMigrated;
|
|
}
|
|
|
|
private static glTFMaterial Migrate(JsonNode vrm0XMaterial, string materialName)
|
|
{
|
|
var unlitMaterial = new glTFMaterial
|
|
{
|
|
name = materialName,
|
|
pbrMetallicRoughness = new glTFPbrMetallicRoughness
|
|
{
|
|
metallicFactor = 0f,
|
|
roughnessFactor = 1f,
|
|
},
|
|
extensions = new glTFExtensionExport()
|
|
.Add(glTF_KHR_materials_unlit.ExtensionName, new ArraySegment<byte>(glTF_KHR_materials_unlit.Raw)),
|
|
};
|
|
|
|
switch (MigrationMaterialUtil.GetShaderName(vrm0XMaterial))
|
|
{
|
|
case "Unlit/Color":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = MigrationMaterialUtil.GetBaseColorFactor(vrm0XMaterial);
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = null;
|
|
return unlitMaterial;
|
|
case "Unlit/Texture":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
|
|
return unlitMaterial;
|
|
case "Unlit/Transparent":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
|
|
unlitMaterial.alphaMode = "BLEND";
|
|
return unlitMaterial;
|
|
case "Unlit/Transparent Cutout":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
|
|
unlitMaterial.alphaMode = "MASK";
|
|
unlitMaterial.alphaCutoff = MigrationMaterialUtil.GetCutoff(vrm0XMaterial);
|
|
return unlitMaterial;
|
|
case "VRM/UnlitTexture":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
|
|
return unlitMaterial;
|
|
case "VRM/UnlitTransparent":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
|
|
unlitMaterial.alphaMode = "BLEND";
|
|
return unlitMaterial;
|
|
case "VRM/UnlitCutout":
|
|
unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
|
|
unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
|
|
unlitMaterial.alphaMode = "MASK";
|
|
unlitMaterial.alphaCutoff = MigrationMaterialUtil.GetCutoff(vrm0XMaterial);
|
|
return unlitMaterial;
|
|
case "VRM/UnlitTransparentZWrite":
|
|
// NOTE: ZWrite マテリアルのみ、MToon にマイグレーションするため、別処理.
|
|
return null;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|