From 53300a3028cb76907f62605e0f25a17e13599bed Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 27 Jul 2024 17:36:40 -0500 Subject: [PATCH] Update IDhApiRenderProxy.clearRenderDataCache() to also clear cached block colors --- .../api/interfaces/render/IDhApiRenderProxy.java | 8 +++----- .../core/level/ClientLevelModule.java | 2 ++ .../core/level/DhClientServerLevel.java | 5 +---- .../distanthorizons/core/render/LodQuadTree.java | 10 +++++++--- .../core/render/LodRenderSection.java | 14 ++++++++++++++ .../world/IClientLevelWrapper.java | 2 +- 6 files changed, 28 insertions(+), 13 deletions(-) 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