async Task LoadModelAsync(string path) { Debug.LogFormat("{0}", path); var model = await Task.Run(() => { if (!File.Exists(path)) { return(null); } var vrmModel = VrmLoader.CreateVrmModel(path); return(vrmModel); }); if (model == null) { return; } m_texts.UpdateMeta(model); // UniVRM-0.XXのコンポーネントを構築する var importer = new UniVRM10.RuntimeUnityBuilder(); var assets = importer.ToUnityAsset(model); UniVRM10.ComponentBuilder.Build10(model, importer, assets); SetModel(assets.Root); }
static public ModelAsset ToUnityAsset(VrmLib.Model model, string assetPath, IExternalUnityObject scriptedImporter) { var modelAsset = new ModelAsset(); CreateTextureAsset(model, modelAsset, scriptedImporter); CreateMaterialAsset(model, modelAsset, scriptedImporter); CreateMeshAsset(model, modelAsset); // node RuntimeUnityBuilder.CreateNodes(model.Root, null, modelAsset.Map.Nodes); modelAsset.Root = modelAsset.Map.Nodes[model.Root]; // renderer var map = modelAsset.Map; foreach (var(node, go) in map.Nodes) { if (node.MeshGroup is null) { continue; } if (node.MeshGroup.Meshes.Count > 1) { throw new NotImplementedException("invalid isolated vertexbuffer"); } var renderer = RuntimeUnityBuilder.CreateRenderer(node, go, map); map.Renderers.Add(node, renderer); modelAsset.Renderers.Add(renderer); } // humanoid var boneMap = modelAsset.Map.Nodes .Where(x => x.Key.HumanoidBone.GetValueOrDefault() != VrmLib.HumanoidBones.unknown) .Select(x => (x.Value.transform, x.Key.HumanoidBone.Value)) .ToDictionary(x => x.transform, x => x.Item2); if (boneMap.Any()) { modelAsset.HumanoidAvatar = HumanoidLoader.LoadHumanoidAvatar(modelAsset.Root.transform, boneMap); if (modelAsset.HumanoidAvatar != null) { modelAsset.HumanoidAvatar.name = "VRM"; } } var animator = modelAsset.Root.AddComponent <Animator>(); animator.avatar = modelAsset.HumanoidAvatar; return(modelAsset); }
public ModelAsset ToUnityAsset(VrmLib.Model model, string assetPath, IExternalUnityObject scriptedImporter) { var modelAsset = new ModelAsset(); CreateTextureAsset(model, modelAsset, scriptedImporter); CreateMaterialAsset(model, modelAsset, scriptedImporter); RuntimeUnityBuilder.CreateMeshAsset(model, modelAsset, Meshes); // node RuntimeUnityBuilder.CreateNodes(model.Root, null, Nodes); modelAsset.Root = Nodes[model.Root]; Root = modelAsset.Root; // renderer foreach (var(mesh, renderer) in RuntimeUnityBuilder.CreateRendererAsset(Nodes, Meshes, Materials)) { Renderers.Add(mesh, renderer); } // humanoid var boneMap = Nodes .Where(x => x.Key.HumanoidBone.GetValueOrDefault() != VrmLib.HumanoidBones.unknown) .Select(x => (x.Value.transform, x.Key.HumanoidBone.Value)) .ToDictionary(x => x.transform, x => x.Item2); if (boneMap.Any()) { modelAsset.HumanoidAvatar = HumanoidLoader.LoadHumanoidAvatar(modelAsset.Root.transform, boneMap); if (modelAsset.HumanoidAvatar != null) { modelAsset.HumanoidAvatar.name = "VRM"; } } var animator = modelAsset.Root.AddComponent <Animator>(); animator.avatar = modelAsset.HumanoidAvatar; modelAsset.Map = new ModelMap { Nodes = Nodes, Textures = Textures, Materials = Materials, Meshes = Meshes, Renderers = Renderers, }; return(modelAsset); }
static public ModelAsset ToUnityAsset(VrmLib.Model model, string assetPath, IExternalUnityObject scriptedImporter) { var modelAsset = new ModelAsset(); CreateTextureAsset(model, modelAsset, scriptedImporter); CreateMaterialAsset(model, modelAsset, scriptedImporter); CreateMeshAsset(model, modelAsset); // node RuntimeUnityBuilder.CreateNodes(model.Root, null, modelAsset.Map.Nodes); modelAsset.Root = modelAsset.Map.Nodes[model.Root]; // renderer var map = modelAsset.Map; foreach (var(node, go) in map.Nodes) { if (node.MeshGroup is null) { continue; } if (node.MeshGroup.Meshes.Count > 1) { throw new NotImplementedException("invalid isolated vertexbuffer"); } var renderer = RuntimeUnityBuilder.CreateRenderer(node, go, map); map.Renderers.Add(node, renderer); modelAsset.Renderers.Add(renderer); } if (model.Vrm != null) { // humanoid var humanoid = modelAsset.Root.AddComponent <Humanoid>(); humanoid.AssignBones(modelAsset.Map.Nodes.Select(x => (x.Key.HumanoidBone.GetValueOrDefault().ToUnity(), x.Value.transform))); modelAsset.HumanoidAvatar = humanoid.CreateAvatar(); modelAsset.HumanoidAvatar.name = "VRM"; var animator = modelAsset.Root.AddComponent <Animator>(); animator.avatar = modelAsset.HumanoidAvatar; } return(modelAsset); }
public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1) { #if VRM_DEVELOP Debug.Log("OnImportAsset to " + scriptedImporter.assetPath); #endif var parser = Parse(scriptedImporter.assetPath, migrateToVrm1); if (parser == null) { // fail to parse vrm1 return; } // // Import(create unity objects) // var externalObjectMap = scriptedImporter.GetExternalObjectMap().Select(kv => (kv.Value.name, kv.Value)).ToArray(); using (var loader = new RuntimeUnityBuilder(parser, externalObjectMap)) { // settings TextureImporters foreach (var textureInfo in Vrm10MToonMaterialImporter.EnumerateAllTexturesDistinct(parser)) { TextureImporterConfigurator.Configure(textureInfo, loader.TextureFactory.ExternalMap); } loader.Load(); loader.ShowMeshes(); loader.TransferOwnership(o => { context.AddObjectToAsset(o.name, o); if (o is GameObject) { // Root GameObject is main object context.SetMainObject(loader.Root); } return(true); }); } }
static private void CreateTextureAsset(VrmLib.Model model, ModelAsset modelAsset, IExternalUnityObject scriptedImporter) { var externalObjects = scriptedImporter.GetExternalUnityObjects <Texture2D>(); // textures for (int i = 0; i < model.Textures.Count; ++i) { if (model.Textures[i] is VrmLib.ImageTexture imageTexture) { if (string.IsNullOrEmpty(model.Textures[i].Name)) { model.Textures[i].Name = string.Format("{0}_img{1}", model.Root.Name, i); } if (externalObjects.ContainsKey(model.Textures[i].Name)) { modelAsset.Map.Textures.Add(imageTexture, externalObjects[model.Textures[i].Name]); modelAsset.Textures.Add(externalObjects[model.Textures[i].Name]); } else { var name = !string.IsNullOrEmpty(imageTexture.Name) ? imageTexture.Name : string.Format("{0}_img{1}", model.Root.Name, i); var texture = RuntimeUnityBuilder.CreateTexture(imageTexture); texture.name = name; modelAsset.Map.Textures.Add(imageTexture, texture); modelAsset.Textures.Add(texture); } } else { Debug.LogWarning($"{i} not ImageTexture"); } } }