protected void BuildChunkParallel(IMarchingCubeChunk chunk, bool careForNeighbours) { TriangleChunkHeap ts = DispatchAndGetShaderData(chunk, careForNeighbours); channeledChunks++; chunk.InitializeWithMeshDataParallel(ts, readyParallelChunks); }
protected override void RebuildFromTriangleArray(TriangleChunkHeap heap) { trisLeft = TriCount; ResetArrayData(); int totalTreeCount = 0; int usedTriCount = 0; TriangleBuilder[] ts = heap.tris; MarchingCubeEntity cube; cubeEntities = new MarchingCubeEntity[ChunkSize, ChunkSize, ChunkSize]; int x, y, z; int count = heap.triCount; int endIndex = heap.startIndex + heap.triCount; for (int i = heap.startIndex; i < endIndex; ++i) { x = ts[i].x; y = ts[i].y; z = ts[i].z; if (!TryGetEntityAt(x, y, z, out cube)) { cube = CreateAndAddEntityAt(x, y, z, ts[i].triIndex); SetNeighbourAt(x, y, z); } PathTriangle pathTri = new PathTriangle(cube, in ts[i].tri, ts[i].color32);
//TODO: Maybe remove pooling theese -> could reduce size of buffer for faster reads protected TriangleChunkHeap[] DispatchMultipleChunks(IMarchingCubeChunk[] chunks) { triangleBuffer.SetCounterValue(0); int chunkLength = chunks.Length; for (int i = 0; i < chunkLength; i++) { IMarchingCubeChunk c = chunks[i]; GenerateNoise(c.ChunkSizePower, c.PointsPerAxis, c.LOD, c.AnchorPos); AccumulateCubesFromNoise(c, i); } int[] triCounts = new int[chunkLength]; for (int i = 0; i < chunkLength; i++) { //TODO:check if this reduces wait time from gpu SetDisplayerOfChunk(chunks[i]); simpleChunkColliderPool.GetItemFromPoolFor(chunks[i]); } triCountBuffer.GetData(triCounts, 0, 0, chunkLength); TriangleChunkHeap[] result = new TriangleChunkHeap[chunkLength]; TriangleBuilder[] allTris = new TriangleBuilder[triCounts[triCounts.Length - 1]]; triangleBuffer.GetData(allTris, 0, 0, allTris.Length); int last = 0; for (int i = 0; i < chunkLength; i++) { int current = triCounts[i]; int length = current - last; result[i] = new TriangleChunkHeap(allTris, last, length); last = current; if (length == 0) { chunks[i].FreeSimpleChunkCollider(); } } return(result); }
//public MarchingCubeChunkNeighbourLODs GetNeighbourLODSFrom(IMarchingCubeChunk chunk) //{ // MarchingCubeChunkNeighbourLODs result = new MarchingCubeChunkNeighbourLODs(); // Vector3Int[] coords = VectorExtension.GetAllAdjacentDirections; // for (int i = 0; i < coords.Length; ++i) // { // MarchingCubeNeighbour neighbour = new MarchingCubeNeighbour(); // Vector3Int neighbourPos = chunk.CenterPos + chunk.ChunkSize * coords[i]; // if (!TryGetChunkAtPosition(neighbourPos, out neighbour.chunk)) // { // //change name to extectedLodPower // neighbour.estimatedLodPower = GetLodPowerAt(neighbourPos); // } // result[i] = neighbour; // } // return result; //} //TODO:Remove keep points protected void BuildChunk(IMarchingCubeChunk chunk, bool careForNeighbours, Action WorkOnNoise = null) { TriangleChunkHeap ts = DispatchAndGetShaderData(chunk, careForNeighbours, WorkOnNoise); chunk.InitializeWithMeshData(ts); }