diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java index 3a010e936..b5a1ac859 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -8,35 +8,28 @@ import java.util.stream.Collectors; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.systems.RenderSystem; import com.seibel.lod.common.wrappers.misc.LightMapWrapper; -import com.seibel.lod.core.api.ClientApi; -import com.seibel.lod.core.handlers.IReflectionHandler; -import com.seibel.lod.core.handlers.ReflectionHandler; +import com.seibel.lod.core.api.ModAccessorApi; import com.seibel.lod.core.util.LodUtil; -import com.seibel.lod.core.util.SingletonHandler; import net.minecraft.client.renderer.LightTexture; -import org.lwjgl.opengl.GL20; import com.mojang.math.Vector3f; import com.seibel.lod.core.objects.math.Mat4f; import com.seibel.lod.core.objects.math.Vec3d; import com.seibel.lod.core.objects.math.Vec3f; -import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory; import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; -import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftWrapper; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.lod.common.wrappers.McObjectConverter; import com.seibel.lod.common.wrappers.WrapperFactory; import com.seibel.lod.common.wrappers.block.BlockPosWrapper; -import com.seibel.lod.common.wrappers.chunk.ChunkPosWrapper; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.CompiledChunk; import net.minecraft.core.BlockPos; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.level.material.FogType; @@ -57,7 +50,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper private static final Minecraft MC = Minecraft.getInstance(); private static final GameRenderer GAME_RENDERER = MC.gameRenderer; - private static final MinecraftWrapper MC_WRAPPER = MinecraftWrapper.INSTANCE; private static final WrapperFactory FACTORY = WrapperFactory.INSTANCE; @Override @@ -148,56 +140,24 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper * This method returns the ChunkPos of all chunks that Minecraft * is going to render this frame.

*

