Skip to content
Snippets Groups Projects
Commit cfd63b90 authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

Implement wrapping for voxel loading.

parent 231280e8
No related branches found
No related tags found
No related merge requests found
...@@ -206,21 +206,44 @@ public abstract class BasicLoader { ...@@ -206,21 +206,44 @@ public abstract class BasicLoader {
int srcX, srcY, srcZ; int srcX, srcY, srcZ;
for (int z = 0; z < voxelDim.getZ(); z++) { for (int z = 0; z < voxelDim.getZ(); z++) {
srcZ = voxelZOffset + z; srcZ = voxelZOffset + z;
if (srcZ >= dims.getZ()) { if (srcZ >= dims.getZ()) {
// Handle plane overflow. // Handle plane overflow.
break; if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) {
break;
} else if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) {
srcZ = dims.getZ() - 1;
} else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) {
srcZ = dims.getZ() - ((srcZ - dims.getZ()) + 1);
}
} }
for (int y = 0; y < voxelDim.getY(); y++) { for (int y = 0; y < voxelDim.getY(); y++) {
srcY = voxelYOffset + y; srcY = voxelYOffset + y;
if (srcY >= dims.getY()) { if (srcY >= dims.getY()) {
// Handle row overflow. // Handle row overflow.
break; if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) {
break;
} else if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) {
srcY = dims.getY() - 1;
} else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) {
srcY = dims.getY() - ((srcY - dims.getY()) + 1);
}
} }
for (int x = 0; x < voxelDim.getX(); x++) { for (int x = 0; x < voxelDim.getX(); x++) {
srcX = voxelXOffset + x; srcX = voxelXOffset + x;
if (srcX >= dims.getX()) { if (srcX >= dims.getX()) {
// Handle column overflow // Handle column overflow.
break; if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) {
break;
} else if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) {
srcX = dims.getX() - 1;
} else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) {
srcX = dims.getX() - ((srcX - dims.getX()) + 1);
}
} }
voxel[Voxel.dataIndex(x, y, z, voxelDim)] = valueAt(srcZ, Block.index(srcX, srcY, dims.getX())); voxel[Voxel.dataIndex(x, y, z, voxelDim)] = valueAt(srcZ, Block.index(srcX, srcY, dims.getX()));
...@@ -236,17 +259,33 @@ public abstract class BasicLoader { ...@@ -236,17 +259,33 @@ public abstract class BasicLoader {
final V3i voxelDim) { final V3i voxelDim) {
int srcX, srcY; int srcX, srcY;
for (int z = 0; z < voxelDim.getZ(); z++) { for (int z = 0; z < voxelDim.getZ(); z++) {
// NOTE(Moravec): Plane overflow is handled by the caller which provides correct planesData.
for (int y = 0; y < voxelDim.getY(); y++) { for (int y = 0; y < voxelDim.getY(); y++) {
srcY = voxelYOffset + y; srcY = voxelYOffset + y;
if (srcY >= dims.getY()) { if (srcY >= dims.getY()) {
// Handle row overflow. // Handle row overflow.
break; if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) {
break;
} else if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) {
srcY = dims.getY() - 1;
} else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) {
srcY = dims.getY() - ((srcY - dims.getY()) + 1);
}
} }
for (int x = 0; x < voxelDim.getX(); x++) { for (int x = 0; x < voxelDim.getX(); x++) {
srcX = voxelXOffset + x; srcX = voxelXOffset + x;
if (srcX >= dims.getX()) { if (srcX >= dims.getX()) {
// Handle column overflow // Handle column overflow.
break; if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) {
break;
} else if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) {
srcX = dims.getX() - 1;
} else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) {
srcX = dims.getX() - ((srcX - dims.getX()) + 1);
}
} }
voxel[Voxel.dataIndex(x, y, z, voxelDim)] = planesData[z][Block.index(srcX, srcY, dims.getX())]; voxel[Voxel.dataIndex(x, y, z, voxelDim)] = planesData[z][Block.index(srcX, srcY, dims.getX())];
...@@ -286,12 +325,20 @@ public abstract class BasicLoader { ...@@ -286,12 +325,20 @@ public abstract class BasicLoader {
} }
private void preloadPlanesData(final int[][] planesData, final int planeOffset, final int count) throws IOException { private void preloadPlanesData(final int[][] planesData, final int planeOffset, final int count) throws IOException {
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
if (planeOffset + i < dims.getZ()) if (planeOffset + i < dims.getZ())
planesData[i] = loadPlaneData(planeOffset + i); planesData[i] = loadPlaneData(planeOffset + i);
else else {
planesData[i] = new int[dims.toV2i().multiplyTogether()]; if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) {
planesData[i] = new int[dims.toV2i().multiplyTogether()];
} else if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) {
assert (i > 0) : "Overflow on the first plane of voxel???";
planesData[i] = planesData[i - 1];
} else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) {
final int srcZ = dims.getZ() - (((planeOffset + i) - dims.getZ()) + 1);
planesData[i] = loadPlaneData(srcZ);
}
}
} }
} }
...@@ -310,7 +357,9 @@ public abstract class BasicLoader { ...@@ -310,7 +357,9 @@ public abstract class BasicLoader {
final int[][] planesData = new int[voxelDim.getZ()][0]; final int[][] planesData = new int[voxelDim.getZ()][0];
for (int voxelZOffset = planeRange.getFrom(); voxelZOffset < planeRange.getTo(); voxelZOffset += voxelDim.getZ()) { for (int voxelZOffset = planeRange.getFrom(); voxelZOffset < planeRange.getTo(); voxelZOffset += voxelDim.getZ()) {
preloadPlanesData(planesData, voxelZOffset, voxelDim.getZ()); preloadPlanesData(planesData, voxelZOffset, voxelDim.getZ());
for (int voxelYOffset = 0; voxelYOffset < dims.getY(); voxelYOffset += voxelDim.getY()) { for (int voxelYOffset = 0; voxelYOffset < dims.getY(); voxelYOffset += voxelDim.getY()) {
for (int voxelXOffset = 0; voxelXOffset < dims.getX(); voxelXOffset += voxelDim.getX()) { for (int voxelXOffset = 0; voxelXOffset < dims.getX(); voxelXOffset += voxelDim.getX()) {
loadVoxel(voxels[voxelIndex++], planesData, voxelXOffset, voxelYOffset, voxelDim); loadVoxel(voxels[voxelIndex++], planesData, voxelXOffset, voxelYOffset, voxelDim);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment