private void CreateMaterialAssets(VrmLib.Model model, ModelAsset modelAsset) { foreach (var src in model.Materials) { // TODO: material has VertexColor var material = RuntimeUnityMaterialBuilder.CreateMaterialAsset(src, hasVertexColor: false, Textures); material.name = src.Name; Materials.Add(src, material); modelAsset.Materials.Add(material); } }
static private void CreateMaterialAsset(VrmLib.Model model, ModelAsset modelAsset, IExternalUnityObject scriptedImporter) { var externalObjects = scriptedImporter.GetExternalUnityObjects <Material>(); foreach (var src in model.Materials) { if (externalObjects.ContainsKey(src.Name)) { modelAsset.Map.Materials.Add(src, externalObjects[src.Name]); modelAsset.Materials.Add(externalObjects[src.Name]); } else { // TODO: material has VertexColor var material = RuntimeUnityMaterialBuilder.CreateMaterialAsset(src, hasVertexColor: false, modelAsset.Map.Textures); material.name = src.Name; modelAsset.Map.Materials.Add(src, material); modelAsset.Materials.Add(material); } } }
/// <summary> /// モデル(Transform + Renderer)を構築する。 /// <summary> public static ModelAsset ToUnityAsset(VrmLib.Model model, bool showMesh = true) { var modelAsset = new ModelAsset(); // texture for (int i = 0; i < model.Textures.Count; ++i) { var src = model.Textures[i]; var name = !string.IsNullOrEmpty(src.Name) ? src.Name : string.Format("{0}_img{1}", model.Root.Name, i); if (src is VrmLib.ImageTexture imageTexture) { var texture = CreateTexture(imageTexture); texture.name = name; modelAsset.Map.Textures.Add(src, texture); modelAsset.Textures.Add(texture); } else { Debug.LogWarning($"{name} not ImageTexture"); } } // material foreach (var src in model.Materials) { // TODO: material has VertexColor var material = RuntimeUnityMaterialBuilder.CreateMaterialAsset(src, hasVertexColor: false, modelAsset.Map.Textures); material.name = src.Name; modelAsset.Map.Materials.Add(src, material); modelAsset.Materials.Add(material); } // mesh for (int i = 0; i < model.MeshGroups.Count; ++i) { var src = model.MeshGroups[i]; if (src.Meshes.Count == 1) { // submesh 方式 var mesh = new UnityEngine.Mesh(); mesh.name = src.Name; mesh.LoadMesh(src.Meshes[0], src.Skin); modelAsset.Map.Meshes.Add(src, mesh); modelAsset.Meshes.Add(mesh); } else { // 頂点バッファの連結が必用 throw new NotImplementedException(); } } // node: recursive 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 = CreateRenderer(node, go, map); if (!showMesh) { renderer.enabled = false; } map.Renderers.Add(node, renderer); modelAsset.Renderers.Add(renderer); } var humanoid = modelAsset.Root.AddComponent <MeshUtility.Humanoid>(); humanoid.AssignBones(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); }