private IEnumerator WaitForJobsCompleted() { while (!lastJobHandle.IsCompleted) { yield return(new WaitForEndOfFrame()); } lastJobHandle.Complete(); meshFilter.sharedMesh.Clear(); meshFilter.sharedMesh.vertices = OutVertices.ToArray(); meshFilter.sharedMesh.triangles = OutTriangles.ToArray(); meshFilter.sharedMesh.RecalculateNormals(); meshFilter.sharedMesh.RecalculateTangents(); meshFilter.sharedMesh.RecalculateBounds(); meshCollider.sharedMesh = null; meshCollider.sharedMesh = meshFilter.sharedMesh; meshCollider.convex = false; MultiPolygonData temp = subjects; subjects = clippingOutput; clippingOutput = temp; jobClips.Dispose(); OutVertices.Dispose(); OutTriangles.Dispose(); clippingOutput.Dispose(); waitForJobsCoroutine = null; }
private void OnEnable() { Vector3 halfSize = size / 2f; meshFilter = GetComponent <MeshFilter>(); meshFilter.sharedMesh = new Mesh(); meshCollider = GetComponent <MeshCollider>(); meshCollider.sharedMesh = meshFilter.sharedMesh; clips = new List <Vector2[]>(); Vector2[] contourn = { new Vector2(-halfSize.x, 0f), new Vector2(+halfSize.x, 0f), new Vector2(+halfSize.x, +size.y), new Vector2(-halfSize.x, +size.y) }; subjects = new MultiPolygonData(Allocator.Persistent); subjects.AddPolygon(contourn); ScheduleJobs(); }
private void ScheduleJobs() { Vector2 halfSize = size / 2f; jobClips = new MultiPolygonData(Allocator.TempJob); OutVertices = new NativeList <Vector3>(Allocator.TempJob); OutTriangles = new NativeList <int>(Allocator.TempJob); clippingOutput = new MultiPolygonData(Allocator.Persistent); foreach (Vector2[] clip in clips) { jobClips.AddPolygon(clip); } clips.Clear(); WallClipperJob clipperJob = new WallClipperJob() { subjects = subjects, clips = jobClips, output = clippingOutput, MinWallAnglePoint = new float2(-halfSize.x, 0f), MaxWallAnglePoint = new float2(+halfSize.x, +size.y) }; PrepareTrianglesListJob prepareTrianglesListJob = new PrepareTrianglesListJob() { Polygons = clippingOutput, OutTriangles = OutTriangles }; ECTriangulatorParallelJob triangulatorParallelJob = new ECTriangulatorParallelJob() { Polygons = clippingOutput, OutTriangles = OutTriangles.AsDeferredJobArray() }; ExtruderJob extruderJob = new ExtruderJob() { Polygons = clippingOutput, ExtrudeDirection = new Vector3(0f, 0f, size.z), OutTriangles = OutTriangles, OutVertices = OutVertices, }; JobHandle clippingHandler = clipperJob.Schedule(); JobHandle prepareTrianglesListHandler = prepareTrianglesListJob.Schedule(clippingHandler); JobHandle triangulatorHandler = triangulatorParallelJob.Schedule(clippingOutput.PolygonSupportList, 1, prepareTrianglesListHandler); lastJobHandle = extruderJob.Schedule(triangulatorHandler); waitForJobsCoroutine = StartCoroutine(WaitForJobsCompleted()); }