コード例 #1
0
        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;
                }
            }
        }