diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java
index 3401835d9..fc5243575 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderProxy.java
@@ -26,7 +26,7 @@ import com.seibel.distanthorizons.api.objects.DhApiResult;
* Used to interact with Distant Horizons' rendering system.
*
* @author James Seibel
- * @version 2023-10-13
+ * @version 2024-7-27
* @since API 1.0.0
*/
public interface IDhApiRenderProxy
@@ -39,10 +39,8 @@ public interface IDhApiRenderProxy
* If this is called on a dedicated server it won't do anything and will return {@link DhApiResult#success} = false
*
* Background:
- * Distant Horizons has two different file formats: Full data and Render data.
- * - Full data files store the block, biome, etc. information and is the result of loading or generating new chunks.
- * - Render data files store LOD colors and are created using the Full data and currently loaded resource packs.
- * This is the data cleared by this method.
+ * When rendering Distant Horizons bakes each block's color into the geometry that's rendered.
+ * This improves rendering speed and VRAM size, but prevents dynamically changing LOD colors.
*/
DhApiResult clearRenderDataCache();
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java
index 99dd8fcf7..3ad478be2 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java
@@ -258,6 +258,8 @@ public class ClientLevelModule implements Closeable, AbstractDataSourceHandler.I
public void clearRenderCache()
{
+ this.clientLevel.getClientLevelWrapper().clearBlockColorCache();
+
ClientRenderState ClientRenderState = this.ClientRenderStateRef.get();
if (ClientRenderState != null && ClientRenderState.quadtree != null)
{
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java
index 9d2b28bd7..b9357e6ff 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java
@@ -154,10 +154,7 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev
public IClientLevelWrapper getClientLevelWrapper() { return MC_CLIENT.getWrappedClientLevel(); }
@Override
- public void clearRenderCache()
- {
- clientside.clearRenderCache();
- }
+ public void clearRenderCache() { this.clientside.clearRenderCache(); }
@Override
public IServerLevelWrapper getServerLevelWrapper() { return serverLevelWrapper; }
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java
index ffadc3c9d..943f688c3 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java
@@ -151,7 +151,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen
}
catch (Exception e)
{
- LOGGER.error("Quad Tree tick exception for dimension: " + this.level.getClientLevelWrapper().getDimensionType().getDimensionName() + ", exception: " + e.getMessage(), e);
+ LOGGER.error("Quad Tree tick exception for dimension: " + this.level.getLevelWrapper().getDimensionType().getDimensionName() + ", exception: " + e.getMessage(), e);
}
finally
{
@@ -515,8 +515,12 @@ public class LodQuadTree extends QuadTree implements IDebugRen
QuadNode quadNode = nodeIterator.next();
if (quadNode.value != null)
{
- quadNode.value.close();
- quadNode.value = null;
+ if (quadNode.value.renderingEnabled)
+ {
+ quadNode.value.cancelGpuUpload();
+ quadNode.value.uploadRenderDataToGpuAsync();
+ }
+
}
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java
index bacd2eb7b..bfb93eccf 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java
@@ -306,6 +306,20 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable
}
+ /**
+ * Note: can cause issues with neighboring LOD sections
+ * if only some (vs all) futures are canceled.
+ */
+ public void cancelGpuUpload()
+ {
+ CompletableFuture future = this.uploadRenderDataToGpuFuture;
+ if (future != null)
+ {
+ future.cancel(true);
+ }
+ }
+
+
//========================//
// getters and properties //
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java
index 2870f51d4..742cefea0 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java
@@ -33,9 +33,9 @@ public interface IClientLevelWrapper extends ILevelWrapper
IServerLevelWrapper tryGetServerSideWrapper();
int getBlockColor(DhBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper blockState);
-
/** @return -1 if there was a problem getting the color */
int getDirtBlockColor();
+ void clearBlockColorCache();
/** Will return null if there was an issue finding the biome. */
@Nullable