mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-03-24 11:24:52 -05:00
77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
using System.Linq;
|
|
using UnityEngine;
|
|
using UniGLTF;
|
|
using System;
|
|
using VRMShaders;
|
|
#if UNITY_2020_2_OR_NEWER
|
|
using UnityEditor.AssetImporters;
|
|
#else
|
|
using UnityEditor.Experimental.AssetImporters;
|
|
#endif
|
|
|
|
|
|
namespace UniVRM10
|
|
{
|
|
public static class VrmScriptedImporterImpl
|
|
{
|
|
static IMaterialDescriptorGenerator GetMaterialDescriptorGenerator(RenderPipelineTypes renderPipeline)
|
|
{
|
|
switch (renderPipeline)
|
|
{
|
|
case RenderPipelineTypes.BuiltinRenderPipeline:
|
|
return new Vrm10MaterialDescriptorGenerator();
|
|
|
|
case RenderPipelineTypes.UniversalRenderPipeline:
|
|
return new Vrm10UrpMaterialDescriptorGenerator();
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1, RenderPipelineTypes renderPipeline)
|
|
{
|
|
#if VRM_DEVELOP
|
|
Debug.Log("OnImportAsset to " + scriptedImporter.assetPath);
|
|
#endif
|
|
|
|
if (!Vrm10Data.TryParseOrMigrate(scriptedImporter.assetPath, migrateToVrm1, out Vrm10Data result))
|
|
{
|
|
// fail to parse vrm1
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Import(create unity objects)
|
|
//
|
|
var extractedObjects = scriptedImporter.GetExternalObjectMap()
|
|
.Where(kv => kv.Value != null)
|
|
.ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value);
|
|
|
|
var materialGenerator = GetMaterialDescriptorGenerator(renderPipeline);
|
|
|
|
using (var loader = new Vrm10Importer(result, extractedObjects, materialGenerator: materialGenerator))
|
|
{
|
|
// settings TextureImporters
|
|
foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable())
|
|
{
|
|
VRMShaders.TextureImporterConfigurator.Configure(textureInfo, loader.TextureFactory.ExternalTextures);
|
|
}
|
|
|
|
var loaded = loader.Load();
|
|
loaded.ShowMeshes();
|
|
|
|
loaded.TransferOwnership((key, o) =>
|
|
{
|
|
context.AddObjectToAsset(key.Name, o);
|
|
});
|
|
var root = loaded.Root;
|
|
GameObject.DestroyImmediate(loaded);
|
|
|
|
context.AddObjectToAsset(root.name, root);
|
|
context.SetMainObject(root);
|
|
}
|
|
}
|
|
}
|
|
}
|