Пример #1
0
        public JobHandle Generate(NativeArray <JobHandle>?jobDependencies = null)
        {
            // A NOP to make sure we have an instance before launching into threads that may need to execute on the main thread
            MonoBehaviourHelper.ExecuteOnMainThread(() => { });

            var job = new GenerateMeshLODJob();

            job.inputMesh = inputMesh.ToWorkingMesh(Allocator.TempJob);
            job.quality   = quality;
            var typeNameBytes = Encoding.UTF8.GetBytes(meshSimplifierType.AssemblyQualifiedName);

            job.meshSimplifierTypeName = new NativeArray <byte>(typeNameBytes, Allocator.TempJob);
            job.outputMesh             = new WorkingMesh(Allocator.Persistent, inputMesh.vertexCount, inputMesh.GetTriangleCount(),
                                                         inputMesh.subMeshCount, inputMesh.blendShapeCount);

            JobHandle jobHandle;

            if (jobDependencies.HasValue)
            {
                jobHandle = job.Schedule(JobHandle.CombineDependencies(jobDependencies.Value));
            }
            else
            {
                jobHandle = job.Schedule();
            }

            MonoBehaviourHelper.StartCoroutine(UpdateMesh(jobHandle, job));

            return(jobHandle);
        }
Пример #2
0
        IEnumerator UpdateMesh(JobHandle jobHandle, GenerateMeshLODJob job)
        {
            while (!jobHandle.IsCompleted)
            {
                yield return(new WaitForSecondsRealtime(0.5f));
            }

            jobHandle.Complete();

            var finalMesh     = outputMesh;
            var jobOutputMesh = job.outputMesh;

            jobOutputMesh.name = finalMesh.name;
            jobOutputMesh.ApplyToMesh(outputMesh);
            finalMesh.RecalculateBounds();

            job.Dispose();
        }