Пример #1
0
        static IEnumerator LoadMeshes(VRMImporterContext context)
        {
            var meshImporter = new MeshImporter();

            for (int i = 0; i < context.GLTF.meshes.Count; ++i)
            {
                var meshContext       = meshImporter.ReadMesh(context, i);
                var meshWithMaterials = gltfImporter.BuildMesh(context, meshContext);
                var mesh = meshWithMaterials.Mesh;
                if (string.IsNullOrEmpty(mesh.name))
                {
                    mesh.name = string.Format("UniGLTF import#{0}", i);
                }
                context.Meshes.Add(meshWithMaterials);

                yield return(null);
            }
        }
Пример #2
0
 protected override Schedulable <Unit> LoadAsync()
 {
     return(Schedulable.Create()
            .AddTask(Scheduler.ThreadPool, () =>
     {
         using (MeasureTime("glTF_VRM_Material.Parse"))
         {
             return glTF_VRM_Material.Parse(Json);
         }
     })
            .ContinueWith(Scheduler.MainThread, gltfMaterials =>
     {
         using (MeasureTime("new VRMMaterialImporter"))
         {
             SetMaterialImporter(new VRMMaterialImporter(this, gltfMaterials));
         }
     })
            .OnExecute(Scheduler.ThreadPool, parent =>
     {
         // textures
         for (int i = 0; i < GLTF.textures.Count; ++i)
         {
             var index = i;
             parent.AddTask(Scheduler.MainThread,
                            () =>
             {
                 using (MeasureTime("texture.Process"))
                 {
                     var texture = new TextureItem(index);
                     texture.Process(GLTF, Storage);
                     return texture;
                 }
             })
             .ContinueWith(Scheduler.ThreadPool, x => AddTexture(x));
         }
     })
            .ContinueWithCoroutine(Scheduler.MainThread, () => LoadMaterials())
            .OnExecute(Scheduler.ThreadPool, parent =>
     {
         // meshes
         var meshImporter = new MeshImporter();
         for (int i = 0; i < GLTF.meshes.Count; ++i)
         {
             var index = i;
             parent.AddTask(Scheduler.ThreadPool,
                            () =>
             {
                 using (MeasureTime("ReadMesh"))
                 {
                     return meshImporter.ReadMesh(this, index);
                 }
             })
             .ContinueWith(Scheduler.MainThread, x =>
             {
                 using (MeasureTime("BuildMesh"))
                 {
                     return MeshImporter.BuildMesh(this, x);
                 }
             })
             .ContinueWith(Scheduler.ThreadPool, x => Meshes.Add(x))
             ;
         }
     })
            .ContinueWithCoroutine(Scheduler.MainThread, () =>
     {
         using (MeasureTime("LoadNodes"))
         {
             return LoadNodes();
         }
     })
            .ContinueWithCoroutine(Scheduler.MainThread, () =>
     {
         using (MeasureTime("BuildHierarchy"))
         {
             return BuildHierarchy();
         }
     })
            .ContinueWith(Scheduler.CurrentThread, _ =>
     {
         //using (MeasureTime("OnLoadModel"))
         {
             OnLoadModel();
             return Unit.Default;
         }
     })
            .ContinueWith(Scheduler.CurrentThread,
                          _ =>
     {
         Root.name = "VRM";
         Debug.Log(GetSpeedLog());
         return Unit.Default;
     }));
 }
Пример #3
0
        private static Schedulable <GameObject> LoadVrmAsyncInternal(VRMImporterContext ctx, bool show)
        {
            return(Schedulable.Create()
                   .AddTask(Scheduler.ThreadPool, () =>
            {
                using (ctx.MeasureTime("glTF_VRM_Material.Parse"))
                {
                    return glTF_VRM_Material.Parse(ctx.Json);
                }
            })
                   .ContinueWith(Scheduler.MainThread, gltfMaterials =>
            {
                using (ctx.MeasureTime("new VRMMaterialImporter"))
                {
                    ctx.MaterialImporter = new VRMMaterialImporter(ctx, gltfMaterials);
                }
            })
                   .OnExecute(Scheduler.ThreadPool, parent =>
            {
                // textures
                for (int i = 0; i < ctx.GLTF.textures.Count; ++i)
                {
                    var index = i;
                    parent.AddTask(Scheduler.MainThread,
                                   () =>
                    {
                        using (ctx.MeasureTime("texture.Process"))
                        {
                            var texture = new TextureItem(ctx.GLTF, index);
                            texture.Process(ctx.GLTF, ctx.Storage);
                            return texture;
                        }
                    })
                    .ContinueWith(Scheduler.ThreadPool, x => ctx.AddTexture(x));
                }
            })
                   .ContinueWithCoroutine(Scheduler.MainThread, () => LoadMaterials(ctx))
                   .OnExecute(Scheduler.ThreadPool, parent =>
            {
                // meshes
                var meshImporter = new MeshImporter();
                for (int i = 0; i < ctx.GLTF.meshes.Count; ++i)
                {
                    var index = i;
                    parent.AddTask(Scheduler.ThreadPool,
                                   () =>
                    {
                        using (ctx.MeasureTime("ReadMesh"))
                        {
                            return meshImporter.ReadMesh(ctx, index);
                        }
                    })
                    .ContinueWith(Scheduler.MainThread, x =>
                    {
                        using (ctx.MeasureTime("BuildMesh"))
                        {
                            return gltfImporter.BuildMesh(ctx, x);
                        }
                    })
                    .ContinueWith(Scheduler.ThreadPool, x => ctx.Meshes.Add(x))
                    ;
                }
            })
                   .ContinueWithCoroutine(Scheduler.MainThread, () =>
            {
                using (ctx.MeasureTime("LoadNodes"))
                {
                    return LoadNodes(ctx);
                }
            })
                   .ContinueWithCoroutine(Scheduler.MainThread, () =>
            {
                using (ctx.MeasureTime("BuildHierarchy"))
                {
                    return BuildHierarchy(ctx);
                }
            })
                   .ContinueWith(Scheduler.CurrentThread, _ =>
            {
                //using (ctx.MeasureTime("OnLoadModel"))
                {
                    return VRMImporter.OnLoadModel(ctx);
                }
            })
                   .ContinueWith(Scheduler.CurrentThread,
                                 _ =>
            {
                ctx.Root.name = "VRM";

                if (show)
                {
                    ctx.ShowMeshes();
                }

                Debug.Log(ctx.GetSpeedLog());
                return ctx.Root;
            }));
        }