diff --git a/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiChunk.java b/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiChunk.java index 84e92da58..8bbed6ded 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiChunk.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiChunk.java @@ -29,7 +29,7 @@ import java.util.List; * Contains a list of {@link DhApiTerrainDataPoint} representing the blocks in a Minecraft chunk. * * @author Builderb0y, James Seibel - * @version 2023-12-21 + * @version 2024-7-21 * @since API 2.0.0 * * @see IDhApiWrapperFactory @@ -41,8 +41,8 @@ public class DhApiChunk public final int chunkPosX; public final int chunkPosZ; - public final int topYBlockPos; public final int bottomYBlockPos; + public final int topYBlockPos; private final List> dataPoints; @@ -52,12 +52,12 @@ public class DhApiChunk // constructors // //==============// - public DhApiChunk(int chunkPosX, int chunkPosZ, int topYBlockPos, int bottomYBlockPos) + public DhApiChunk(int chunkPosX, int chunkPosZ, int bottomYBlockPos, int topYBlockPos) { this.chunkPosX = chunkPosX; this.chunkPosZ = chunkPosZ; - this.topYBlockPos = topYBlockPos; this.bottomYBlockPos = bottomYBlockPos; + this.topYBlockPos = topYBlockPos; // populate the array to prevent null pointers this.dataPoints = new ArrayList<>(16 * 16); // 256 diff --git a/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiTerrainDataPoint.java b/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiTerrainDataPoint.java index 0c70dfbfb..ab2cb9f01 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiTerrainDataPoint.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/objects/data/DhApiTerrainDataPoint.java @@ -26,7 +26,7 @@ import com.seibel.distanthorizons.api.interfaces.block.IDhApiBlockStateWrapper; * Holds a single datapoint of terrain data. * * @author James Seibel - * @version 2022-11-13 + * @version 2024-7-20 * @since API 1.0.0 */ public class DhApiTerrainDataPoint @@ -42,22 +42,22 @@ public class DhApiTerrainDataPoint public final int blockLightLevel; public final int skyLightLevel; - public final int topYBlockPos; public final int bottomYBlockPos; + public final int topYBlockPos; public final IDhApiBlockStateWrapper blockStateWrapper; public final IDhApiBiomeWrapper biomeWrapper; - public DhApiTerrainDataPoint(byte detailLevel, int blockLightLevel, int skyLightLevel, int topYBlockPos, int bottomYBlockPos, IDhApiBlockStateWrapper blockStateWrapper, IDhApiBiomeWrapper biomeWrapper) + public DhApiTerrainDataPoint(byte detailLevel, int blockLightLevel, int skyLightLevel, int bottomYBlockPos, int topYBlockPos, IDhApiBlockStateWrapper blockStateWrapper, IDhApiBiomeWrapper biomeWrapper) { this.detailLevel = detailLevel; this.blockLightLevel = blockLightLevel; this.skyLightLevel = skyLightLevel; - this.topYBlockPos = topYBlockPos; this.bottomYBlockPos = bottomYBlockPos; + this.topYBlockPos = topYBlockPos; this.blockStateWrapper = blockStateWrapper; this.biomeWrapper = biomeWrapper; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/LodDataBuilder.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/LodDataBuilder.java index 2e939718a..d26416ea0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/LodDataBuilder.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/LodDataBuilder.java @@ -31,7 +31,6 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; -import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.util.FullDataPointUtil; import com.seibel.distanthorizons.core.util.LodUtil; @@ -67,12 +66,8 @@ public class LodDataBuilder - // get the section position - int sectionPosX = chunkWrapper.getChunkPos().x; - // negative positions start at -1 so the logic there is slightly different - sectionPosX = (sectionPosX < 0) ? ((sectionPosX + 1) / NUMB_OF_CHUNKS_WIDE) - 1 : (sectionPosX / NUMB_OF_CHUNKS_WIDE); - int sectionPosZ = chunkWrapper.getChunkPos().z; - sectionPosZ = (sectionPosZ < 0) ? ((sectionPosZ + 1) / NUMB_OF_CHUNKS_WIDE) - 1 : (sectionPosZ / NUMB_OF_CHUNKS_WIDE); + int sectionPosX = getXOrZSectionPosFromChunkPos(chunkWrapper.getChunkPos().x); + int sectionPosZ = getXOrZSectionPosFromChunkPos(chunkWrapper.getChunkPos().z); long pos = DhSectionPos.encodePos(DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL, sectionPosX, sectionPosZ); FullDataSourceV2 dataSource = FullDataSourceV2.createEmpty(pos); @@ -304,10 +299,14 @@ public class LodDataBuilder /** @throws ClassCastException if an API user returns the wrong object type(s) */ public static FullDataSourceV2 createFromApiChunkData(DhApiChunk apiChunk) throws ClassCastException, DataCorruptedException { - // TODO - long pos = DhSectionPos.convertToDetailLevel(DhSectionPos.encodeChunkPos(apiChunk.chunkPosX, apiChunk.chunkPosZ), DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL); - int relSourceBlockX = Math.abs(apiChunk.chunkPosX % 4) * LodUtil.CHUNK_WIDTH; - int relSourceBlockZ = Math.abs(apiChunk.chunkPosZ % 4) * LodUtil.CHUNK_WIDTH; + // get the section position + int sectionPosX = getXOrZSectionPosFromChunkPos(apiChunk.chunkPosX); + int sectionPosZ = getXOrZSectionPosFromChunkPos(apiChunk.chunkPosZ); + long pos = DhSectionPos.encodePos(DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL, sectionPosX, sectionPosZ); + + // chunk relative block position in the data source + int relSourceBlockX = Math.floorMod(apiChunk.chunkPosX, 4) * LodUtil.CHUNK_WIDTH; + int relSourceBlockZ = Math.floorMod(apiChunk.chunkPosZ, 4) * LodUtil.CHUNK_WIDTH; FullDataSourceV2 dataSource = FullDataSourceV2.createEmpty(pos); for (int relBlockZ = 0; relBlockZ < LodUtil.CHUNK_WIDTH; relBlockZ++) @@ -336,7 +335,7 @@ public class LodDataBuilder packedDataPoints.set(index, FullDataPointUtil.encode( id, dataPoint.topYBlockPos - dataPoint.bottomYBlockPos, - dataPoint.bottomYBlockPos - apiChunk.topYBlockPos, + dataPoint.bottomYBlockPos - apiChunk.bottomYBlockPos, (byte) (dataPoint.blockLightLevel), (byte) (dataPoint.skyLightLevel) )); @@ -362,4 +361,13 @@ public class LodDataBuilder public static boolean canGenerateLodFromChunk(IChunkWrapper chunk) { return chunk != null && chunk.isLightCorrect(); } + public static int getXOrZSectionPosFromChunkPos(int chunkXOrZPos) + { + // get the section position + int sectionPos = chunkXOrZPos; + // negative positions start at -1 so the logic there is slightly different + sectionPos = (sectionPos < 0) ? ((sectionPos + 1) / NUMB_OF_CHUNKS_WIDE) - 1 : (sectionPos / NUMB_OF_CHUNKS_WIDE); + return sectionPos; + } + }