Example #1
0
    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;
    }
Example #2
0
    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();
    }
Example #3
0
    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());
    }