interfaceClass, EApiOverridePriority overridePriority) throws ClassCastException
{
T value;
if (overridePriority == EApiOverridePriority.PRIMARY)
diff --git a/src/main/java/com/seibel/lod/core/objects/DHBlockPos.java b/src/main/java/com/seibel/lod/core/objects/DHBlockPos.java
index a13a7a2b4..be3d1f3c8 100644
--- a/src/main/java/com/seibel/lod/core/objects/DHBlockPos.java
+++ b/src/main/java/com/seibel/lod/core/objects/DHBlockPos.java
@@ -19,6 +19,8 @@
package com.seibel.lod.core.objects;
+import com.seibel.lod.core.a7.pos.DhBlockPos2D;
+
import java.util.Objects;
public class DHBlockPos {
@@ -56,6 +58,10 @@ public class DHBlockPos {
this(pos.x, pos.y, pos.z);
}
+ public DHBlockPos(DhBlockPos2D pos, int y) {
+ this(pos.x, y, pos.z);
+ }
+
@Deprecated
public int getX()
{
diff --git a/src/main/java/com/seibel/lod/core/objects/PosToRenderContainer.java b/src/main/java/com/seibel/lod/core/objects/PosToRenderContainer.java
deleted file mode 100644
index 90ae2f643..000000000
--- a/src/main/java/com/seibel/lod/core/objects/PosToRenderContainer.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * This file is part of the Distant Horizons mod (formerly the LOD Mod),
- * licensed under the GNU LGPL v3 License.
- *
- * Copyright (C) 2020-2022 James Seibel
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, version 3.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see .
- */
-
-package com.seibel.lod.core.objects;
-
-#if abc
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import com.seibel.lod.core.api.internal.InternalApiShared;
-import com.seibel.lod.core.logging.DhLoggerBuilder;
-import com.seibel.lod.core.util.LevelPosUtil;
-import com.seibel.lod.core.util.LodUtil;
-import org.apache.logging.log4j.Logger;
-
-/**
- * Holds a levelPos that needs to be rendered.
- *
- * @author Leonardo Amato
- * @version 9-18-2021
- */
-public class PosToRenderContainer
-{
- private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
-
- public byte minDetail;
- private int regionPosX;
- private int regionPosZ;
- private int numberOfPosToRender;
- private int[] posToRender;
- private byte[][] population;
-
- static class LodPos {
- byte detail;
- int posX;
- int posZ;
- }
-
- private LodPos[] lodPosList;
-
- public PosToRenderContainer(byte minDetail, int regionPosX, int regionPosZ)
- {
- this.minDetail = minDetail;
- this.numberOfPosToRender = 0;
- this.regionPosX = regionPosX;
- this.regionPosZ = regionPosZ;
- int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - minDetail);
- posToRender = new int[size * size * 3];
- population = new byte[size][size];
- lodPosList = new LodPos[size * size];
- }
-
- public void addPosToRender(byte detailLevel, int posX, int posZ)
- {
- // When rapidly changing dimensions the bufferBuilder can cause this,
- // James isn't sure why, but this will prevent an exception at
- // the very least (while stilling logging the problem).
- if (numberOfPosToRender >= posToRender.length)
- {
- // This is might be due to dimensions having a different width
- // when first loading in
- LOGGER.error("Unable to addPosToRender. numberOfPosToRender [" + numberOfPosToRender + "] detailLevel [" + detailLevel + "] Pos [" + posX + "," + posZ + "]");
- numberOfPosToRender++; // incrementing so we can see how many pos over the limit we would go
- return;
- }
-
- //if(numberOfPosToRender >= posToRender.length)
- // posToRender = Arrays.copyOf(posToRender, posToRender.length*2);
- lodPosList[numberOfPosToRender] = new LodPos();
- lodPosList[numberOfPosToRender].detail = detailLevel;
- lodPosList[numberOfPosToRender].posX = posX;
- lodPosList[numberOfPosToRender].posZ = posZ;
- //posToRender[numberOfPosToRender * 3] = detailLevel;
- //posToRender[numberOfPosToRender * 3 + 1] = posX;
- //posToRender[numberOfPosToRender * 3 + 2] = posZ;
- numberOfPosToRender++;
- population[LevelPosUtil.getRegionModule(minDetail, LevelPosUtil.convert(detailLevel, posX, minDetail))]
- [LevelPosUtil.getRegionModule(minDetail, LevelPosUtil.convert(detailLevel, posZ, minDetail))] = (byte) (detailLevel + 1);
- }
-
- public boolean contains(byte detailLevel, int posX, int posZ)
- {
- if (LevelPosUtil.getRegion(detailLevel, posX) == regionPosX && LevelPosUtil.getRegion(detailLevel, posZ) == regionPosZ)
- return (population[LevelPosUtil.getRegionModule(minDetail, LevelPosUtil.convert(detailLevel, posX, minDetail))]
- [LevelPosUtil.getRegionModule(minDetail, LevelPosUtil.convert(detailLevel, posZ, minDetail))] == (detailLevel + 1));
- else
- return false;
- }
-
- public void clear(byte minDetail, int regionPosX, int regionPosZ)
- {
- this.numberOfPosToRender = 0;
- this.regionPosX = regionPosX;
- this.regionPosZ = regionPosZ;
- int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - minDetail);
- if (this.minDetail == minDetail)
- {
- Arrays.fill(posToRender, 0);
- for (byte[] bytes : population)
- Arrays.fill(bytes, (byte) 0);
- }
- else
- {
- this.minDetail = minDetail;
- posToRender = new int[size * size * 3];
- population = new byte[size][size];
- }
- lodPosList = new LodPos[size * size];
- }
-
- public int getNumberOfPos()
- {
- return numberOfPosToRender;
- }
-
- public byte getNthDetailLevel(int n)
- {
- return lodPosList[n].detail;
- //return (byte) posToRender[n * 3];
- }
-
- public int getNthPosX(int n)
- {
- return lodPosList[n].posX;
- //return posToRender[n * 3 + 1];
- }
-
- public int getNthPosZ(int n)
- {
- return lodPosList[n].posZ;
- //return posToRender[n * 3 + 2];
- }
-
- public void sort() {
- Arrays.sort(lodPosList, 0, numberOfPosToRender,
- (a,b) -> {
- if (a.detail != b.detail) return a.detail - b.detail;
- if (a.posX != b.posX) return a.posX - b.posX;
- return a.posZ - b.posZ;
- }
- );
- }
-
- @Override
- public String toString()
- {
-
- StringBuilder builder = new StringBuilder();
- builder.append("To render ");
- builder.append(numberOfPosToRender);
- builder.append('\n');
- for (int i = 0; i < numberOfPosToRender; i++)
- {
- builder.append(posToRender[i * 3]);
- builder.append(" ");
- builder.append(posToRender[i * 3 + 1]);
- builder.append(" ");
- builder.append(posToRender[i * 3 + 2]);
- builder.append('\n');
- }
- builder.append('\n');
- return builder.toString();
- }
-}
-#endif
\ No newline at end of file
diff --git a/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java b/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java
index 53f39e13f..4027e1da1 100644
--- a/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java
+++ b/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java
@@ -318,17 +318,7 @@ public class LodRegion {
}
return (byte) Math.max(getMinDetailLevel(), renderLevel);
}
-
- public void getPosToRender(PosToRenderContainer posToRender, int playerPosX,
- int playerPosZ)
- {
- // use FAR_FIRST on local worlds and NEAR_FIRST on servers
- EGenerationPriority generationPriority = getResolvedGenerationPriority();
- EDropoffQuality dropoffQuality = CONFIG.client().graphics().quality().getResolvedDropoffQuality();
-
- getPosToRender(posToRender, playerPosX, playerPosZ, generationPriority, dropoffQuality);
- }
private EGenerationPriority getResolvedGenerationPriority() {
EGenerationPriority priority = Config.Client.WorldGenerator.generationPriority.get();
@@ -346,140 +336,7 @@ public class LodRegion {
return dropoffQuality;
}
- /**
- * This method will fill the posToRender array with all levelPos that are
- * render-able.
- *
- * TODO why don't we return the posToRender, it would make this easier to
- * understand
- */
- private void getPosToRender(PosToRenderContainer posToRender, int playerPosX, int playerPosZ,
- EGenerationPriority priority, EDropoffQuality dropoffQuality) {
- double minDistance = LevelPosUtil.minDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerPosX, playerPosZ);
- byte targetLevel = DetailDistanceUtil.getDetailLevelFromDistance(minDistance);
- if (targetLevel <= dropoffQuality.fastModeSwitch) {
- getPosToRender(posToRender, LodUtil.REGION_DETAIL_LEVEL, 0, 0, playerPosX, playerPosZ,
- priority);
- } else {
- // FarModeSwitchLevel or above is the level where a giant block of lod is not acceptable even if not all child data exist.
- double centerDistance = LevelPosUtil.centerDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerPosX, playerPosZ);
- targetLevel = DetailDistanceUtil.getDetailLevelFromDistance(centerDistance);
- byte farModeSwitchLevel = (priority == EGenerationPriority.NEAR_FIRST) ? 0 :
- calculateFarModeSwitch(targetLevel);
- if (priority == EGenerationPriority.FAR_FIRST) farModeSwitchLevel = 8;
- getPosToRenderFlat(posToRender, LodUtil.REGION_DETAIL_LEVEL, 0, 0, targetLevel, farModeSwitchLevel);
- }
- }
- /**
- * This method will fill the posToRender array with all levelPos that are
- * render-able.
- *
- * TODO why don't we return the posToRender, it would make this easier to
- * understand TODO this needs some more comments, James was only able to figure
- * out part of it
- */
- private void getPosToRender(PosToRenderContainer posToRender, byte detailLevel, int offsetPosX, int offsetPosZ, int playerPosX,
- int playerPosZ, EGenerationPriority priority) {
- // equivalent to 2^(...)
- int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
-
- // calculate the LevelPos that are in range
- double minDistance = LevelPosUtil.minDistance(detailLevel, offsetPosX + regionPosX*size, offsetPosZ + regionPosZ*size, playerPosX, playerPosZ);
- byte minLevel = DetailDistanceUtil.getDetailLevelFromDistance(minDistance);
- // FarModeSwitchLevel or above is the level where a giant block of lod is not acceptable even if not all child data exist.
- byte farModeSwitchLevel = (priority == EGenerationPriority.NEAR_FIRST) ? 0 : calculateFarModeSwitch(minLevel);
- if (priority == EGenerationPriority.FAR_FIRST) farModeSwitchLevel = 8;
-
- if (detailLevel <= minLevel) {
- posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
- } else // case where (detailLevel > desiredLevel)
- {
- int childPosX = (offsetPosX + regionPosX*size) * 2;
- int childPosZ = (offsetPosZ + regionPosZ*size) * 2;
- byte childDetailLevel = (byte) (detailLevel - 1);
-
- if (detailLevel > farModeSwitchLevel) {
- // Giant block is not acceptable. So leave empty void if data doesn't exist.
- for (int x = 0; x <= 1; x++) {
- for (int z = 0; z <= 1; z++) {
- if (doesDataExist(childDetailLevel, childPosX + x, childPosZ + z, EDistanceGenerationMode.NONE)) {
- getPosToRender(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, playerPosX,
- playerPosZ, priority);
- }
- }
- }
- } else {
- // Giant block is acceptable. So use this level lod if not all child data exist.
- int childrenCount = 0;
- for (int x = 0; x <= 1; x++) {
- for (int z = 0; z <= 1; z++) {
- if (doesDataExist(childDetailLevel, childPosX + x, childPosZ + z, EDistanceGenerationMode.NONE)) {
- childrenCount++;
- }
- }
- }
- // If all the four children exist go deeper
- if (childrenCount == 4) {
- for (int x = 0; x <= 1; x++)
- for (int z = 0; z <= 1; z++)
- getPosToRender(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, playerPosX,
- playerPosZ, priority);
- } else {
- posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
- }
- }
- }
- }
-
- /**
- * This method will fill the posToRender array with all levelPos that are render-able,
- * but the entire region try to use the same detail level.
- */
- private void getPosToRenderFlat(PosToRenderContainer posToRender, byte detailLevel, int offsetPosX, int offsetPosZ,
- byte targetLevel, byte farModeSwitchLevel) {
- // equivalent to 2^(...)
- int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel);
- if (detailLevel == targetLevel) {
- posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
- } else // case where (detailLevel > desiredLevel)
- {
- int childPosX = (offsetPosX + regionPosX*size) * 2;
- int childPosZ = (offsetPosZ + regionPosZ*size) * 2;
- byte childDetailLevel = (byte) (detailLevel - 1);
-
- if (detailLevel > farModeSwitchLevel) {
- // Giant block is not acceptable. So leave empty void if data doesn't exist.
- for (int x = 0; x <= 1; x++) {
- for (int z = 0; z <= 1; z++) {
- if (doesDataExist(childDetailLevel, childPosX + x, childPosZ + z, EDistanceGenerationMode.NONE)) {
- getPosToRenderFlat(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, targetLevel, farModeSwitchLevel);
- }
- }
- }
- } else {
- // Giant block is acceptable. So use this level lod if not all child data exist.
- int childrenCount = 0;
- for (int x = 0; x <= 1; x++) {
- for (int z = 0; z <= 1; z++) {
- if (doesDataExist(childDetailLevel, childPosX + x, childPosZ + z, EDistanceGenerationMode.RENDERABLE)) {
- childrenCount++;
- }
- }
- }
- // If all the four children exist go deeper
- if (childrenCount == 4) {
- for (int x = 0; x <= 1; x++)
- for (int z = 0; z <= 1; z++)
- getPosToRenderFlat(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, targetLevel, farModeSwitchLevel);
- } else {
- posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size);
- }
- }
- }
- }
-
-
public static final class LevelPos {
public final byte detail;
public final int posX;