From ed6a4573ebd619951cea4e75a2893a1a6a6ebba6 Mon Sep 17 00:00:00 2001 From: Steveplays28 Date: Tue, 22 Aug 2023 11:36:46 +0200 Subject: [PATCH 1/2] feat: Update rendering block ignores Barrier blocks, structure void blocks, light blocks, and air blocks now share 2 `HashMap`s that define blocks that should be ignored by the LOD builder. --- .../FullDataToRenderDataTransformer.java | 12 ++++++++---- .../core/wrapperInterfaces/IWrapperFactory.java | 2 ++ .../wrapperInterfaces/block/IBlockStateWrapper.java | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java index d344048c1..4381a9499 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java @@ -18,11 +18,13 @@ import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.util.FullDataPointUtil; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.RenderDataPointUtil; +import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.coreapi.util.BitShiftUtil; +import java.util.HashMap; + /** * Handles converting {@link ChunkSizedFullDataAccessor}, {@link IIncompleteFullDataSource}, * and {@link IFullDataSource}'s to {@link ColumnRenderSource}. @@ -30,7 +32,7 @@ import com.seibel.distanthorizons.coreapi.util.BitShiftUtil; public class FullDataToRenderDataTransformer { private static final IWrapperFactory WRAPPER_FACTORY = SingletonInjector.INSTANCE.get(IWrapperFactory.class); - private static final IBlockStateWrapper AIR = WRAPPER_FACTORY.getAirBlockStateWrapper(); + private static final HashMap RENDERER_IGNORED_BLOCKS = WRAPPER_FACTORY.getRendererIgnoredBlocks(); @@ -305,9 +307,11 @@ public class FullDataToRenderDataTransformer int light = FullDataPointUtil.getLight(fullData); IBiomeWrapper biome = fullDataMapping.getBiomeWrapper(id); IBlockStateWrapper block = fullDataMapping.getBlockStateWrapper(id); - if (block.equals(AIR)) + + if (RENDERER_IGNORED_BLOCKS.containsValue(block)) { - // we don't render air + // Don't render a block that's marked as ignored by the renderer + // This map should include air (if it doesn't, the map either got refactored or something is wrong) continue; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java index cf9b88c49..5180dbb5c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java @@ -27,6 +27,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.worldGeneration.Abstrac import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable; import java.io.IOException; +import java.util.HashMap; /** * This handles creating abstract wrapper objects. @@ -40,6 +41,7 @@ public interface IWrapperFactory extends IBindable IBiomeWrapper deserializeBiomeWrapper(String str) throws IOException; IBlockStateWrapper deserializeBlockStateWrapper(String str) throws IOException; IBlockStateWrapper getAirBlockStateWrapper(); + HashMap getRendererIgnoredBlocks(); /** * Specifically designed to be used with the API. diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java index e3ba0e4c8..d0b8444a7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java @@ -2,6 +2,8 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.block; import com.seibel.distanthorizons.api.interfaces.block.IDhApiBlockStateWrapper; +import java.util.List; + /** A Minecraft version independent way of handling Blocks. */ public interface IBlockStateWrapper extends IDhApiBlockStateWrapper { From f6ee8048eb49a8b0e2ac702bb3ba0f60638bd6aa Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 23 Aug 2023 21:23:58 -0500 Subject: [PATCH 2/2] Have getRendererIgnoredBlocks()'s require a level and return a hashset --- .../transformers/FullDataToRenderDataTransformer.java | 9 ++++----- .../core/wrapperInterfaces/IWrapperFactory.java | 9 +++++++-- .../core/wrapperInterfaces/block/IBlockStateWrapper.java | 3 +-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java index 4381a9499..12e99b60b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java @@ -23,7 +23,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrappe import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.coreapi.util.BitShiftUtil; -import java.util.HashMap; +import java.util.HashSet; /** * Handles converting {@link ChunkSizedFullDataAccessor}, {@link IIncompleteFullDataSource}, @@ -32,7 +32,6 @@ import java.util.HashMap; public class FullDataToRenderDataTransformer { private static final IWrapperFactory WRAPPER_FACTORY = SingletonInjector.INSTANCE.get(IWrapperFactory.class); - private static final HashMap RENDERER_IGNORED_BLOCKS = WRAPPER_FACTORY.getRendererIgnoredBlocks(); @@ -292,6 +291,7 @@ public class FullDataToRenderDataTransformer boolean colorBelowWithAvoidedBlocks = Config.Client.Advanced.Graphics.Quality.tintWithAvoidedBlocks.get(); FullDataPointIdMap fullDataMapping = data.getMapping(); + HashSet blockStatesToIgnore = WRAPPER_FACTORY.getRendererIgnoredBlocks(level.getLevelWrapper()); boolean isVoid = true; int colorToApplyToNextBlock = -1; @@ -308,10 +308,9 @@ public class FullDataToRenderDataTransformer IBiomeWrapper biome = fullDataMapping.getBiomeWrapper(id); IBlockStateWrapper block = fullDataMapping.getBlockStateWrapper(id); - if (RENDERER_IGNORED_BLOCKS.containsValue(block)) + if (blockStatesToIgnore.contains(block)) { - // Don't render a block that's marked as ignored by the renderer - // This map should include air (if it doesn't, the map either got refactored or something is wrong) + // Don't render: air, barriers, light blocks, etc. continue; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java index 5180dbb5c..4997c3c1b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java @@ -23,11 +23,12 @@ import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.worldGeneration.AbstractBatchGenerationEnvironmentWrapper; import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable; import java.io.IOException; -import java.util.HashMap; +import java.util.HashSet; /** * This handles creating abstract wrapper objects. @@ -41,7 +42,11 @@ public interface IWrapperFactory extends IBindable IBiomeWrapper deserializeBiomeWrapper(String str) throws IOException; IBlockStateWrapper deserializeBlockStateWrapper(String str) throws IOException; IBlockStateWrapper getAirBlockStateWrapper(); - HashMap getRendererIgnoredBlocks(); + /** + * Returns the set of {@link IBlockStateWrapper}'s that shouldn't be rendered.
+ * Generally this contains blocks like: air, barriers, light blocks, etc. + */ + HashSet getRendererIgnoredBlocks(ILevelWrapper levelWrapper); /** * Specifically designed to be used with the API. diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java index d0b8444a7..14760a02f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/block/IBlockStateWrapper.java @@ -2,11 +2,10 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.block; import com.seibel.distanthorizons.api.interfaces.block.IDhApiBlockStateWrapper; -import java.util.List; - /** A Minecraft version independent way of handling Blocks. */ public interface IBlockStateWrapper extends IDhApiBlockStateWrapper { + /** will only work if a level is currently loaded */ String serialize(); /**