Exemple #1
0
        private void Generate()
        {
            var data   = new ColorData(pixels, textureSize, threshold, true);
            var job    = new MarchingSquaresJob <ColorData>(data);
            var handle = job.Schedule();

            handle.Complete();
            data.Dispose();

            if (triangulator == null)
            {
                triangulator = new MarchingSquaresTriangulator(cellSize);
            }
            if (draft == null)
            {
                draft = new MeshDraft();
            }
            triangulator.Triangulate(job.contours, draft);
            job.contours.Dispose();

            AssignDraftToMeshFilter(draft, meshFilter, ref mesh);
        }
    public static void GenerateMarchingSquaresWithJob(NativeArray <Voxel> nativeVoxels, Vector2Int chunkSize, Vector2 chunkScale, bool interpolate, bool triangleIndexing, bool greedyMeshing, List <Vector3> vertices, List <int> triangles)
    {
        NativeArray <Vector3> nativeVertices  = new NativeArray <Vector3>(9 * chunkSize.x * chunkSize.y, Allocator.TempJob);
        NativeArray <int>     nativeTriangles = new NativeArray <int>(9 * chunkSize.x * chunkSize.y, Allocator.TempJob);
        NativeArray <bool>    nativeQuadMap   = new NativeArray <bool> (chunkSize.x * chunkSize.y, Allocator.TempJob);
        NativeCounter         counter         = new NativeCounter(Allocator.TempJob);

        MarchingSquaresJob marchingSquaresJob = new MarchingSquaresJob
        {
            vertices         = nativeVertices,
            quadMap          = nativeQuadMap,
            counter          = counter.ToConcurrent(),
            voxels           = nativeVoxels,
            chunkSize        = chunkSize,
            chunkScale       = chunkScale,
            interpolate      = interpolate,
            triangleIndexing = triangleIndexing,
            greedyMeshing    = greedyMeshing
        };

        JobHandle marchingSquaresJobHandle = marchingSquaresJob.Schedule(chunkSize.x * chunkSize.y, 32);

        marchingSquaresJobHandle.Complete();

        if (greedyMeshing)
        {
            GreedyMeshingForJob(chunkSize, chunkScale, nativeVertices, counter, nativeQuadMap);
        }
        else
        {
            MakeQuadJob quadJob = new MakeQuadJob
            {
                chunkSize  = chunkSize,
                chunkScale = chunkScale,
                vertices   = nativeVertices,
                triangles  = nativeTriangles,
                quadMap    = nativeQuadMap,
                counter    = counter.ToConcurrent()
            };

            JobHandle quadJobHandle = quadJob.Schedule(chunkSize.x * chunkSize.y, 32);
            quadJobHandle.Complete();
        }

        int verticeSize  = counter.Count * 3;
        int triangleSize = verticeSize;

        if (triangleIndexing)
        {
            verticeSize = TriangleIndexingForJob(nativeVertices, nativeTriangles, verticeSize);
        }
        else
        {
            AddTriangleIndexForNoIndexing triangleJob = new AddTriangleIndexForNoIndexing
            {
                triangles = nativeTriangles
            };

            JobHandle triangleJobHandle = triangleJob.Schedule(verticeSize, 32);
            triangleJobHandle.Complete();
        }

        NativeSlice <Vector3> nativeSliceVertices  = new NativeSlice <Vector3>(nativeVertices, 0, verticeSize);
        NativeSlice <int>     nativeSliceTriangles = new NativeSlice <int>(nativeTriangles, 0, triangleSize);

        vertices.Clear();
        triangles.Clear();

        vertices.NativeAddRange(nativeSliceVertices);
        triangles.NativeAddRange(nativeSliceTriangles);

        counter.Dispose();
        nativeQuadMap.Dispose();
        nativeVertices.Dispose();
        nativeTriangles.Dispose();
    }