/// <summary> /// Loops through each voxel data point that is contained in <paramref name="dataChunk"/> AND in <paramref name="worldSpaceQuery"/>, and performs <paramref name="function"/> on it /// </summary> /// <param name="worldSpaceQuery">The query that determines whether or not a voxel data point is contained.</param> /// <param name="chunkCoordinate">The coordinate of <paramref name="dataChunk"/></param> /// <param name="dataChunk">The voxel datas of the chunk</param> /// <param name="function">The function that will be performed on each voxel data point. The arguments are as follows: 1) The world space position of the voxel data point, 2) The chunk space position of the voxel data point, 3) The index of the voxel data point inside of <paramref name="dataChunk"/>, 4) The value of the voxel data</param> public void ForEachVoxelDataInQueryInChunk(BoundsInt worldSpaceQuery, int3 chunkCoordinate, VoxelDataVolume <T> dataChunk, Action <int3, int3, int, T> function) { int3 chunkBoundsSize = VoxelWorld.WorldSettings.ChunkSize; int3 chunkWorldSpaceOrigin = chunkCoordinate * VoxelWorld.WorldSettings.ChunkSize; BoundsInt chunkWorldSpaceBounds = new BoundsInt(chunkWorldSpaceOrigin.ToVectorInt(), chunkBoundsSize.ToVectorInt()); BoundsInt intersectionVolume = IntersectionUtilities.GetIntersectionVolume(worldSpaceQuery, chunkWorldSpaceBounds); int3 intersectionVolumeMin = intersectionVolume.min.ToInt3(); int3 intersectionVolumeMax = intersectionVolume.max.ToInt3(); for (int voxelDataWorldPositionX = intersectionVolumeMin.x; voxelDataWorldPositionX <= intersectionVolumeMax.x; voxelDataWorldPositionX++) { for (int voxelDataWorldPositionY = intersectionVolumeMin.y; voxelDataWorldPositionY <= intersectionVolumeMax.y; voxelDataWorldPositionY++) { for (int voxelDataWorldPositionZ = intersectionVolumeMin.z; voxelDataWorldPositionZ <= intersectionVolumeMax.z; voxelDataWorldPositionZ++) { int3 voxelDataWorldPosition = new int3(voxelDataWorldPositionX, voxelDataWorldPositionY, voxelDataWorldPositionZ); int3 voxelDataLocalPosition = voxelDataWorldPosition - chunkWorldSpaceOrigin; int voxelDataIndex = IndexUtilities.XyzToIndex(voxelDataLocalPosition, chunkBoundsSize.x + 1, chunkBoundsSize.y + 1); if (dataChunk.TryGetVoxelData(voxelDataIndex, out T voxelData)) { function(voxelDataWorldPosition, voxelDataLocalPosition, voxelDataIndex, voxelData); } } } } }
/// <summary> /// Gets a cube-shaped volume of voxel data from <paramref name="voxelDataArray"/>. The size of the cube is 1 unit. /// </summary> /// <param name="voxelDataArray">The voxel data array to get the voxel data from</param> /// <param name="localPosition">The origin of the cube</param> /// <returns>A cube-shaped volume of voxel data. The size of the cube is 1 unit.</returns> public static VoxelCorners <T> GetVoxelDataUnitCube <T>(this VoxelDataVolume <T> voxelDataArray, int3 localPosition) where T : struct { VoxelCorners <T> voxelDataCorners = new VoxelCorners <T>(); for (int i = 0; i < 8; i++) { int3 voxelCorner = localPosition + LookupTables.CubeCorners[i]; if (voxelDataArray.TryGetVoxelData(voxelCorner, out T voxelData)) { voxelDataCorners[i] = voxelData; } } return(voxelDataCorners); }
/// <summary> /// Gets a cube-shaped volume of voxel data from <paramref name="voxelDataVolume"/>. The size of the cube is 1 unit. /// </summary> /// <param name="voxelDataVolume">The voxel data volume to get the voxel data from</param> /// <param name="localPosition">The origin of the cube</param> /// <returns>A cube-shaped volume of voxel data. The size of the cube is 1 unit.</returns> public static VoxelCorners <float> GetVoxelDataUnitCube(this VoxelDataVolume voxelDataVolume, int3 localPosition) { VoxelCorners <float> voxelDataCorners = new VoxelCorners <float>(); for (int i = 0; i < 8; i++) { int3 voxelCorner = localPosition + LookupTables.CubeCorners[i]; if (voxelDataVolume.TryGetVoxelData(voxelCorner.x, voxelCorner.y, voxelCorner.z, out float voxelData)) { voxelDataCorners[i] = voxelData; } } return(voxelDataCorners); }