private void EditChunkDataAtPoint(Vector3 point, VoxelBrush brush, VoxelChunk[] voxelChunks) { // Find closest voxel to point var chunk_closestI = 0; var voxel_closestI = 0; for (int ci = 0; ci < voxelChunks.Length; ci++) { for (int vi = 0; vi < voxelChunks[ci].Voxels.Length; vi++) { if (Vector3.Distance(voxelChunks[ci].Voxels[vi].Position + voxelChunks[ci].Position, point) < Vector3.Distance(voxelChunks[chunk_closestI].Voxels[voxel_closestI].Position + voxelChunks[chunk_closestI].Position, point)) { voxel_closestI = vi; chunk_closestI = ci; } } } // Establish where the voxel is in its chunk int voxel_Z = System.Math.DivRem(voxel_closestI, (int)Mathf.Pow(VoxelResolution, 2), out int zRem); int voxel_Y = System.Math.DivRem(zRem, VoxelResolution, out int voxel_X); // Modify voxels based on active brush for (int i = 0; i < brush.ValueDirectionPairs.Length; i++) { //Get this chunk's x and y indicies int chunk_editI = chunk_closestI; int chunk_X = 0; int chunk_Y = 0; int chunk_Z = 0; for (int chunk_i = 0; chunk_i < ChunkCountX * ChunkCountY * ChunkCountZ; chunk_i++) { if (chunk_i == chunk_editI) { break; } chunk_X++; if (chunk_Y == ChunkCountY) { chunk_Z++; chunk_Y = 0; } if (chunk_X == ChunkCountX) { chunk_Y++; chunk_X = 0; } } // Try edit the voxel bool abort = false; TryEditVoxelOnAxis( voxel_X, chunk_X, brush.ValueDirectionPairs[i].XDir, dimensionOffset: 1, out int editXI, ref chunk_editI, ref abort); TryEditVoxelOnAxis( voxel_Y, chunk_Y, brush.ValueDirectionPairs[i].YDir, dimensionOffset: ChunkCountX, out int editYI, ref chunk_editI, ref abort ); TryEditVoxelOnAxis( voxel_Z, chunk_Z, brush.ValueDirectionPairs[i].ZDir, dimensionOffset: ChunkCountX *ChunkCountY, out int editZI, ref chunk_editI, ref abort ); if (!abort) { voxelChunks[chunk_editI] .Voxels[editXI + (editYI * VoxelResolution) + (editZI * ((int)Mathf.Pow(VoxelResolution, 2)))] .Value = brush.ValueDirectionPairs[i].Value; } } }