Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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))
                {
                    Materials.Add(src, externalObjects[src.Name]);
                    modelAsset.Materials.Add(externalObjects[src.Name]);
                }
                else
                {
                    // TODO: material has VertexColor
                    var material = RuntimeUnityMaterialBuilder.CreateMaterialAsset(src, hasVertexColor: false, Textures);
                    material.name = src.Name;
                    Materials.Add(src, material);
                    modelAsset.Materials.Add(material);
                }
            }
        }
Exemplo n.º 5
0
        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))
                    {
                        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(name, imageTexture);

                        Textures.Add(imageTexture, texture);
                        modelAsset.Textures.Add(texture);
                    }
                }
                else
                {
                    Debug.LogWarning($"{i} not ImageTexture");
                }
            }
        }