- * Note: This isn't perfect. It will return some chunks that are outside - * the clipping plane. (For example, if you are high above the ground some chunks - * will be incorrectly added, even though they are outside render range). */ - - //TODO: impl this properly + @Override public HashSet getVanillaRenderedChunks() { - LevelRenderer levelRenderer = MC.levelRenderer; - LinkedHashSet chunks = levelRenderer.renderChunkStorage.get().renderChunks; - //ClientApi.LOGGER.info("getVanillaRenderedChunks: "+chunks.size()); - return (chunks.stream().map((chunk) -> { - AABB chunkBoundingBox = chunk.chunk.bb; - return FACTORY.createChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16), - Math.floorDiv((int) chunkBoundingBox.minZ, 16)); - }).collect(Collectors.toCollection(HashSet::new))); - } - @Override - public HashSet getSodiumRenderedChunks() { - LevelRenderer levelRenderer = MC.levelRenderer; - LinkedHashSet chunks = levelRenderer.renderChunkStorage.get().renderChunks; - //ClientApi.LOGGER.info("gettSodiumRenderedChunks: "+chunks.size()); - return (chunks.stream().map((chunk) -> { - AABB chunkBoundingBox = chunk.chunk.bb; - return FACTORY.createChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16), - Math.floorDiv((int) chunkBoundingBox.minZ, 16)); - }).collect(Collectors.toCollection(HashSet::new))); - } - - - @Override - public HashSet getMaximumRenderedChunks() { - // For now, use a circle check - int chunkRenderDist = this.getRenderDistance(); - - AbstractChunkPosWrapper centerChunkPos = MC_WRAPPER.getPlayerChunkPos(); - - // add every position within render distance - HashSet renderedPos = new HashSet(); - for (int chunkDeltaX = -chunkRenderDist; chunkDeltaX <= chunkRenderDist; chunkDeltaX++) - { - for(int chunkDeltaZ = -chunkRenderDist; chunkDeltaZ <= chunkRenderDist; chunkDeltaZ++) - { - // The circle check using radius+1 because it seems to match the vanilla fog culled circle better - if (chunkDeltaX*chunkDeltaX+chunkDeltaZ*chunkDeltaZ >= (chunkRenderDist+1)*(chunkRenderDist+1)) continue; - renderedPos.add(FACTORY.createChunkPos(centerChunkPos.getX() + chunkDeltaX, centerChunkPos.getZ() + chunkDeltaZ)); - } + ISodiumAccessor sodium = ModAccessorApi.get(ISodiumAccessor.class); + if (sodium != null) { + return sodium.getNormalRenderedChunks(); } - return renderedPos; - } + LevelRenderer levelRenderer = MC.levelRenderer; + LinkedHashSet chunks = levelRenderer.renderChunkStorage.get().renderChunks; + return (chunks.stream().map((chunk) -> { + AABB chunkBoundingBox = chunk.chunk.bb; + return FACTORY.createChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16), + Math.floorDiv((int) chunkBoundingBox.minZ, 16)); + }).collect(Collectors.toCollection(HashSet::new))); + } + + @Override diff --git a/core b/core index 943a2d5ca..d1e1970c1 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 943a2d5cada3235e93ea73eacce412cc887136ed +Subproject commit d1e1970c180e3b0e82d0800782b2ea9e806eb5fc diff --git a/fabric/build.gradle b/fabric/build.gradle index 1cac1e445..b24f8d4ba 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,5 +1,7 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.0" + id 'fabric-loom' version '0.10-SNAPSHOT' + id "com.modrinth.minotaur" version "1.2.1" } loom { @@ -20,10 +22,20 @@ configurations { repositories { // Required for ModMenu maven { url "https://maven.terraformersmc.com/" } + + // Required for Sodium + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + content { + includeGroup "maven.modrinth" + } + } } dependencies { + // Fabric loader modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" // TODO: This is only for LodMain, try to find a way to remove it @@ -35,12 +47,22 @@ dependencies { exclude(group: "net.fabricmc.fabric-api") } + // Sodium + modImplementation "maven.modrinth:sodium:${project.sodium_version}" + implementation "org.joml:joml:1.10.2" + + // Iris +// modImplementation "maven.modrinth:iris:${project.iris_version}" + + + // Toml implementation("com.electronwill.night-config:toml:${rootProject.toml_version}") shadowMe("com.electronwill.night-config:toml:${rootProject.toml_version}") {} common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowMe(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } + // Compression common 'org.tukaani:xz:1.9' common 'org.apache.commons:commons-compress:1.21' shadowMe 'org.tukaani:xz:1.9' diff --git a/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java b/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java index 020f3954b..26d946d9d 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java @@ -69,6 +69,8 @@ public class ClientProxy */ public void registerEvents() { // TODO: Fix this if it's wrong + + /* Registor the mod accessor*/ /* World Events */ //ServerTickEvents.START_SERVER_TICK.register(this::serverTickEvent); diff --git a/fabric/src/main/java/com/seibel/lod/fabric/Main.java b/fabric/src/main/java/com/seibel/lod/fabric/Main.java index bc0765002..882a32bf2 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/Main.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/Main.java @@ -22,9 +22,13 @@ package com.seibel.lod.fabric; import com.seibel.lod.common.LodCommonMain; import com.seibel.lod.core.ModInfo; import com.seibel.lod.core.api.ClientApi; +import com.seibel.lod.core.api.ModAccessorApi; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; +import com.seibel.lod.fabric.modAccessor.SodiumAccessor; import com.seibel.lod.fabric.wrappers.DependencySetup; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.loader.api.FabricLoader; /** * Initialize and setup the Mod.
@@ -60,6 +64,9 @@ public class Main implements ClientModInitializer // Check if this works client_proxy = new ClientProxy(); client_proxy.registerEvents(); + if (FabricLoader.getInstance().isModLoaded("sodium")) { + ModAccessorApi.bind(ISodiumAccessor.class, new SodiumAccessor()); + } } public static void initServer() { diff --git a/fabric/src/main/java/com/seibel/lod/fabric/modAccessor/SodiumAccessor.java b/fabric/src/main/java/com/seibel/lod/fabric/modAccessor/SodiumAccessor.java new file mode 100644 index 000000000..689f5977f --- /dev/null +++ b/fabric/src/main/java/com/seibel/lod/fabric/modAccessor/SodiumAccessor.java @@ -0,0 +1,43 @@ +package com.seibel.lod.fabric.modAccessor; + +import java.util.HashSet; +import java.util.stream.Collectors; + +import com.seibel.lod.core.util.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory; +import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; + +import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.core.SectionPos; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; + +public class SodiumAccessor implements ISodiumAccessor { + IWrapperFactory factory = SingletonHandler.get(IWrapperFactory.class); + + @Override + public String getModName() { + return "Sodium-Fabric-1.18.X"; + } + + @Override + public HashSet getNormalRenderedChunks() { + SodiumWorldRenderer renderer = SodiumWorldRenderer.instance(); + LevelHeightAccessor height = Minecraft.getInstance().level; + // 0b11 = Lighted chunk & loaded chunk + return renderer.getChunkTracker().getChunks(0b11).filter( + (long l) -> { + for (int i = height.getMinSection(); i { + return (AbstractChunkPosWrapper)factory.createChunkPos(l); + }).collect(Collectors.toCollection(HashSet::new)); + } + +} diff --git a/gradle.properties b/gradle.properties index 9b79302c3..013ec4dc6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,8 +7,16 @@ mod_version=1.5.4a maven_group=com.seibel.lod toml_version=3.6.0 + +# Fabric loader fabric_loader_version=0.12.12 fabric_api_version=0.44.0+1.18 -modmenu_version=3.0.0 + # Fabric mods + modmenu_version=3.0.0 + sodium_version=mc1.18-0.4.0-alpha5 +# iris_version=1.18.x-v1.1.4 -forge_version=39.0.5 \ No newline at end of file +# Forge loader +forge_version=39.0.5 + # Forge mods + ## currentlly no mods ## \ No newline at end of file