diff --git a/build.gradle b/build.gradle index 6664b66..3a60fbd 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ repositories { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + mappings loom.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" // Fabric API. This is technically optional, but you probably want it anyway. diff --git a/src/main/java/rogo/renderingculling/api/ChunkCullingMap.java b/src/main/java/rogo/renderingculling/api/ChunkCullingMap.java index fc69c22..ec8df99 100644 --- a/src/main/java/rogo/renderingculling/api/ChunkCullingMap.java +++ b/src/main/java/rogo/renderingculling/api/ChunkCullingMap.java @@ -1,8 +1,8 @@ package rogo.renderingculling.api; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; import rogo.renderingculling.util.Vec2i; import java.util.HashMap; @@ -21,11 +21,11 @@ int delayCount() { @Override int bindFrameBufferId() { - return CullingHandler.CHUNK_CULLING_MAP_TARGET.fbo; + return CullingHandler.CHUNK_CULLING_MAP_TARGET.frameBufferId; } public int getPosIndex(BlockPos pos) { - int renderDistance = MinecraftClient.getInstance().options.getViewDistance(); + int renderDistance = Minecraft.getInstance().options.getEffectiveRenderDistance(); int spacePartitionSize = 2 * renderDistance + 1; int x = pos.getX() + renderDistance; int z = pos.getZ() + renderDistance; @@ -56,7 +56,7 @@ public void generateIndex(int renderDistance) { } public boolean isChunkVisible(BlockPos pos) { - Vec3d camera = MinecraftClient.getInstance().gameRenderer.getCamera().getPos(); + Vec3 camera = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); int cameraX = (int)camera.x >> 4; int cameraY = (int)camera.y/16; int cameraZ = (int)camera.z >> 4; @@ -68,7 +68,7 @@ public boolean isChunkVisible(BlockPos pos) { int chunkX = pos.getX() >> 4; int chunkY = pos.getY()/16 + CullingHandler.LEVEL_MIN_SECTION_ABS; int chunkZ = pos.getZ() >> 4; - pos = new BlockPos(chunkX, chunkY, chunkZ).subtract(cameraPos).withY(chunkY); + pos = new BlockPos(chunkX, chunkY, chunkZ).subtract(cameraPos).atY(chunkY); if(screenIndex.containsKey(pos)) { Integer index = screenIndex.get(pos); diff --git a/src/main/java/rogo/renderingculling/api/Config.java b/src/main/java/rogo/renderingculling/api/Config.java index 2ccfcf7..b5e1bbc 100644 --- a/src/main/java/rogo/renderingculling/api/Config.java +++ b/src/main/java/rogo/renderingculling/api/Config.java @@ -1,22 +1,44 @@ package rogo.renderingculling.api; -import io.github.fablabsmc.fablabs.api.fiber.v1.FiberId; +import io.github.fablabsmc.fablabs.api.fiber.v1.exception.ValueDeserializationException; import io.github.fablabsmc.fablabs.api.fiber.v1.schema.type.derived.ConfigTypes; +import io.github.fablabsmc.fablabs.api.fiber.v1.serialization.FiberSerialization; +import io.github.fablabsmc.fablabs.api.fiber.v1.serialization.JanksonValueSerializer; +import io.github.fablabsmc.fablabs.api.fiber.v1.tree.ConfigBranch; import io.github.fablabsmc.fablabs.api.fiber.v1.tree.ConfigTree; import io.github.fablabsmc.fablabs.api.fiber.v1.tree.PropertyMirror; +import net.minecraft.network.chat.TranslatableComponent; +import java.io.*; +import java.nio.file.*; import java.util.ArrayList; import java.util.List; public class Config { - public static PropertyMirror SAMPLING = PropertyMirror.create(ConfigTypes.DOUBLE); - public static PropertyMirror CULL_ENTITY = PropertyMirror.create(ConfigTypes.BOOLEAN); - public static PropertyMirror CULL_CHUNK = PropertyMirror.create(ConfigTypes.BOOLEAN); - public static PropertyMirror UPDATE_DELAY = PropertyMirror.create(ConfigTypes.INTEGER); - public static PropertyMirror CULLING_ENTITY_RATE = PropertyMirror.create(ConfigTypes.INTEGER); + private static PropertyMirror SAMPLING = PropertyMirror.create(ConfigTypes.DOUBLE); + public static double getSampling() { + return SAMPLING.getValue(); + } + private static PropertyMirror CULL_ENTITY = PropertyMirror.create(ConfigTypes.BOOLEAN); + private static PropertyMirror CULL_CHUNK = PropertyMirror.create(ConfigTypes.BOOLEAN); + private static PropertyMirror UPDATE_DELAY = PropertyMirror.create(ConfigTypes.INTEGER); + private static PropertyMirror CULLING_ENTITY_RATE = PropertyMirror.create(ConfigTypes.INTEGER); + + private static PropertyMirror> ENTITY_SKIP = PropertyMirror.create(ConfigTypes.makeList(ConfigTypes.STRING)); + private static PropertyMirror> BLOCK_ENTITY_SKIP = PropertyMirror.create(ConfigTypes.makeList(ConfigTypes.STRING)); - public static PropertyMirror> ENTITY_SKIP = PropertyMirror.create(ConfigTypes.makeList(ConfigTypes.STRING)); - public static PropertyMirror> BLOCK_ENTITY_SKIP = PropertyMirror.create(ConfigTypes.makeList(ConfigTypes.STRING)); + private static ConfigContext CONTEXT; + private static ConfigBranch BRANCH; + private static String getTranslatedItem(String s) { + String Translated = new TranslatableComponent(s).getString(); + return Translated; + } + + public static void save() { + if(CONTEXT != null) { + writeConfig(CONTEXT); + } + } public static void init() { List entityList = new ArrayList<>(); @@ -25,38 +47,59 @@ public static void init() { List blockList = new ArrayList<>(); blockList.add("minecraft:beacon"); - ConfigTree.builder() - .withValue("Sampling multiple", ConfigTypes.DOUBLE.withValidRange(0.0, 1.0, 0.01), 0.2) - .beginValue("multiple", ConfigTypes.DOUBLE, 0.2) + BRANCH = ConfigTree.builder() + .beginValue(getTranslatedItem("brute_force_rendering_culling.sampler"), ConfigTypes.DOUBLE.withValidRange(0.0, 1.0, 0.01), 0.2) .finishValue(SAMPLING::mirror) - .withValue("Culling Map update delay", ConfigTypes.INTEGER.withValidRange(0, 10, 1), 1) - .beginValue("delay frame", ConfigTypes.INTEGER, 1) + .beginValue(getTranslatedItem("brute_force_rendering_culling.culling_map_update_delay"), ConfigTypes.INTEGER, 1) .finishValue(UPDATE_DELAY::mirror) - .withValue("Cull entity", ConfigTypes.BOOLEAN, true) - .beginValue("enable cull entity", ConfigTypes.BOOLEAN, true) + .beginValue(getTranslatedItem("brute_force_rendering_culling.cull_entity"), ConfigTypes.BOOLEAN, true) .finishValue(CULL_ENTITY::mirror) - .withValue("Cull chunk", ConfigTypes.BOOLEAN, true) - .beginValue("enable cull chunk", ConfigTypes.BOOLEAN, true) + .beginValue(getTranslatedItem("brute_force_rendering_culling.cull_chunk"), ConfigTypes.BOOLEAN, true) .finishValue(CULL_CHUNK::mirror) - .withValue("Culling entity update frequency", ConfigTypes.INTEGER.withValidRange(0, 20, 1), 20) - .beginValue("frequency", ConfigTypes.INTEGER, 20) + .beginValue(getTranslatedItem("brute_force_rendering_culling.culling_entity_update_rate"), ConfigTypes.INTEGER, 20) .finishValue(CULLING_ENTITY_RATE::mirror) - .withValue("Entity skip CULLING", ConfigTypes.makeList(ConfigTypes.STRING), entityList) - .withComment("Entity that skip CULLING, example: \n" + + .beginValue(getTranslatedItem("brute_force_rendering_culling.skip_culling_entities"), ConfigTypes.makeList(ConfigTypes.STRING), entityList) + .withComment("Example: \n" + "[\"minecraft:creeper\", \"minecraft:zombie\"]") - .beginValue("Entity ResourceLocation", ConfigTypes.makeList(ConfigTypes.STRING), entityList) .finishValue(ENTITY_SKIP::mirror) - .withValue("Block Entity skip CULLING", ConfigTypes.makeList(ConfigTypes.STRING), blockList) - .withComment("Block Entity that skip CULLING, example: \n" + + .beginValue(getTranslatedItem("brute_force_rendering_culling.skip_culling_block_entities"), ConfigTypes.makeList(ConfigTypes.STRING), blockList) + .withComment("Example: \n" + "[\"minecraft:chest\", \"minecraft:mob_spawner\"]") - .beginValue("Block Entity ResourceLocation", ConfigTypes.makeList(ConfigTypes.STRING), blockList) .finishValue(BLOCK_ENTITY_SKIP::mirror) .build(); } + + public static void loadConfig() { + try { + Files.createDirectory(Paths.get("config")); + } catch (IOException ignored) { + } + JanksonValueSerializer serializer = new JanksonValueSerializer(false); + CONTEXT = new ConfigContext(BRANCH, Paths.get("config", CullingHandler.MOD_ID + ".json"), serializer); + setupConfig(CONTEXT); + } + + private static void writeConfig(ConfigContext context) { + try (OutputStream s = new BufferedOutputStream(Files.newOutputStream(context.path, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW))) { + FiberSerialization.serialize(context.config, s, context.serializer); + } catch (IOException ignored) { + } + } + + private static void setupConfig(ConfigContext context) { + writeConfig(context); + + try (InputStream s = new BufferedInputStream(Files.newInputStream(context.path, StandardOpenOption.READ, StandardOpenOption.CREATE))) { + FiberSerialization.deserialize(context.config, s, context.serializer); + } catch (IOException | ValueDeserializationException ignored) { + } + } + + public record ConfigContext(ConfigTree config, Path path, JanksonValueSerializer serializer){} } diff --git a/src/main/java/rogo/renderingculling/api/CullingHandler.java b/src/main/java/rogo/renderingculling/api/CullingHandler.java index 6585887..83a75e3 100644 --- a/src/main/java/rogo/renderingculling/api/CullingHandler.java +++ b/src/main/java/rogo/renderingculling/api/CullingHandler.java @@ -1,28 +1,34 @@ package rogo.renderingculling.api; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.pipeline.TextureTarget; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; import com.mojang.logging.LogUtils; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.SimpleFramebuffer; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.render.*; -import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.Window; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.math.*; -import net.minecraft.world.World; +import net.minecraft.client.Camera; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import org.lwjgl.glfw.GLFW; import org.slf4j.Logger; import rogo.renderingculling.event.WorldUnloadEvent; @@ -34,6 +40,7 @@ import java.io.IOException; import java.lang.reflect.Field; import java.util.*; +import java.util.function.Consumer; import java.util.function.Supplier; import static org.lwjgl.opengl.GL11.GL_TEXTURE; @@ -50,22 +57,25 @@ public class CullingHandler implements ModInitializer { public static Matrix4f PROJECTION_MATRIX = new Matrix4f(); static { - PROJECTION_MATRIX.loadIdentity(); + PROJECTION_MATRIX.setIdentity(); } - public static Framebuffer DEPTH_BUFFER_TARGET; - public static Framebuffer MONOCHROME_DEPTH_TARGET; - public static Framebuffer CHUNK_CULLING_MAP_TARGET; - public static Framebuffer ENTITY_CULLING_MAP_TARGET; - public static Shader CHUNK_CULLING_SHADER; - public static Shader LINEARIZE_DEPTH_SHADER; - public static Shader COPY_DEPTH_SHADER; - public static Shader INSTANCED_ENTITY_CULLING_SHADER; + public static final int depthSize = 4; + public static int DEPTH_INDEX; + public static int MAIN_DEPTH_TEXTURE = 0; + public static RenderTarget[] DEPTH_BUFFER_TARGET = new RenderTarget[depthSize]; + public static RenderTarget MONOCHROME_DEPTH_TARGET; + public static RenderTarget CHUNK_CULLING_MAP_TARGET; + public static RenderTarget ENTITY_CULLING_MAP_TARGET; + public static ShaderInstance CHUNK_CULLING_SHADER; + public static ShaderInstance LINEARIZE_DEPTH_SHADER; + public static ShaderInstance COPY_DEPTH_SHADER; + public static ShaderInstance INSTANCED_ENTITY_CULLING_SHADER; public static Frustum FRUSTUM; public static boolean updatingDepth; public static boolean applyFrustum; public boolean DEBUG = false; - public static int DEPTH_TEXTURE; + public static int[] DEPTH_TEXTURE = new int[depthSize]; public static ShaderLoader SHADER_LOADER = null; public static Class OptiFine = null; @@ -99,23 +109,27 @@ public class CullingHandler implements ModInitializer { public int cullingInitCount = 0; public int preCullingInitCount = 0; public boolean checkCulling = false; + public boolean checkTexture = false; private boolean usingShader = false; private String shaderName = ""; protected static int LEVEL_HEIGHT_OFFSET; protected static int LEVEL_MIN_SECTION_ABS; - public static Camera camera; + public static Camera CAMERA; private static final HashMap SHADER_DEPTH_BUFFER_ID = new HashMap<>(); - public static boolean loadShader = false; + public static boolean SHADER_ENABLED = false; + public boolean configLoaded = false; static { RenderSystem.recordRenderCall(() -> { - DEPTH_BUFFER_TARGET = new SimpleFramebuffer(MinecraftClient.getInstance().getWindow().getWidth(), MinecraftClient.getInstance().getWindow().getHeight(), false, MinecraftClient.IS_SYSTEM_MAC); - DEPTH_BUFFER_TARGET.setClearColor(0.0F, 0.0F, 0.0F, 0.0F); - CHUNK_CULLING_MAP_TARGET = new SimpleFramebuffer(MinecraftClient.getInstance().getWindow().getWidth(), MinecraftClient.getInstance().getWindow().getHeight(), false, MinecraftClient.IS_SYSTEM_MAC); + for(int i = 0; i < DEPTH_BUFFER_TARGET.length; ++i) { + DEPTH_BUFFER_TARGET[i] = new TextureTarget(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight(), false, Minecraft.ON_OSX); + DEPTH_BUFFER_TARGET[i].setClearColor(0.0F, 0.0F, 0.0F, 0.0F); + } + CHUNK_CULLING_MAP_TARGET = new TextureTarget(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight(), false, Minecraft.ON_OSX); CHUNK_CULLING_MAP_TARGET.setClearColor(0.0F, 0.0F, 0.0F, 0.0F); - MONOCHROME_DEPTH_TARGET = new SimpleFramebuffer(MinecraftClient.getInstance().getWindow().getWidth(), MinecraftClient.getInstance().getWindow().getHeight(), false, MinecraftClient.IS_SYSTEM_MAC); + MONOCHROME_DEPTH_TARGET = new TextureTarget(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight(), false, Minecraft.ON_OSX); MONOCHROME_DEPTH_TARGET.setClearColor(0.0F, 0.0F, 0.0F, 0.0F); - ENTITY_CULLING_MAP_TARGET = new SimpleFramebuffer(MinecraftClient.getInstance().getWindow().getWidth(), MinecraftClient.getInstance().getWindow().getHeight(), false, MinecraftClient.IS_SYSTEM_MAC); + ENTITY_CULLING_MAP_TARGET = new TextureTarget(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight(), false, Minecraft.ON_OSX); ENTITY_CULLING_MAP_TARGET.setClearColor(0.0F, 0.0F, 0.0F, 0.0F); }); } @@ -163,12 +177,11 @@ private void registerShader() { private void initShader() { LOGGER.debug("try init shader chunk_culling"); try { - loadShader = true; - CHUNK_CULLING_SHADER = new Shader(MinecraftClient.getInstance().getResourceManager(), fromID("chunk_culling"), VertexFormats.POSITION); - LINEARIZE_DEPTH_SHADER = new Shader(MinecraftClient.getInstance().getResourceManager(), fromID("linearize_depth"), VertexFormats.POSITION); - INSTANCED_ENTITY_CULLING_SHADER = new Shader(MinecraftClient.getInstance().getResourceManager(), fromID("instanced_entity_culling"), VertexFormats.POSITION); - COPY_DEPTH_SHADER = new Shader(MinecraftClient.getInstance().getResourceManager(), fromID("copy_depth"), VertexFormats.POSITION); - loadShader = false; + SHADER_ENABLED = true; + CHUNK_CULLING_SHADER = new ShaderInstance(Minecraft.getInstance().getResourceManager(), fromID("chunk_culling"), DefaultVertexFormat.POSITION); + INSTANCED_ENTITY_CULLING_SHADER = new ShaderInstance(Minecraft.getInstance().getResourceManager(), fromID("instanced_entity_culling"), DefaultVertexFormat.POSITION); + COPY_DEPTH_SHADER = new ShaderInstance(Minecraft.getInstance().getResourceManager(), fromID("copy_depth"), DefaultVertexFormat.POSITION); + SHADER_ENABLED = false; } catch (IOException e) { throw new RuntimeException(e); } @@ -178,15 +191,15 @@ public static String fromID(String s) { return MOD_ID + ":" + s; } - public static final KeyBinding CONFIG_KEY = KeyBindingHelper.registerKeyBinding( - new KeyBinding(MOD_ID + ".key.config", - InputUtil.Type.KEYSYM, + public static final KeyMapping CONFIG_KEY = KeyBindingHelper.registerKeyBinding( + new KeyMapping(MOD_ID + ".key.config", + InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_R, "key.category." + MOD_ID)); - public static final KeyBinding DEBUG_KEY = KeyBindingHelper.registerKeyBinding( - new KeyBinding(MOD_ID + ".key.debug", - InputUtil.Type.KEYSYM, + public static final KeyMapping DEBUG_KEY = KeyBindingHelper.registerKeyBinding( + new KeyMapping(MOD_ID + ".key.debug", + InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_X, "key.category." + MOD_ID)); @@ -195,24 +208,28 @@ private void registerEvents() { ClientTickEvents.START_CLIENT_TICK.register(this::onStartClientTick); } - private void onWorldUnload(World world) { - if(world == MinecraftClient.getInstance().world) { + private void onWorldUnload(Level world) { + if(world == Minecraft.getInstance().level) { cleanup(); } } - private void onStartClientTick(MinecraftClient client) { - if (client.player != null && client.world != null) { + private void onStartClientTick(Minecraft client) { + if (client.player != null && client.level != null) { + if(!configLoaded) { + Config.loadConfig(); + configLoaded = true; + } clientTickCount++; if (clientTickCount > 200 && CHUNK_CULLING_MAP != null && !CHUNK_CULLING_MAP.isDone()) { CHUNK_CULLING_MAP.setDone(); - LEVEL_HEIGHT_OFFSET = client.world.getTopSectionCoord() - client.world.getBottomSectionCoord(); - LEVEL_MIN_SECTION_ABS = Math.abs(client.world.getBottomSectionCoord()); + LEVEL_HEIGHT_OFFSET = client.level.getMaxSection() - client.level.getMinSection(); + LEVEL_MIN_SECTION_ABS = Math.abs(client.level.getMinSection()); } - if (CONFIG_KEY.wasPressed()) { - client.setScreen(new ConfigScreen(new TranslatableText(MOD_ID + ".config"))); + if (CONFIG_KEY.isDown()) { + client.setScreen(new ConfigScreen(new TranslatableComponent(MOD_ID + ".config"))); } - if (DEBUG_KEY.wasPressed()) { + if (DEBUG_KEY.isDown()) { DEBUG = !DEBUG; } } else { @@ -237,7 +254,7 @@ private void cleanup() { SHADER_DEPTH_BUFFER_ID.clear(); } - public boolean shouldRenderChunk(Box aabb) { + public boolean shouldRenderChunk(AABB aabb) { chunkCount++; if (!Config.CULL_CHUNK.getValue() || CHUNK_CULLING_MAP == null || !CHUNK_CULLING_MAP.isDone()) { return true; @@ -268,11 +285,11 @@ public boolean shouldRenderChunk(Box aabb) { return render; } - public boolean shouldSkipBlock(BlockEntity blockEntity, Box aabb, BlockPos pos) { + public boolean shouldSkipBlock(BlockEntity blockEntity, AABB aabb, BlockPos pos) { blockCount++; if (ENTITY_CULLING_MAP == null || !Config.CULL_ENTITY.getValue()) return false; if (FRUSTUM == null || !FRUSTUM.isVisible(aabb)) return true; - String type = BlockEntityType.getId(blockEntity.getType()).toString(); + String type = BlockEntityType.getKey(blockEntity.getType()).toString(); if (Config.BLOCK_ENTITY_SKIP.getValue().contains(type)) return false; @@ -304,9 +321,9 @@ public boolean shouldSkipBlock(BlockEntity blockEntity, Box aabb, BlockPos pos) public boolean shouldSkipEntity(Entity entity) { entityCount++; - if (entity instanceof PlayerEntity || entity.isGlowing()) return false; - if (entity.squaredDistanceTo(camera.getPos()) < 4) return false; - if (Config.ENTITY_SKIP.getValue().contains(entity.getType().getUntranslatedName())) + if (entity instanceof Player || entity.isCurrentlyGlowing()) return false; + if (entity.distanceToSqr(CAMERA.getPosition()) < 4) return false; + if (Config.ENTITY_SKIP.getValue().contains(entity.getType().getDescriptionId())) return false; if (ENTITY_CULLING_MAP == null || !Config.CULL_ENTITY.getValue()) return false; @@ -340,14 +357,14 @@ public void onProfilerPopPush(String s) { if (s.equals("afterRunTick")) { afterGameRender(); } else if (s.equals("captureFrustum")) { - AccessorLevelRender levelFrustum = (AccessorLevelRender) MinecraftClient.getInstance().worldRenderer; + AccessorLevelRender levelFrustum = (AccessorLevelRender) Minecraft.getInstance().levelRenderer; Frustum frustum; if (levelFrustum.getCapturedFrustum() != null) { frustum = levelFrustum.getCapturedFrustum(); } else { frustum = levelFrustum.getCullingFrustum(); } - CullingHandler.FRUSTUM = new Frustum(frustum).method_38557(32); + CullingHandler.FRUSTUM = new Frustum(frustum).offsetToFullyIncludeCameraCube(32); this.beforeRenderingWorld(); } else if (s.equals("terrain_setup")) { applyFrustum = true; @@ -371,7 +388,7 @@ public void onProfilerPush(String s) { chunkCulling = 0; } } else if (s.equals("center")) { - camera = MinecraftClient.getInstance().gameRenderer.getCamera(); + CAMERA = Minecraft.getInstance().gameRenderer.getMainCamera(); int tick = clientTickCount % 20; nextTick = new boolean[20]; @@ -473,18 +490,20 @@ public void beforeRenderingWorld() { public void afterRenderingWorld() { if (anyCulling() && !checkCulling) { - float scale = (float) (double) Config.SAMPLING.getValue(); - Window window = MinecraftClient.getInstance().getWindow(); + float sampling = (float) (double) Config.SAMPLING.getValue(); + Window window = Minecraft.getInstance().getWindow(); int width = window.getWidth(); int height = window.getHeight(); - int scaleWidth = Math.max(1, (int) (width * scale)); - int scaleHeight = Math.max(1, (int) (height * scale)); - if (DEPTH_BUFFER_TARGET.textureWidth != scaleWidth || DEPTH_BUFFER_TARGET.textureHeight != scaleHeight) { - DEPTH_BUFFER_TARGET.resize(scaleWidth, scaleHeight, MinecraftClient.IS_SYSTEM_MAC); - } + runOnDepthFrame((depthContext) -> { + int scaleWidth = Math.max(1, (int) (width * sampling * depthContext.scale())); + int scaleHeight = Math.max(1, (int) (height * sampling * depthContext.scale())); + if (depthContext.frame().width != scaleWidth || depthContext.frame().height != scaleHeight) { + depthContext.frame().resize(scaleWidth, scaleHeight, Minecraft.ON_OSX); + } + }); - int depthTexture = MinecraftClient.getInstance().getFramebuffer().getDepthAttachment(); + int depthTexture = Minecraft.getInstance().getMainRenderTarget().getDepthTextureId(); if (SHADER_LOADER != null && SHADER_LOADER.renderingShader()) { if(!SHADER_DEPTH_BUFFER_ID.containsKey(SHADER_LOADER.getFrameBufferID())) { RenderSystem.assertOnRenderThreadOrInit(); @@ -505,26 +524,30 @@ public void afterRenderingWorld() { } } - useShader(CullingHandler.COPY_DEPTH_SHADER); - CullingHandler.DEPTH_BUFFER_TARGET.clear(MinecraftClient.IS_SYSTEM_MAC); - CullingHandler.DEPTH_BUFFER_TARGET.beginWrite(false); - Tessellator tesselator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tesselator.getBuffer(); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION); - bufferbuilder.vertex(-1.0f, -1.0f, 0.0f).next(); - bufferbuilder.vertex(1.0f, -1.0f, 0.0f).next(); - bufferbuilder.vertex(1.0f, 1.0f, 0.0f).next(); - bufferbuilder.vertex(-1.0f, 1.0f, 0.0f).next(); - RenderSystem.setShaderTexture(0, depthTexture); - tesselator.draw(); - DEPTH_TEXTURE = DEPTH_BUFFER_TARGET.getColorAttachment(); - - MatrixStack matrices = new MatrixStack(); - matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(camera.getPitch())); - matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(camera.getYaw() + 180.0F)); - Vec3d cameraPos = camera.getPos(); - matrices.translate((float) -cameraPos.x, (float) -cameraPos.y, (float) -cameraPos.z); - VIEW_MATRIX = matrices.peek().getPositionMatrix().copy(); + MAIN_DEPTH_TEXTURE = depthTexture; + + runOnDepthFrame((depthContext) -> { + useShader(CullingHandler.COPY_DEPTH_SHADER); + depthContext.frame().clear(Minecraft.ON_OSX); + depthContext.frame().bindWrite(false); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); + bufferbuilder.vertex(-1.0f, -1.0f, 0.0f).endVertex(); + bufferbuilder.vertex(1.0f, -1.0f, 0.0f).endVertex(); + bufferbuilder.vertex(1.0f, 1.0f, 0.0f).endVertex(); + bufferbuilder.vertex(-1.0f, 1.0f, 0.0f).endVertex(); + RenderSystem.setShaderTexture(0, depthContext.lastTexture()); + tesselator.end(); + DEPTH_TEXTURE[depthContext.index()] = depthContext.frame().getColorTextureId(); + }); + + PoseStack viewMatrix = new PoseStack(); + viewMatrix.mulPose(Vector3f.XP.rotationDegrees(CAMERA.getXRot())); + viewMatrix.mulPose(Vector3f.YP.rotationDegrees(CAMERA.getYRot() + 180.0F)); + Vec3 cameraPos = CAMERA.getPosition(); + viewMatrix.translate((float) -cameraPos.x, (float) -cameraPos.y, (float) -cameraPos.z); + VIEW_MATRIX = viewMatrix.last().pose().copy(); } } @@ -533,22 +556,22 @@ public void afterGameRender() { preCullingInitCount++; if(Config.CULL_CHUNK.getValue()) { - int renderingDiameter = MinecraftClient.getInstance().options.getViewDistance() * 2 + 1; + int renderingDiameter = Minecraft.getInstance().options.getEffectiveRenderDistance() * 2 + 1; int maxSize = renderingDiameter * LEVEL_HEIGHT_OFFSET * renderingDiameter; int cullingSize = (int) Math.sqrt(maxSize) + 1; - if (CHUNK_CULLING_MAP_TARGET.textureWidth != cullingSize || CHUNK_CULLING_MAP_TARGET.textureHeight != cullingSize) { - CHUNK_CULLING_MAP_TARGET.resize(cullingSize, cullingSize, MinecraftClient.IS_SYSTEM_MAC); + if (CHUNK_CULLING_MAP_TARGET.width != cullingSize || CHUNK_CULLING_MAP_TARGET.height != cullingSize) { + CHUNK_CULLING_MAP_TARGET.resize(cullingSize, cullingSize, Minecraft.ON_OSX); if (CHUNK_CULLING_MAP != null) { CHUNK_CULLING_MAP.cleanup(); - CHUNK_CULLING_MAP = new ChunkCullingMap(CHUNK_CULLING_MAP_TARGET.textureWidth, CHUNK_CULLING_MAP_TARGET.textureHeight); - CHUNK_CULLING_MAP.generateIndex(MinecraftClient.getInstance().options.getViewDistance()); + CHUNK_CULLING_MAP = new ChunkCullingMap(CHUNK_CULLING_MAP_TARGET.width, CHUNK_CULLING_MAP_TARGET.height); + CHUNK_CULLING_MAP.generateIndex(Minecraft.getInstance().options.getEffectiveRenderDistance()); } } if (CHUNK_CULLING_MAP == null) { - CHUNK_CULLING_MAP = new ChunkCullingMap(CHUNK_CULLING_MAP_TARGET.textureWidth, CHUNK_CULLING_MAP_TARGET.textureHeight); - CHUNK_CULLING_MAP.generateIndex(MinecraftClient.getInstance().options.getViewDistance()); + CHUNK_CULLING_MAP = new ChunkCullingMap(CHUNK_CULLING_MAP_TARGET.width, CHUNK_CULLING_MAP_TARGET.height); + CHUNK_CULLING_MAP.generateIndex(Minecraft.getInstance().options.getEffectiveRenderDistance()); } long time = System.nanoTime(); @@ -558,17 +581,17 @@ public void afterGameRender() { if(Config.CULL_ENTITY.getValue()) { if (ENTITY_CULLING_MAP == null) { - ENTITY_CULLING_MAP = new EntityCullingMap(ENTITY_CULLING_MAP_TARGET.textureWidth, ENTITY_CULLING_MAP_TARGET.textureHeight); + ENTITY_CULLING_MAP = new EntityCullingMap(ENTITY_CULLING_MAP_TARGET.width, ENTITY_CULLING_MAP_TARGET.height); } int tableCapacity = CullingHandler.ENTITY_CULLING_MAP.getEntityTable().size()/64; tableCapacity = tableCapacity*64+64; int cullingSize = (int) Math.sqrt(tableCapacity)+1; - if(CullingHandler.ENTITY_CULLING_MAP_TARGET.textureWidth != cullingSize || CullingHandler.ENTITY_CULLING_MAP_TARGET.textureHeight != cullingSize) { - CullingHandler.ENTITY_CULLING_MAP_TARGET.resize(cullingSize, cullingSize, MinecraftClient.IS_SYSTEM_MAC); + if(CullingHandler.ENTITY_CULLING_MAP_TARGET.width != cullingSize || CullingHandler.ENTITY_CULLING_MAP_TARGET.height != cullingSize) { + CullingHandler.ENTITY_CULLING_MAP_TARGET.resize(cullingSize, cullingSize, Minecraft.ON_OSX); if (ENTITY_CULLING_MAP != null) { EntityCullingMap temp = ENTITY_CULLING_MAP; - ENTITY_CULLING_MAP = new EntityCullingMap(ENTITY_CULLING_MAP_TARGET.textureWidth, ENTITY_CULLING_MAP_TARGET.textureHeight); + ENTITY_CULLING_MAP = new EntityCullingMap(ENTITY_CULLING_MAP_TARGET.width, ENTITY_CULLING_MAP_TARGET.height); ENTITY_CULLING_MAP.getEntityTable().copyTemp(temp.getEntityTable(), clientTickCount); temp.cleanup(); } @@ -578,12 +601,12 @@ public void afterGameRender() { ENTITY_CULLING_MAP.transferData(); preEntityCullingInitTime += System.nanoTime() - time; - if(MinecraftClient.getInstance().world != null) { + if(Minecraft.getInstance().level != null) { CullingHandler.ENTITY_CULLING_MAP.getEntityTable().tick(clientTickCount); - Iterable entities = MinecraftClient.getInstance().world.getEntities(); + Iterable entities = Minecraft.getInstance().level.entitiesForRendering(); entities.forEach(entity -> CullingHandler.ENTITY_CULLING_MAP.getEntityTable().addObject(entity)); - for(Object levelrenderer$renderchunkinfo : ((IEntitiesForRender)MinecraftClient.getInstance().worldRenderer).renderChunksInFrustum()) { - List list = ((IRenderChunkInfo)levelrenderer$renderchunkinfo).getRenderChunk().getData().getBlockEntities(); + for(Object levelrenderer$renderchunkinfo : ((IEntitiesForRender)Minecraft.getInstance().levelRenderer).renderChunksInFrustum()) { + List list = ((IRenderChunkInfo)levelrenderer$renderchunkinfo).getRenderChunk().getCompiledChunk().getRenderableBlockEntities(); list.forEach(entity -> CullingHandler.ENTITY_CULLING_MAP.getEntityTable().addObject(entity)); } @@ -591,7 +614,7 @@ public void afterGameRender() { } } - fps = ((AccessorMinecraft) MinecraftClient.getInstance()).getFps(); + fps = ((AccessorMinecraft) Minecraft.getInstance()).getFps(); } else { if (ENTITY_CULLING_MAP != null) { ENTITY_CULLING_MAP.cleanup(); @@ -604,7 +627,7 @@ public void afterGameRender() { } } - public static void useShader(Shader instance) { + public static void useShader(ShaderInstance instance) { RenderSystem.setShader(()-> instance); } @@ -612,10 +635,25 @@ public static void bindMainFrameTarget() { if(SHADER_LOADER != null && SHADER_LOADER.renderingShader()) { SHADER_LOADER.bindDefaultFrameBuffer(); } else { - MinecraftClient.getInstance().getFramebuffer().beginWrite(true); + Minecraft.getInstance().getMainRenderTarget().bindWrite(true); + } + } + + public static void runOnDepthFrame(Consumer consumer) { + float f = 1.0f; + for (DEPTH_INDEX = 0; DEPTH_INDEX < DEPTH_BUFFER_TARGET.length; ++DEPTH_INDEX) { + int lastTexture = DEPTH_INDEX == 0 ? MAIN_DEPTH_TEXTURE : DEPTH_BUFFER_TARGET[DEPTH_INDEX-1].getColorTextureId(); + consumer.accept(new DepthContext(DEPTH_BUFFER_TARGET[DEPTH_INDEX], DEPTH_INDEX, f, lastTexture)); + f *= 0.3f; } } + public static void callDepthTexture() { + CullingHandler.runOnDepthFrame((depthContext) -> { + RenderSystem.setShaderTexture(depthContext.index(), CullingHandler.DEPTH_TEXTURE[depthContext.index()]); + }); + } + public boolean renderingOculus() { return SHADER_LOADER != null && OptiFine == null && SHADER_LOADER.renderingShader(); } diff --git a/src/main/java/rogo/renderingculling/api/CullingRenderEvent.java b/src/main/java/rogo/renderingculling/api/CullingRenderEvent.java index 14cc1d2..0a6f74f 100644 --- a/src/main/java/rogo/renderingculling/api/CullingRenderEvent.java +++ b/src/main/java/rogo/renderingculling/api/CullingRenderEvent.java @@ -2,15 +2,15 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Vector4f; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.*; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vector4f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.phys.Vec3; import rogo.renderingculling.instanced.EntityCullingInstanceRenderer; import rogo.renderingculling.mixin.AccessorFrustum; @@ -30,18 +30,18 @@ public class CullingRenderEvent { HudRenderCallback.EVENT.register((matrixStack, tickDelta) -> INSTANCE.onOverlayRender(matrixStack, tickDelta)); } - public void onOverlayRender(MatrixStack matrixStack, float tickDelta ) { - if (MinecraftClient.getInstance().player == null) { + public void onOverlayRender(PoseStack matrixStack, float tickDelta ) { + if (Minecraft.getInstance().player == null) { return; } if (CullingHandler.INSTANCE.DEBUG) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - int width = minecraft.getWindow().getScaledWidth() / 2; - int height = (int) (minecraft.getWindow().getScaledHeight() / 2.5); + Minecraft minecraft = Minecraft.getInstance(); + int width = minecraft.getWindow().getGuiScaledWidth() / 2; + int height = 12; int widthScale = 80; - int heightScale = -minecraft.textRenderer.fontHeight * fontCount; + int heightScale = -minecraft.font.lineHeight * fontCount; fontCount = 0; if(CullingHandler.INSTANCE.fps == 0 ) { CullingHandler.INSTANCE.fps++; @@ -52,126 +52,132 @@ public void onOverlayRender(MatrixStack matrixStack, float tickDelta ) { } if (Config.CULL_CHUNK.getValue()) { - String cullingInitTime = new TranslatableText("brute_force_rendering_culling.chunk_culling_init").getString() + ": " + (CullingHandler.INSTANCE.chunkCullingInitTime /1000/CullingHandler.INSTANCE.cullingInitCount) + " μs"; + String cullingInitTime = new TranslatableComponent("brute_force_rendering_culling.chunk_culling_init").getString() + ": " + (CullingHandler.INSTANCE.chunkCullingInitTime /1000/CullingHandler.INSTANCE.cullingInitCount) + " μs"; drawString(cullingInitTime, width, height - heightScale); - String chunkCullingTime = new TranslatableText("brute_force_rendering_culling.chunk_culling_time").getString() + ": " + (CullingHandler.INSTANCE.chunkCullingTime/1000/CullingHandler.INSTANCE.fps) + " μs"; + String chunkCullingTime = new TranslatableComponent("brute_force_rendering_culling.chunk_culling_time").getString() + ": " + (CullingHandler.INSTANCE.chunkCullingTime/1000/CullingHandler.INSTANCE.fps) + " μs"; drawString(chunkCullingTime, width, height - heightScale); } - String chunkCulling = new TranslatableText("brute_force_rendering_culling.chunk_culling").getString() + ": " + CullingHandler.INSTANCE.chunkCulling + " / " + CullingHandler.INSTANCE.chunkCount; + String chunkCulling = new TranslatableComponent("brute_force_rendering_culling.chunk_culling").getString() + ": " + CullingHandler.INSTANCE.chunkCulling + " / " + CullingHandler.INSTANCE.chunkCount; drawString(chunkCulling, width, height - heightScale); if (Config.CULL_ENTITY.getValue()) { - String initTime = new TranslatableText("brute_force_rendering_culling.entity_culling_init").getString() + ": " + (CullingHandler.INSTANCE.entityCullingInitTime /1000/CullingHandler.INSTANCE.cullingInitCount) + " μs"; + String initTime = new TranslatableComponent("brute_force_rendering_culling.entity_culling_init").getString() + ": " + (CullingHandler.INSTANCE.entityCullingInitTime /1000/CullingHandler.INSTANCE.cullingInitCount) + " μs"; drawString(initTime, width, height - heightScale); - String blockCullingTime = new TranslatableText("brute_force_rendering_culling.block_culling_time").getString() + ": " + (CullingHandler.INSTANCE.blockCullingTime/1000/CullingHandler.INSTANCE.fps) + " μs"; + String blockCullingTime = new TranslatableComponent("brute_force_rendering_culling.block_culling_time").getString() + ": " + (CullingHandler.INSTANCE.blockCullingTime/1000/CullingHandler.INSTANCE.fps) + " μs"; drawString(blockCullingTime, width, height - heightScale); - String blockCulling = new TranslatableText("brute_force_rendering_culling.block_culling").getString() + ": " + CullingHandler.INSTANCE.blockCulling + " / " + CullingHandler.INSTANCE.blockCount; + String blockCulling = new TranslatableComponent("brute_force_rendering_culling.block_culling").getString() + ": " + CullingHandler.INSTANCE.blockCulling + " / " + CullingHandler.INSTANCE.blockCount; drawString(blockCulling, width, height - heightScale); - String entityCullingTime = new TranslatableText("brute_force_rendering_culling.entity_culling_time").getString() + ": " + (CullingHandler.INSTANCE.entityCullingTime/1000/CullingHandler.INSTANCE.fps) + " μs"; + String entityCullingTime = new TranslatableComponent("brute_force_rendering_culling.entity_culling_time").getString() + ": " + (CullingHandler.INSTANCE.entityCullingTime/1000/CullingHandler.INSTANCE.fps) + " μs"; drawString(entityCullingTime, width, height - heightScale); - String entityCulling = new TranslatableText("brute_force_rendering_culling.entity_culling").getString() + ": " + CullingHandler.INSTANCE.entityCulling + " / " + CullingHandler.INSTANCE.entityCount; + String entityCulling = new TranslatableComponent("brute_force_rendering_culling.entity_culling").getString() + ": " + CullingHandler.INSTANCE.entityCulling + " / " + CullingHandler.INSTANCE.entityCount; drawString(entityCulling, width, height - heightScale); } - String Sampler = new TranslatableText("brute_force_rendering_culling.sampler").getString() + ": " + String.valueOf((Float.parseFloat(String.format("%.0f", Config.SAMPLING.getValue() * 100.0D))) + "%"); + String Sampler = new TranslatableComponent("brute_force_rendering_culling.sampler").getString() + ": " + String.valueOf((Float.parseFloat(String.format("%.0f", Config.SAMPLING.getValue() * 100.0D))) + "%"); drawString(Sampler, width, height - heightScale); - String cull_chunk = new TranslatableText("brute_force_rendering_culling.cull_chunk").getString() + ": " - + (Config.CULL_CHUNK.getValue() ? new TranslatableText("brute_force_rendering_culling.enable").getString() : new TranslatableText("brute_force_rendering_culling.disable").getString()); + String cull_chunk = new TranslatableComponent("brute_force_rendering_culling.cull_chunk").getString() + ": " + + (Config.CULL_CHUNK.getValue() ? new TranslatableComponent("brute_force_rendering_culling.enable").getString() : new TranslatableComponent("brute_force_rendering_culling.disable").getString()); drawString(cull_chunk, width, height - heightScale); - String cull = new TranslatableText("brute_force_rendering_culling.cull_entity").getString() + ": " - + (Config.CULL_ENTITY.getValue() ? new TranslatableText("brute_force_rendering_culling.enable").getString() : new TranslatableText("brute_force_rendering_culling.disable").getString()); + String cull = new TranslatableComponent("brute_force_rendering_culling.cull_entity").getString() + ": " + + (Config.CULL_ENTITY.getValue() ? new TranslatableComponent("brute_force_rendering_culling.enable").getString() : new TranslatableComponent("brute_force_rendering_culling.disable").getString()); drawString(cull, width, height - heightScale); - int index = MinecraftClient.getInstance().fpsDebugString.indexOf("fps"); + int index = Minecraft.getInstance().fpsString.indexOf("fps"); if (index != -1) { - String extractedString = MinecraftClient.getInstance().fpsDebugString.substring(0, index+3); + String extractedString = Minecraft.getInstance().fpsString.substring(0, index+3); String fps = "FPS: " + extractedString; drawString(fps, width, height - heightScale); } - height -= heightScale - minecraft.textRenderer.fontHeight; + height -= heightScale - minecraft.font.lineHeight; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0f); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.DST_COLOR); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_COLOR); RenderSystem.setShader(GameRenderer::getPositionColorShader); - BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer(); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - bufferbuilder.vertex(width - widthScale, height, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); - bufferbuilder.vertex(width + widthScale, height, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); - bufferbuilder.vertex(width + widthScale, height + heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); - bufferbuilder.vertex(width - widthScale, height + heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(width - widthScale, height, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); + bufferbuilder.vertex(width + widthScale, height, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); + bufferbuilder.vertex(width + widthScale, height + heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); + bufferbuilder.vertex(width - widthScale, height + heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - bufferbuilder.vertex(width - widthScale - 2, height + 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); - bufferbuilder.vertex(width + widthScale + 2, height + 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); - bufferbuilder.vertex(width + widthScale + 2, height + heightScale - 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); - bufferbuilder.vertex(width - widthScale - 2, height + heightScale - 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); + BufferUploader.end(bufferbuilder); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(width - widthScale - 2, height + 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); + bufferbuilder.vertex(width + widthScale + 2, height + 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); + bufferbuilder.vertex(width + widthScale + 2, height + heightScale - 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); + bufferbuilder.vertex(width - widthScale - 2, height + heightScale - 2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); + BufferUploader.end(bufferbuilder); RenderSystem.defaultBlendFunc(); RenderSystem.disableBlend(); - if(!CullingHandler.anyCulling()) + if(!CullingHandler.INSTANCE.checkTexture) return; - Tessellator tessellator = Tessellator.getInstance(); - height = (int) (minecraft.getWindow().getScaledHeight()*0.25f); - width = (int) (minecraft.getWindow().getScaledWidth()*0.25f); - RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR); - bufferbuilder.vertex(0.0D, minecraft.getWindow().getScaledHeight(), 0.0D).texture(0.0F, 0.0F).color(255, 255, 255, 255).next(); - bufferbuilder.vertex(width, minecraft.getWindow().getScaledHeight(), 0.0D).texture(1, 0.0F).color(255, 255, 255, 255).next(); - bufferbuilder.vertex(width, minecraft.getWindow().getScaledHeight()-height, 0.0D).texture(1, 1).color(255, 255, 255, 255).next(); - bufferbuilder.vertex(0.0D, minecraft.getWindow().getScaledHeight()-height, 0.0D).texture(0.0F, 1).color(255, 255, 255, 255).next(); - RenderSystem.setShaderTexture(0, CullingHandler.DEPTH_TEXTURE); - RenderSystem.enableBlend(); - RenderSystem.depthMask(false); - RenderSystem.defaultBlendFunc(); - tessellator.draw(); - RenderSystem.depthMask(true); - RenderSystem.disableBlend(); + Tesselator tessellator = Tesselator.getInstance(); + float screenScale = 1.0f; + double windowScale = 0.4; + for(int i = 0; i < CullingHandler.DEPTH_BUFFER_TARGET.length; ++i) { + int scaledHeight = (int) (minecraft.getWindow().getGuiScaledHeight() * windowScale * screenScale); + int scaledWidth = (int) (minecraft.getWindow().getGuiScaledWidth() * windowScale * screenScale); + int offsetHeight = (int) ((1-screenScale)* 2 * minecraft.getWindow().getGuiScaledHeight() * windowScale); + RenderSystem.setShader(GameRenderer::getPositionTexColorShader); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + bufferbuilder.vertex(0.0D, minecraft.getWindow().getGuiScaledHeight()-offsetHeight, 0.0D).uv(0.0F, 0.0F).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex(scaledWidth, minecraft.getWindow().getGuiScaledHeight()-offsetHeight, 0.0D).uv(1, 0.0F).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex(scaledWidth, minecraft.getWindow().getGuiScaledHeight()-scaledHeight-offsetHeight, 0.0D).uv(1, 1).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex(0.0D, minecraft.getWindow().getGuiScaledHeight()-scaledHeight-offsetHeight, 0.0D).uv(0.0F, 1).color(255, 255, 255, 255).endVertex(); + RenderSystem.setShaderTexture(0, CullingHandler.DEPTH_TEXTURE[i]); + RenderSystem.enableBlend(); + RenderSystem.depthMask(false); + RenderSystem.defaultBlendFunc(); + tessellator.end(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + screenScale *= 0.5f; + } if(Config.CULL_ENTITY.getValue()) { - height = (int) (minecraft.getWindow().getScaledHeight()*0.25f); + height = (int) (minecraft.getWindow().getGuiScaledHeight()*0.25f); RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR); - bufferbuilder.vertex(0.0D, height, 0.0D).texture(0.0F, 0.0F).color(255, 255, 255, 255).next(); - bufferbuilder.vertex((double)height, height, 0.0D).texture(1, 0.0F).color(255, 255, 255, 255).next(); - bufferbuilder.vertex((double)height, 0, 0.0D).texture(1, 1).color(255, 255, 255, 255).next(); - bufferbuilder.vertex(0.0D, 0, 0.0D).texture(0.0F, 1).color(255, 255, 255, 255).next(); - RenderSystem.setShaderTexture(0, CullingHandler.ENTITY_CULLING_MAP_TARGET.getColorAttachment()); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + bufferbuilder.vertex(minecraft.getWindow().getGuiScaledWidth()-height, height, 0.0D).uv(0.0F, 0.0F).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex((double)minecraft.getWindow().getGuiScaledWidth(), height, 0.0D).uv(1, 0.0F).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex((double)minecraft.getWindow().getGuiScaledWidth(), 0, 0.0D).uv(1, 1).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex(minecraft.getWindow().getGuiScaledWidth()-height, 0, 0.0D).uv(0.0F, 1).color(255, 255, 255, 255).endVertex(); + RenderSystem.setShaderTexture(0, CullingHandler.ENTITY_CULLING_MAP_TARGET.getColorTextureId()); RenderSystem.enableBlend(); RenderSystem.depthMask(false); RenderSystem.defaultBlendFunc(); - tessellator.draw(); + tessellator.end(); RenderSystem.depthMask(true); RenderSystem.disableBlend(); } if(Config.CULL_CHUNK.getValue()) { - height = (int) (minecraft.getWindow().getScaledHeight()*0.25f); + height = (int) (minecraft.getWindow().getGuiScaledHeight()*0.25f); RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR); - bufferbuilder.vertex(0.0D, minecraft.getWindow().getScaledHeight()-height*1.5, 0.0D).texture(0.0F, 0.0F).color(255, 255, 255, 255).next(); - bufferbuilder.vertex((double)height, minecraft.getWindow().getScaledHeight()-height*1.5, 0.0D).texture(1, 0.0F).color(255, 255, 255, 255).next(); - bufferbuilder.vertex((double)height, (double)minecraft.getWindow().getScaledHeight()-height*2.5, 0.0D).texture(1, 1).color(255, 255, 255, 255).next(); - bufferbuilder.vertex(0.0D, (double)minecraft.getWindow().getScaledHeight()-height*2.5, 0.0D).texture(0.0F, 1).color(255, 255, 255, 255).next(); - RenderSystem.setShaderTexture(0, CullingHandler.CHUNK_CULLING_MAP_TARGET.getColorAttachment()); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + bufferbuilder.vertex(minecraft.getWindow().getGuiScaledWidth()-height, height*2, 0.0D).uv(0.0F, 0.0F).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex((double)minecraft.getWindow().getGuiScaledWidth(), height*2, 0.0D).uv(1, 0.0F).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex((double)minecraft.getWindow().getGuiScaledWidth(), height, 0.0D).uv(1, 1).color(255, 255, 255, 255).endVertex(); + bufferbuilder.vertex(minecraft.getWindow().getGuiScaledWidth()-height, height, 0.0D).uv(0.0F, 1).color(255, 255, 255, 255).endVertex(); + RenderSystem.setShaderTexture(0, CullingHandler.CHUNK_CULLING_MAP_TARGET.getColorTextureId()); RenderSystem.enableBlend(); RenderSystem.depthMask(false); RenderSystem.defaultBlendFunc(); - tessellator.draw(); + tessellator.end(); RenderSystem.depthMask(true); RenderSystem.disableBlend(); } @@ -179,8 +185,8 @@ public void onOverlayRender(MatrixStack matrixStack, float tickDelta ) { } public void drawString(String text, int width, int height) { - TextRenderer font = MinecraftClient.getInstance().textRenderer; - font.drawWithShadow(new MatrixStack(), text, width - (font.getWidth(text) / 2f), height - font.fontHeight * fontCount, 16777215); + Font font = Minecraft.getInstance().font; + font.drawShadow(new PoseStack(), text, width - (font.width(text) / 2f), height - font.lineHeight * fontCount, 16777215); fontCount++; } @@ -188,60 +194,45 @@ protected static void onUpdateCullingMap() { if(!CullingHandler.anyCulling()) return; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); - - CullingHandler.useShader(CullingHandler.LINEARIZE_DEPTH_SHADER); - if(CullingHandler.MONOCHROME_DEPTH_TARGET.textureWidth != CullingHandler.DEPTH_BUFFER_TARGET.textureWidth || CullingHandler.MONOCHROME_DEPTH_TARGET.textureHeight != CullingHandler.DEPTH_BUFFER_TARGET.textureHeight) { - CullingHandler.MONOCHROME_DEPTH_TARGET.resize(CullingHandler.DEPTH_BUFFER_TARGET.textureWidth, CullingHandler.DEPTH_BUFFER_TARGET.textureHeight, MinecraftClient.IS_SYSTEM_MAC); - } - - CullingHandler.MONOCHROME_DEPTH_TARGET.clear(MinecraftClient.IS_SYSTEM_MAC); - CullingHandler.MONOCHROME_DEPTH_TARGET.beginWrite(false); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION); - bufferbuilder.vertex(-1.0f, -1.0f, 0.0f).next(); - bufferbuilder.vertex(1.0f, -1.0f, 0.0f).next(); - bufferbuilder.vertex(1.0f, 1.0f, 0.0f).next(); - bufferbuilder.vertex(-1.0f, 1.0f, 0.0f).next(); - RenderSystem.setShaderTexture(7, CullingHandler.DEPTH_TEXTURE); - tessellator.draw(); - + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuilder(); if(CullingHandler.INSTANCE.checkCulling) return; if(Config.CULL_ENTITY.getValue() && CullingHandler.ENTITY_CULLING_MAP != null && CullingHandler.ENTITY_CULLING_MAP.needTransferData()) { - CullingHandler.ENTITY_CULLING_MAP_TARGET.clear(MinecraftClient.IS_SYSTEM_MAC); - CullingHandler.ENTITY_CULLING_MAP_TARGET.beginWrite(false); - RenderSystem.setShaderTexture(7, CullingHandler.DEPTH_TEXTURE); + CullingHandler.ENTITY_CULLING_MAP_TARGET.clear(Minecraft.ON_OSX); + CullingHandler.ENTITY_CULLING_MAP_TARGET.bindWrite(false); + CullingHandler.callDepthTexture(); CullingHandler.ENTITY_CULLING_MAP.getEntityTable().addEntityAttribute(ENTITY_CULLING_INSTANCE_RENDERER::addInstanceAttrib); ENTITY_CULLING_INSTANCE_RENDERER.drawWithShader(CullingHandler.INSTANCED_ENTITY_CULLING_SHADER); } if(Config.CULL_CHUNK.getValue() && CullingHandler.CHUNK_CULLING_MAP != null && CullingHandler.CHUNK_CULLING_MAP.needTransferData()) { CullingHandler.useShader(CullingHandler.CHUNK_CULLING_SHADER); - CullingHandler.CHUNK_CULLING_MAP_TARGET.clear(MinecraftClient.IS_SYSTEM_MAC); - CullingHandler.CHUNK_CULLING_MAP_TARGET.beginWrite(false); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION); - bufferbuilder.vertex(-1.0f, -1.0f, 0.0f).next(); - bufferbuilder.vertex(1.0f, -1.0f, 0.0f).next(); - bufferbuilder.vertex(1.0f, 1.0f, 0.0f).next(); - bufferbuilder.vertex(-1.0f, 1.0f, 0.0f).next(); - RenderSystem.setShaderTexture(7, CullingHandler.DEPTH_TEXTURE); - tessellator.draw(); + CullingHandler.CHUNK_CULLING_MAP_TARGET.clear(Minecraft.ON_OSX); + CullingHandler.CHUNK_CULLING_MAP_TARGET.bindWrite(false); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); + bufferbuilder.vertex(-1.0f, -1.0f, 0.0f).endVertex(); + bufferbuilder.vertex(1.0f, -1.0f, 0.0f).endVertex(); + bufferbuilder.vertex(1.0f, 1.0f, 0.0f).endVertex(); + bufferbuilder.vertex(-1.0f, 1.0f, 0.0f).endVertex(); + CullingHandler.callDepthTexture(); + tessellator.end(); } + CullingHandler.bindMainFrameTarget(); } - public static void setUniform(Shader shader) { + public static void setUniform(ShaderInstance shader) { ICullingShader shaderInstance = (ICullingShader) shader; if(shaderInstance.getCullingCameraPos() != null) { - Vec3d pos = MinecraftClient.getInstance().gameRenderer.getCamera().getPos(); + Vec3 pos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); float[] array = new float[]{(float) pos.x, (float) pos.y, (float) pos.z}; shaderInstance.getCullingCameraPos().set(array); } if(shaderInstance.getFrustumPos() != null) { - Vec3d pos = new Vec3d( + Vec3 pos = new Vec3( ((AccessorFrustum)CullingHandler.FRUSTUM).camX(), ((AccessorFrustum)CullingHandler.FRUSTUM).camY(), ((AccessorFrustum)CullingHandler.FRUSTUM).camZ()); @@ -259,10 +250,10 @@ public static void setUniform(Shader shader) { Vector4f[] frustumData = ((AccessorFrustum)CullingHandler.FRUSTUM).frustumData(); List data = new ArrayList<>(); for (Vector4f frustumDatum : frustumData) { - data.add(frustumDatum.getX()); - data.add(frustumDatum.getY()); - data.add(frustumDatum.getZ()); - data.add(frustumDatum.getW()); + data.add(frustumDatum.x()); + data.add(frustumDatum.y()); + data.add(frustumDatum.z()); + data.add(frustumDatum.w()); } float[] array = new float[data.size()]; for (int i = 0; i < data.size(); i++) { @@ -271,23 +262,44 @@ public static void setUniform(Shader shader) { shaderInstance.getCullingFrustum().set(array); } if(shaderInstance.getRenderDistance() != null) { - float distance = MinecraftClient.getInstance().options.getViewDistance(); + float distance = Minecraft.getInstance().options.getEffectiveRenderDistance(); + if(shader == CullingHandler.COPY_DEPTH_SHADER) { + if(CullingHandler.DEPTH_INDEX > 0) + distance = 2; + else + distance = 0; + } + shaderInstance.getRenderDistance().set(distance); } if(shaderInstance.getDepthSize() != null) { - shaderInstance.getDepthSize().set((float) CullingHandler.DEPTH_BUFFER_TARGET.textureWidth, (float) CullingHandler.DEPTH_BUFFER_TARGET.textureHeight); + float[] array = new float[CullingHandler.depthSize*2]; + if(shader == CullingHandler.COPY_DEPTH_SHADER) { + array[0] = (float) CullingHandler.DEPTH_BUFFER_TARGET[CullingHandler.DEPTH_INDEX].width; + array[1] = (float) CullingHandler.DEPTH_BUFFER_TARGET[CullingHandler.DEPTH_INDEX].height; + } else { + for(int i = 0; i < CullingHandler.depthSize; ++i) { + int arrayIdx = i*2; + array[arrayIdx] = (float) CullingHandler.DEPTH_BUFFER_TARGET[i].width; + array[arrayIdx+1] = (float) CullingHandler.DEPTH_BUFFER_TARGET[i].height; + } + } + shaderInstance.getDepthSize().set(array); + } + if(shader == CullingHandler.COPY_DEPTH_SHADER && CullingHandler.DEPTH_INDEX > 0 && shader.SCREEN_SIZE != null) { + shader.SCREEN_SIZE.set((float) CullingHandler.DEPTH_BUFFER_TARGET[CullingHandler.DEPTH_INDEX-1].width, (float) CullingHandler.DEPTH_BUFFER_TARGET[CullingHandler.DEPTH_INDEX-1].height); } if(shaderInstance.getCullingSize() != null) { - shaderInstance.getCullingSize().set((float) CullingHandler.CHUNK_CULLING_MAP_TARGET.textureWidth, (float) CullingHandler.CHUNK_CULLING_MAP_TARGET.textureHeight); + shaderInstance.getCullingSize().set((float) CullingHandler.CHUNK_CULLING_MAP_TARGET.width, (float) CullingHandler.CHUNK_CULLING_MAP_TARGET.height); } if(shaderInstance.getEntityCullingSize() != null) { - shaderInstance.getEntityCullingSize().set((float) CullingHandler.ENTITY_CULLING_MAP_TARGET.textureWidth, (float) CullingHandler.ENTITY_CULLING_MAP_TARGET.textureHeight); + shaderInstance.getEntityCullingSize().set((float) CullingHandler.ENTITY_CULLING_MAP_TARGET.width, (float) CullingHandler.ENTITY_CULLING_MAP_TARGET.height); } if(shaderInstance.getLevelHeightOffset() != null) { shaderInstance.getLevelHeightOffset().set(CullingHandler.LEVEL_HEIGHT_OFFSET); } - if(shaderInstance.getLevelMinSection() != null && MinecraftClient.getInstance().world != null) { - shaderInstance.getLevelMinSection().set(MinecraftClient.getInstance().world.getBottomSectionCoord()); + if(shaderInstance.getLevelMinSection() != null && Minecraft.getInstance().level != null) { + shaderInstance.getLevelMinSection().set(Minecraft.getInstance().level.getMinSection()); } } } diff --git a/src/main/java/rogo/renderingculling/api/EntityCullingMap.java b/src/main/java/rogo/renderingculling/api/EntityCullingMap.java index deb29c6..be66beb 100644 --- a/src/main/java/rogo/renderingculling/api/EntityCullingMap.java +++ b/src/main/java/rogo/renderingculling/api/EntityCullingMap.java @@ -1,9 +1,9 @@ package rogo.renderingculling.api; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import rogo.renderingculling.util.LifeTimer; import java.nio.FloatBuffer; @@ -24,7 +24,7 @@ int delayCount() { @Override int bindFrameBufferId() { - return CullingHandler.ENTITY_CULLING_MAP_TARGET.fbo; + return CullingHandler.ENTITY_CULLING_MAP_TARGET.frameBufferId; } public boolean isObjectVisible(Object o) { @@ -101,15 +101,15 @@ public void clear() { innerCount = 0; } - private void addAttribute(Consumer> consumer, Box aabb, int index) { + private void addAttribute(Consumer> consumer, AABB aabb, int index) { consumer.accept(buffer -> { buffer.put((float) index); - float size = (float) Math.max(aabb.getXLength(), aabb.getZLength()); + float size = (float) Math.max(aabb.getXsize(), aabb.getZsize()); buffer.put(size); - buffer.put((float) aabb.getYLength()); + buffer.put((float) aabb.getYsize()); - Vec3d pos = aabb.getCenter(); + Vec3 pos = aabb.getCenter(); buffer.put((float) pos.x); buffer.put((float) pos.y); buffer.put((float) pos.z); @@ -121,7 +121,7 @@ public void addEntityAttribute(Consumer> consumer) { if(o instanceof Entity) { addAttribute(consumer, ((Entity) o).getBoundingBox(), index); } else if(o instanceof BlockEntity) { - addAttribute(consumer, new Box(((BlockEntity) o).getPos()), index); + addAttribute(consumer, new AABB(((BlockEntity) o).getBlockPos()), index); } else if (o instanceof IAABBObject) { addAttribute(consumer, ((IAABBObject) o).getAABB(), index); } diff --git a/src/main/java/rogo/renderingculling/api/IAABBObject.java b/src/main/java/rogo/renderingculling/api/IAABBObject.java index 5620967..d6e7ea5 100644 --- a/src/main/java/rogo/renderingculling/api/IAABBObject.java +++ b/src/main/java/rogo/renderingculling/api/IAABBObject.java @@ -1,7 +1,7 @@ package rogo.renderingculling.api; -import net.minecraft.util.math.Box; +import net.minecraft.world.phys.AABB; public interface IAABBObject { - Box getAABB(); + AABB getAABB(); } diff --git a/src/main/java/rogo/renderingculling/api/ICullingShader.java b/src/main/java/rogo/renderingculling/api/ICullingShader.java index 4bfae5b..1297f2b 100644 --- a/src/main/java/rogo/renderingculling/api/ICullingShader.java +++ b/src/main/java/rogo/renderingculling/api/ICullingShader.java @@ -1,18 +1,17 @@ package rogo.renderingculling.api; - -import net.minecraft.client.gl.GlUniform; +import com.mojang.blaze3d.shaders.Uniform; public interface ICullingShader { - GlUniform getRenderDistance(); - GlUniform getCullingCameraPos(); - GlUniform getDepthSize(); - GlUniform getCullingSize(); - GlUniform getLevelHeightOffset(); - GlUniform getLevelMinSection(); - GlUniform getEntityCullingSize(); - GlUniform getCullingFrustum(); - GlUniform getFrustumPos(); - GlUniform getCullingViewMat(); - GlUniform getCullingProjMat(); + Uniform getRenderDistance(); + Uniform getCullingCameraPos(); + Uniform getDepthSize(); + Uniform getCullingSize(); + Uniform getLevelHeightOffset(); + Uniform getLevelMinSection(); + Uniform getEntityCullingSize(); + Uniform getCullingFrustum(); + Uniform getFrustumPos(); + Uniform getCullingViewMat(); + Uniform getCullingProjMat(); } \ No newline at end of file diff --git a/src/main/java/rogo/renderingculling/api/IRenderChunkInfo.java b/src/main/java/rogo/renderingculling/api/IRenderChunkInfo.java index 41c8b35..16827da 100644 --- a/src/main/java/rogo/renderingculling/api/IRenderChunkInfo.java +++ b/src/main/java/rogo/renderingculling/api/IRenderChunkInfo.java @@ -1,7 +1,7 @@ package rogo.renderingculling.api; -import net.minecraft.client.render.chunk.ChunkBuilder; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; public interface IRenderChunkInfo { - ChunkBuilder.BuiltChunk getRenderChunk(); + ChunkRenderDispatcher.RenderChunk getRenderChunk(); } diff --git a/src/main/java/rogo/renderingculling/event/WorldUnloadEvent.java b/src/main/java/rogo/renderingculling/event/WorldUnloadEvent.java index c48b905..1392fc6 100644 --- a/src/main/java/rogo/renderingculling/event/WorldUnloadEvent.java +++ b/src/main/java/rogo/renderingculling/event/WorldUnloadEvent.java @@ -2,14 +2,14 @@ import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.profiler.Profiler; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.util.profiling.ProfilerFiller; public class WorldUnloadEvent { public static final Event WORLD_UNLOAD = EventFactory.createArrayBacked(WorldUnloadEvent.Unload.class, callbacks -> (clientWorld) -> { if (EventFactory.isProfilingEnabled()) { - final Profiler profiler = clientWorld.getProfiler(); + final ProfilerFiller profiler = clientWorld.getProfiler(); profiler.push("bfrcClientWorldUnload"); for (WorldUnloadEvent.Unload callback : callbacks) { @@ -29,6 +29,6 @@ public class WorldUnloadEvent { @FunctionalInterface public interface Unload { - void onWorldUnload(ClientWorld world); + void onWorldUnload(ClientLevel world); } } diff --git a/src/main/java/rogo/renderingculling/gui/ConfigScreen.java b/src/main/java/rogo/renderingculling/gui/ConfigScreen.java index fb3a4fa..d0065dd 100644 --- a/src/main/java/rogo/renderingculling/gui/ConfigScreen.java +++ b/src/main/java/rogo/renderingculling/gui/ConfigScreen.java @@ -2,17 +2,17 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.render.*; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Player; import rogo.renderingculling.api.Config; import rogo.renderingculling.api.CullingHandler; @@ -20,60 +20,60 @@ public class ConfigScreen extends Screen { - public ConfigScreen(Text titleIn) { + public ConfigScreen(Component titleIn) { super(titleIn); } @Override - public boolean shouldPause() { + public boolean isPauseScreen() { return false; } @Override - public void renderBackground(MatrixStack p_96557_) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - int width = minecraft.getWindow().getScaledWidth()/2; + public void renderBackground(PoseStack p_96557_) { + Minecraft minecraft = Minecraft.getInstance(); + int width = minecraft.getWindow().getGuiScaledWidth()/2; int widthScale = width/4; - TextRenderer font = minecraft.textRenderer; - int heightScale = font.fontHeight*8; - int height = minecraft.getWindow().getScaledHeight()/2+heightScale/2; + Font font = minecraft.font; + int heightScale = font.lineHeight*8; + int height = minecraft.getWindow().getGuiScaledHeight()/2+heightScale/2; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0f); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorShader); - BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer(); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.DST_COLOR); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - bufferbuilder.vertex(width-widthScale, height+heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); - bufferbuilder.vertex(width+widthScale, height+heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); - bufferbuilder.vertex(width+widthScale, height-heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); - bufferbuilder.vertex(width-widthScale, height-heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).next(); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_COLOR); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(width-widthScale, height+heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); + bufferbuilder.vertex(width+widthScale, height+heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); + bufferbuilder.vertex(width+widthScale, height-heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); + bufferbuilder.vertex(width-widthScale, height-heightScale, 100.0D).color(0.3F, 0.3F, 0.3F, 0.2f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - bufferbuilder.vertex(width-widthScale-2, height+heightScale+2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); - bufferbuilder.vertex(width+widthScale+2, height+heightScale+2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); - bufferbuilder.vertex(width+widthScale+2, height-heightScale-2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); - bufferbuilder.vertex(width-widthScale-2, height-heightScale-2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).next(); + BufferUploader.end(bufferbuilder); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(width-widthScale-2, height+heightScale+2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); + bufferbuilder.vertex(width+widthScale+2, height+heightScale+2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); + bufferbuilder.vertex(width+widthScale+2, height-heightScale-2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); + bufferbuilder.vertex(width-widthScale-2, height-heightScale-2, 90.0D).color(1.0F, 1.0F, 1.0F, 0.1f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); + BufferUploader.end(bufferbuilder); RenderSystem.defaultBlendFunc(); RenderSystem.disableBlend(); } @Override public boolean keyPressed(int p_96552_, int p_96553_, int p_96554_) { - if(CullingHandler.CONFIG_KEY.matchesKey(p_96552_, p_96553_)) { - this.close(); + if(CullingHandler.CONFIG_KEY.matches(p_96552_, p_96553_)) { + this.onClose(); return true; } - if (this.client.options.inventoryKey.matchesKey(p_96552_, p_96553_)) { - this.close(); + if (this.minecraft.options.keyInventory.matches(p_96552_, p_96553_)) { + this.onClose(); return true; - } else if (this.client.options.playerListKey.matchesKey(p_96552_, p_96553_)) { - this.close(); + } else if (this.minecraft.options.keyPlayerList.matches(p_96552_, p_96553_)) { + this.onClose(); return true; } else { return super.keyPressed(p_96552_, p_96553_, p_96554_); @@ -87,56 +87,67 @@ public boolean keyReleased(int p_94715_, int p_94716_, int p_94717_) { @Override protected void init() { - PlayerEntity player = MinecraftClient.getInstance().player; + Player player = Minecraft.getInstance().player; if(player == null) { - close(); + onClose(); return; } - int heightScale = (int) (client.textRenderer.fontHeight*2f)+1; + int heightScale = (int) (minecraft.font.lineHeight*2f)+1; NeatSliderButton sampler = new NeatSliderButton(width/2-50, height/2+heightScale+12, 100, 14, Config.SAMPLING.getValue(), (sliderButton) -> { - Text component = new LiteralText((int)(sliderButton.getValue() * 100.0D) + "%"); - return (new TranslatableText("brute_force_rendering_culling.sampler")).append(": ").append(component); + Component component = new TextComponent((int)(sliderButton.getValue() * 100.0D) + "%"); + return (new TranslatableComponent("brute_force_rendering_culling.sampler")).append(": ").append(component); }, (value) -> { double v = Float.parseFloat(String.format("%.2f",value)); Config.SAMPLING.setValue(v); + Config.save(); }); NeatSliderButton entityUpdateRate = new NeatSliderButton(width/2-50, height/2+heightScale*2+12, 100, 14, Config.CULLING_ENTITY_RATE.getValue()/20f, (sliderButton) -> { - Text component = new LiteralText( String.valueOf((int)(sliderButton.getValue() * 20.0D))); - return (new TranslatableText("brute_force_rendering_culling.culling_entity_update_rate")).append(": ").append(component); + Component component = new TextComponent( String.valueOf((int)(sliderButton.getValue() * 20.0D))); + return (new TranslatableComponent("brute_force_rendering_culling.culling_entity_update_rate")).append(": ").append(component); }, (value) -> { int i = (int) (value*20); Config.CULLING_ENTITY_RATE.setValue(i); + Config.save(); }); NeatButton debug = new NeatButton(width/2-50, height/2+heightScale*4+12, 100, 14 , (button) -> { CullingHandler.INSTANCE.checkCulling = !CullingHandler.INSTANCE.checkCulling; - }, () -> (CullingHandler.INSTANCE.checkCulling ? new TranslatableText("brute_force_rendering_culling.disable").append(" ").append(new LiteralText("Debug")) - : new TranslatableText("brute_force_rendering_culling.enable").append(" ").append(new LiteralText("Debug")))); + }, () -> (CullingHandler.INSTANCE.checkCulling ? new TranslatableComponent("brute_force_rendering_culling.disable").append(" ").append(new TextComponent("Debug")) + : new TranslatableComponent("brute_force_rendering_culling.enable").append(" ").append(new TextComponent("Debug")))); + NeatButton checkTexture = new NeatButton(width/2-50, height/2+heightScale*3+12, 100, 14 + , (button) -> { + CullingHandler.INSTANCE.checkTexture = !CullingHandler.INSTANCE.checkTexture; + }, () -> (CullingHandler.INSTANCE.checkTexture ? new TranslatableComponent("brute_force_rendering_culling.disable").append(" ").append(new TextComponent("Check Texture")) + : new TranslatableComponent("brute_force_rendering_culling.enable").append(" ").append(new TextComponent("Check Texture")))); NeatSliderButton delay = new NeatSliderButton(width/2-50, height/2+12, 100, 14, Config.UPDATE_DELAY.getValue()/10f, (sliderButton) -> { - Text component = new LiteralText(String.valueOf((int)(sliderButton.getValue() * 10.0D))); - return (new TranslatableText("brute_force_rendering_culling.culling_map_update_delay")).append(": ").append(component); + Component component = new TextComponent(String.valueOf((int)(sliderButton.getValue() * 10.0D))); + return (new TranslatableComponent("brute_force_rendering_culling.culling_map_update_delay")).append(": ").append(component); }, (value) -> { int i = (int) (value*10); Config.UPDATE_DELAY.setValue(i); + Config.save(); }); NeatButton close = new NeatButton(width/2-50, height/2-heightScale*2+12, 100, 14 , (button) -> { Config.CULL_ENTITY.setValue(!Config.CULL_ENTITY.getValue()); - }, () -> (Config.CULL_ENTITY.getValue() ? new TranslatableText("brute_force_rendering_culling.disable").append(" ").append(new TranslatableText("brute_force_rendering_culling.cull_entity")) - : new TranslatableText("brute_force_rendering_culling.enable").append(" ").append(new TranslatableText("brute_force_rendering_culling.cull_entity")))); + Config.save(); + }, () -> (Config.CULL_ENTITY.getValue() ? new TranslatableComponent("brute_force_rendering_culling.disable").append(" ").append(new TranslatableComponent("brute_force_rendering_culling.cull_entity")) + : new TranslatableComponent("brute_force_rendering_culling.enable").append(" ").append(new TranslatableComponent("brute_force_rendering_culling.cull_entity")))); NeatButton chunk = new NeatButton(width/2-50, height/2-heightScale+12, 100, 14 , (button) -> { - Config.CULL_CHUNK.setValue(!Config.CULL_CHUNK.getValue()); - }, () -> (Config.CULL_CHUNK.getValue() ? new TranslatableText("brute_force_rendering_culling.disable").append(" ").append(new TranslatableText("brute_force_rendering_culling.cull_chunk")) - : new TranslatableText("brute_force_rendering_culling.enable").append(" ").append(new TranslatableText("brute_force_rendering_culling.cull_chunk")))); - this.addSelectableChild(sampler); - this.addSelectableChild(delay); - this.addSelectableChild(entityUpdateRate); - this.addSelectableChild(close); - this.addSelectableChild(chunk); - this.addSelectableChild(debug); + Config.CULL_CHUNK.setValue(!Config.CULL_CHUNK.getValue()); + Config.save(); + }, () -> (Config.CULL_CHUNK.getValue() ? new TranslatableComponent("brute_force_rendering_culling.disable").append(" ").append(new TranslatableComponent("brute_force_rendering_culling.cull_chunk")) + : new TranslatableComponent("brute_force_rendering_culling.enable").append(" ").append(new TranslatableComponent("brute_force_rendering_culling.cull_chunk")))); + this.addWidget(sampler); + this.addWidget(delay); + this.addWidget(entityUpdateRate); + this.addWidget(close); + this.addWidget(chunk); + this.addWidget(debug); + this.addWidget(checkTexture); super.init(); } @@ -146,13 +157,21 @@ public boolean mouseDragged(double p_94699_, double p_94700_, int p_94701_, doub } @Override - public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { - List children = children(); - for (Element button : children) { - if(button instanceof ClickableWidget b) + public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + List children = children(); + for (GuiEventListener button : children) { + if(button instanceof AbstractWidget b) b.render(matrixStack, mouseX, mouseY, partialTicks); } this.renderBackground(matrixStack); } + + private boolean isSlotSelected(AbstractWidget button, double mouseX, double mouseY) { + return this.isPointInRegion(button.x, button.y, button.getWidth(), button.getWidth(), mouseX, mouseY); + } + + protected boolean isPointInRegion(int x, int y, int width, int height, double mouseX, double mouseY) { + return mouseX >= (double)(x - 1) && mouseX < (double)(x + width + 1) && mouseY >= (double)(y - 1) && mouseY < (double)(y + height + 1); + } } diff --git a/src/main/java/rogo/renderingculling/gui/NeatButton.java b/src/main/java/rogo/renderingculling/gui/NeatButton.java index 710e82a..ff339ee 100644 --- a/src/main/java/rogo/renderingculling/gui/NeatButton.java +++ b/src/main/java/rogo/renderingculling/gui/NeatButton.java @@ -2,19 +2,18 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.render.*; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.math.MathHelper; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; import java.util.function.Supplier; - -public class NeatButton extends ButtonWidget { - public NeatButton(int p_93721_, int p_93722_, int p_93723_, int p_93724_, PressAction p_93726_, Supplier updateMessage) { +public class NeatButton extends Button { + public NeatButton(int p_93721_, int p_93722_, int p_93723_, int p_93724_, OnPress p_93726_, Supplier updateMessage) { super(p_93721_, p_93722_, p_93723_, p_93724_, updateMessage.get(), (b) -> { p_93726_.onPress(b); b.setMessage(updateMessage.get()); @@ -22,41 +21,41 @@ public NeatButton(int p_93721_, int p_93722_, int p_93723_, int p_93724_, PressA } @Override - public void renderButton(MatrixStack p_93746_, int p_93747_, int p_93748_, float p_93749_) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - TextRenderer font = minecraft.textRenderer; + public void renderButton(PoseStack p_93746_, int p_93747_, int p_93748_, float p_93749_) { + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0f); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.DST_COLOR); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_COLOR); RenderSystem.setShader(GameRenderer::getPositionColorShader); - BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer(); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - float alpha = this.isHovered() ? 0.7f : 0.5f; - bufferbuilder.vertex(this.x, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + float alpha = this.isHoveredOrFocused() ? 0.7f : 0.5f; + bufferbuilder.vertex(this.x, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + BufferUploader.end(bufferbuilder); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); RenderSystem.defaultBlendFunc(); - bufferbuilder.vertex(this.x-1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width+1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width+1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x-1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); + bufferbuilder.vertex(this.x-1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width+1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width+1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x-1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); + BufferUploader.end(bufferbuilder); int j = this.active ? 16777215 : 10526880; //RenderSystem.disableDepthTest(); - drawCenteredText(p_93746_, font, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); + drawCenteredString(p_93746_, font, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | Mth.ceil(this.alpha * 255.0F) << 24); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } @Override - protected void renderBackground(MatrixStack p_93661_, MinecraftClient p_93662_, int p_93663_, int p_93664_) { - super.renderBackground(p_93661_, p_93662_, p_93663_, p_93664_); + protected void renderBg(PoseStack p_93661_, Minecraft p_93662_, int p_93663_, int p_93664_) { + super.renderBg(p_93661_, p_93662_, p_93663_, p_93664_); } } diff --git a/src/main/java/rogo/renderingculling/gui/NeatSliderButton.java b/src/main/java/rogo/renderingculling/gui/NeatSliderButton.java index 08e80df..4bf2089 100644 --- a/src/main/java/rogo/renderingculling/gui/NeatSliderButton.java +++ b/src/main/java/rogo/renderingculling/gui/NeatSliderButton.java @@ -2,24 +2,22 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.FontManager; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.widget.OptionSliderWidget; -import net.minecraft.client.gui.widget.SliderWidget; -import net.minecraft.client.render.*; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.math.MathHelper; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.AbstractOptionSliderButton; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; import java.util.function.Consumer; import java.util.function.Function; -public class NeatSliderButton extends OptionSliderWidget { - private final Function updateMessage; +public class NeatSliderButton extends AbstractOptionSliderButton { + private final Function updateMessage; private final Consumer applyValue; - protected NeatSliderButton(int p_93380_, int p_93381_, int p_93382_, int p_93383_, double p_93384_, Function updateMessage, Consumer applyValue) { - super(MinecraftClient.getInstance().options, p_93380_, p_93381_, p_93382_, p_93383_, p_93384_); + protected NeatSliderButton(int p_93380_, int p_93381_, int p_93382_, int p_93383_, double p_93384_, Function updateMessage, Consumer applyValue) { + super(Minecraft.getInstance().options, p_93380_, p_93381_, p_93382_, p_93383_, p_93384_); this.updateMessage = updateMessage; updateMessage(); this.applyValue = applyValue; @@ -40,53 +38,53 @@ protected void applyValue() { } @Override - protected void renderBackground(MatrixStack p_93600_, MinecraftClient p_93601_, int p_93602_, int p_93603_) { + protected void renderBg(PoseStack p_93600_, Minecraft p_93601_, int p_93602_, int p_93603_) { } @Override - public void render(MatrixStack p_93676_, int p_93677_, int p_93678_, float p_93679_) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - TextRenderer font = minecraft.textRenderer; + public void render(PoseStack p_93676_, int p_93677_, int p_93678_, float p_93679_) { + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0f); RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.DST_COLOR); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_COLOR); RenderSystem.setShader(GameRenderer::getPositionColorShader); - BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer(); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - float alpha = this.isHovered() ? 0.7f : 0.5f; - bufferbuilder.vertex(this.x, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + float alpha = this.isHoveredOrFocused() ? 0.7f : 0.5f; + bufferbuilder.vertex(this.x, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + BufferUploader.end(bufferbuilder); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); RenderSystem.defaultBlendFunc(); - bufferbuilder.vertex(this.x-1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width+1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x+width+1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x-1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); + bufferbuilder.vertex(this.x-1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width+1, this.y+height+1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x+width+1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x-1, this.y-1, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); + BufferUploader.end(bufferbuilder); int j = this.active ? 16777215 : 10526880; - drawCenteredText(p_93676_, font, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); + drawCenteredString(p_93676_, font, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | Mth.ceil(this.alpha * 255.0F) << 24); RenderSystem.disableBlend(); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0f); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorShader); - bufferbuilder = Tessellator.getInstance().getBuffer(); - bufferbuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); - alpha = this.isHovered() ? 1.0f : 0.0f; - bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8)), this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8))+8, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8))+8, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); - bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8)), this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).next(); + bufferbuilder = Tesselator.getInstance().getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + alpha = this.isHoveredOrFocused() ? 1.0f : 0.0f; + bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8)), this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8))+8, this.y+height, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8))+8, this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); + bufferbuilder.vertex(this.x + (int)(this.value * (double)(this.width - 8)), this.y, 90.0D).color(alpha, alpha, alpha, 0.5f).endVertex(); bufferbuilder.end(); - BufferRenderer.draw(bufferbuilder); + BufferUploader.end(bufferbuilder); RenderSystem.defaultBlendFunc(); RenderSystem.disableBlend(); } diff --git a/src/main/java/rogo/renderingculling/instanced/EntityCullingInstanceRenderer.java b/src/main/java/rogo/renderingculling/instanced/EntityCullingInstanceRenderer.java index 2541918..2ca5c0f 100644 --- a/src/main/java/rogo/renderingculling/instanced/EntityCullingInstanceRenderer.java +++ b/src/main/java/rogo/renderingculling/instanced/EntityCullingInstanceRenderer.java @@ -1,6 +1,6 @@ package rogo.renderingculling.instanced; -import net.minecraft.client.render.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import org.lwjgl.opengl.GL15; import java.nio.FloatBuffer; @@ -8,7 +8,7 @@ public class EntityCullingInstanceRenderer extends InstanceVertexRenderer { public EntityCullingInstanceRenderer() { - super(VertexFormat.DrawMode.QUADS, new PixelVertexBuffer(0), EntityCullingInstanceRenderer::init, new EntityUpdateVertex(1)); + super(VertexFormat.Mode.QUADS, new PixelVertexBuffer(0), EntityCullingInstanceRenderer::init, new EntityUpdateVertex(1)); } private static void init(FloatBuffer buffer) { diff --git a/src/main/java/rogo/renderingculling/instanced/InstanceVertexRenderer.java b/src/main/java/rogo/renderingculling/instanced/InstanceVertexRenderer.java index bfdc60b..217236a 100644 --- a/src/main/java/rogo/renderingculling/instanced/InstanceVertexRenderer.java +++ b/src/main/java/rogo/renderingculling/instanced/InstanceVertexRenderer.java @@ -1,11 +1,11 @@ package rogo.renderingculling.instanced; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BufferRenderer; -import net.minecraft.client.render.Shader; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.util.Window; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ShaderInstance; import org.lwjgl.opengl.GL31; import rogo.renderingculling.api.CullingRenderEvent; @@ -13,7 +13,6 @@ import java.util.function.Consumer; import static org.lwjgl.opengl.GL15.glBindBuffer; - public class InstanceVertexRenderer implements AutoCloseable { protected final VertexAttrib main; protected final VertexAttrib update; @@ -21,11 +20,11 @@ public class InstanceVertexRenderer implements AutoCloseable { protected int indexCount; protected int instanceCount; protected final VertexAttrib mainAttrib; - protected final VertexFormat.DrawMode mode; - private VertexFormat.IntType indexType; + protected final VertexFormat.Mode mode; + private VertexFormat.IndexType indexType; private boolean updating = false; - public InstanceVertexRenderer(VertexFormat.DrawMode mode, VertexAttrib mainAttrib, Consumer consumer, VertexAttrib update) { + public InstanceVertexRenderer(VertexFormat.Mode mode, VertexAttrib mainAttrib, Consumer consumer, VertexAttrib update) { this.main = mainAttrib; this.update = update; RenderSystem.glGenVertexArrays((p_166881_) -> { @@ -34,7 +33,7 @@ public InstanceVertexRenderer(VertexFormat.DrawMode mode, VertexAttrib mainAttri this.mode = mode; this.mainAttrib = mainAttrib; init(consumer); - this.indexCount = mode.getSize(mainAttrib.vertexCount()); + this.indexCount = mode.indexCount(mainAttrib.vertexCount()); } public void init(Consumer buffer) { @@ -47,9 +46,9 @@ public void init(Consumer buffer) { public void bind() { RenderSystem.glBindBuffer(34963, () -> { - RenderSystem.IndexBuffer rendersystem$autostorageindexbuffer = RenderSystem.getSequentialBuffer(this.mode, this.indexCount); - this.indexType = rendersystem$autostorageindexbuffer.getElementFormat(); - return rendersystem$autostorageindexbuffer.getId(); + RenderSystem.AutoStorageIndexBuffer rendersystem$autostorageindexbuffer = RenderSystem.getSequentialBuffer(this.mode, this.indexCount); + this.indexType = rendersystem$autostorageindexbuffer.type(); + return rendersystem$autostorageindexbuffer.name(); }); } @@ -84,7 +83,7 @@ public static void unbindVertexArray() { RenderSystem.glBindVertexArray(() -> 0); } - public void drawWithShader(Shader p_166870_) { + public void drawWithShader(ShaderInstance p_166870_) { if (!RenderSystem.isOnRenderThread()) { RenderSystem.recordRenderCall(() -> { this._drawWithShader(p_166870_); @@ -94,63 +93,63 @@ public void drawWithShader(Shader p_166870_) { } } - public void _drawWithShader(Shader p_166879_) { + public void _drawWithShader(ShaderInstance p_166879_) { if (this.indexCount != 0 && this.instanceCount > 0) { RenderSystem.assertOnRenderThread(); - BufferRenderer.unbindAll(); + BufferUploader.reset(); for(int i = 0; i < 12; ++i) { int j = RenderSystem.getShaderTexture(i); - p_166879_.addSampler("Sampler" + i, j); + p_166879_.setSampler("Sampler" + i, j); } - if (p_166879_.modelViewMat != null) { - p_166879_.modelViewMat.set(RenderSystem.getModelViewMatrix()); + if (p_166879_.MODEL_VIEW_MATRIX != null) { + p_166879_.MODEL_VIEW_MATRIX.set(RenderSystem.getModelViewMatrix()); } - if (p_166879_.projectionMat != null) { - p_166879_.projectionMat.set(RenderSystem.getProjectionMatrix()); + if (p_166879_.PROJECTION_MATRIX != null) { + p_166879_.PROJECTION_MATRIX.set(RenderSystem.getProjectionMatrix()); } - if (p_166879_.viewRotationMat != null) { - p_166879_.viewRotationMat.method_39978(RenderSystem.getInverseViewRotationMatrix()); + if (p_166879_.INVERSE_VIEW_ROTATION_MATRIX != null) { + p_166879_.INVERSE_VIEW_ROTATION_MATRIX.set(RenderSystem.getInverseViewRotationMatrix()); } - if (p_166879_.colorModulator != null) { - p_166879_.colorModulator.set(RenderSystem.getShaderColor()); + if (p_166879_.COLOR_MODULATOR != null) { + p_166879_.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); } - if (p_166879_.fogStart != null) { - p_166879_.fogStart.set(RenderSystem.getShaderFogStart()); + if (p_166879_.FOG_START != null) { + p_166879_.FOG_START.set(RenderSystem.getShaderFogStart()); } - if (p_166879_.fogEnd != null) { - p_166879_.fogEnd.set(RenderSystem.getShaderFogEnd()); + if (p_166879_.FOG_END != null) { + p_166879_.FOG_END.set(RenderSystem.getShaderFogEnd()); } - if (p_166879_.fogColor != null) { - p_166879_.fogColor.set(RenderSystem.getShaderFogColor()); + if (p_166879_.FOG_COLOR != null) { + p_166879_.FOG_COLOR.set(RenderSystem.getShaderFogColor()); } - if (p_166879_.fogShape != null) { - p_166879_.fogShape.set(RenderSystem.getShaderFogShape().getId()); + if (p_166879_.FOG_SHAPE != null) { + p_166879_.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); } - if (p_166879_.textureMat != null) { - p_166879_.textureMat.set(RenderSystem.getTextureMatrix()); + if (p_166879_.TEXTURE_MATRIX != null) { + p_166879_.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); } - if (p_166879_.gameTime != null) { - p_166879_.gameTime.set(RenderSystem.getShaderGameTime()); + if (p_166879_.GAME_TIME != null) { + p_166879_.GAME_TIME.set(RenderSystem.getShaderGameTime()); } - if (p_166879_.screenSize != null) { - Window window = MinecraftClient.getInstance().getWindow(); - p_166879_.screenSize.set((float)window.getWidth(), (float)window.getHeight()); + if (p_166879_.SCREEN_SIZE != null) { + Window window = Minecraft.getInstance().getWindow(); + p_166879_.SCREEN_SIZE.set((float)window.getWidth(), (float)window.getHeight()); } - if (p_166879_.lineWidth != null && (this.mode == VertexFormat.DrawMode.LINES || this.mode == VertexFormat.DrawMode.LINE_STRIP)) { - p_166879_.lineWidth.set(RenderSystem.getShaderLineWidth()); + if (p_166879_.LINE_WIDTH != null && (this.mode == VertexFormat.Mode.LINES || this.mode == VertexFormat.Mode.LINE_STRIP)) { + p_166879_.LINE_WIDTH.set(RenderSystem.getShaderLineWidth()); } CullingRenderEvent.setUniform(p_166879_); @@ -160,9 +159,9 @@ public void _drawWithShader(Shader p_166879_) { bind(); enableVertexAttribArray(); - p_166879_.bind(); - GL31.glDrawElementsInstanced(this.mode.mode, this.indexCount, this.indexType.type, 0 , this.instanceCount); - p_166879_.unbind(); + p_166879_.apply(); + GL31.glDrawElementsInstanced(this.mode.asGLMode, this.indexCount, this.indexType.asGLType, 0 , this.instanceCount); + p_166879_.clear(); disableVertexAttribArray(); unbind(); diff --git a/src/main/java/rogo/renderingculling/instanced/VertexAttrib.java b/src/main/java/rogo/renderingculling/instanced/VertexAttrib.java index b2752ae..055530b 100644 --- a/src/main/java/rogo/renderingculling/instanced/VertexAttrib.java +++ b/src/main/java/rogo/renderingculling/instanced/VertexAttrib.java @@ -26,7 +26,7 @@ public VertexAttrib(GLVertex... vertices) { int vertexSize = 0; if(this.vertices.size() > 1) { for(GLVertex vertex : vertices) { - vertexSize += vertex.size()*vertex.elementType().getByteLength(); + vertexSize += vertex.size()*vertex.elementType().getSize(); } } this.vertexSize = vertexSize; @@ -58,11 +58,11 @@ public void enableVertexAttribArray() { int offset = 0; for(GLVertex vertex : vertices) { - GlStateManager._vertexAttribPointer(vertex.index(), vertex.size(), vertex.elementType().getId(), false, vertexSize, offset); + GlStateManager._vertexAttribPointer(vertex.index(), vertex.size(), vertex.elementType().getGlType(), false, vertexSize, offset); GlStateManager._enableVertexAttribArray(vertex.index()); if(needUpdate()) GL33.glVertexAttribDivisor(vertex.index(), 1); - offset+=vertex.size()*vertex.elementType().getByteLength(); + offset+=vertex.size()*vertex.elementType().getSize(); } } diff --git a/src/main/java/rogo/renderingculling/instanced/attribute/GLFloatVertex.java b/src/main/java/rogo/renderingculling/instanced/attribute/GLFloatVertex.java index dd356a6..5db1f5e 100644 --- a/src/main/java/rogo/renderingculling/instanced/attribute/GLFloatVertex.java +++ b/src/main/java/rogo/renderingculling/instanced/attribute/GLFloatVertex.java @@ -1,7 +1,6 @@ package rogo.renderingculling.instanced.attribute; - -import net.minecraft.client.render.VertexFormatElement; +import com.mojang.blaze3d.vertex.VertexFormatElement; public class GLFloatVertex extends GLVertex{ @@ -26,7 +25,7 @@ public static GLFloatVertex createF4(int index, String name) { } @Override - public VertexFormatElement.DataType elementType() { - return VertexFormatElement.DataType.FLOAT; + public VertexFormatElement.Type elementType() { + return VertexFormatElement.Type.FLOAT; } } diff --git a/src/main/java/rogo/renderingculling/instanced/attribute/GLVertex.java b/src/main/java/rogo/renderingculling/instanced/attribute/GLVertex.java index b8b1031..7b33342 100644 --- a/src/main/java/rogo/renderingculling/instanced/attribute/GLVertex.java +++ b/src/main/java/rogo/renderingculling/instanced/attribute/GLVertex.java @@ -1,6 +1,6 @@ package rogo.renderingculling.instanced.attribute; -import net.minecraft.client.render.VertexFormatElement; +import com.mojang.blaze3d.vertex.VertexFormatElement; public abstract class GLVertex { private final int size; @@ -25,5 +25,5 @@ public int size() { return size; } - public abstract VertexFormatElement.DataType elementType(); + public abstract VertexFormatElement.Type elementType(); } diff --git a/src/main/java/rogo/renderingculling/mixin/AccessorFrustum.java b/src/main/java/rogo/renderingculling/mixin/AccessorFrustum.java index bf525d5..a652324 100644 --- a/src/main/java/rogo/renderingculling/mixin/AccessorFrustum.java +++ b/src/main/java/rogo/renderingculling/mixin/AccessorFrustum.java @@ -1,21 +1,21 @@ package rogo.renderingculling.mixin; -import net.minecraft.client.render.Frustum; -import net.minecraft.util.math.Vector4f; +import com.mojang.math.Vector4f; +import net.minecraft.client.renderer.culling.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(Frustum.class) public interface AccessorFrustum { - @Accessor("x") + @Accessor("camX") double camX(); - @Accessor("y") + @Accessor("camY") double camY(); - @Accessor("z") + @Accessor("camZ") double camZ(); - @Accessor("homogeneousCoordinates") + @Accessor("frustumData") Vector4f[] frustumData(); } \ No newline at end of file diff --git a/src/main/java/rogo/renderingculling/mixin/AccessorLevelRender.java b/src/main/java/rogo/renderingculling/mixin/AccessorLevelRender.java index 27ced4b..a1d20d0 100644 --- a/src/main/java/rogo/renderingculling/mixin/AccessorLevelRender.java +++ b/src/main/java/rogo/renderingculling/mixin/AccessorLevelRender.java @@ -1,13 +1,13 @@ package rogo.renderingculling.mixin; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.culling.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(WorldRenderer.class) +@Mixin(LevelRenderer.class) public interface AccessorLevelRender { - @Accessor("frustum") + @Accessor("cullingFrustum") Frustum getCullingFrustum(); @Accessor("capturedFrustum") diff --git a/src/main/java/rogo/renderingculling/mixin/AccessorMinecraft.java b/src/main/java/rogo/renderingculling/mixin/AccessorMinecraft.java index ff53d20..833f1f8 100644 --- a/src/main/java/rogo/renderingculling/mixin/AccessorMinecraft.java +++ b/src/main/java/rogo/renderingculling/mixin/AccessorMinecraft.java @@ -1,12 +1,12 @@ package rogo.renderingculling.mixin; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public interface AccessorMinecraft { - @Accessor("currentFps") + @Accessor("fps") int getFps(); } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinBlockEntityRender.java b/src/main/java/rogo/renderingculling/mixin/MixinBlockEntityRender.java index e40f9bd..56441de 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinBlockEntityRender.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinBlockEntityRender.java @@ -1,12 +1,12 @@ package rogo.renderingculling.mixin; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Vec3d; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,12 +16,11 @@ @Mixin(BlockEntityRenderDispatcher.class) public class MixinBlockEntityRender { - - @Inject(method = "render(Lnet/minecraft/block/entity/BlockEntity;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V", at=@At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;runReported(Lnet/minecraft/block/entity/BlockEntity;Ljava/lang/Runnable;)V"), cancellable = true) - public void onShouldRender(E p_112268_, float p_112269_, MatrixStack p_112270_, VertexConsumerProvider p_112271_, CallbackInfo ci) { - Box aabb = new Box(p_112268_.getPos()); - aabb.expand(Vec3d.ofCenter(p_112268_.getPos()).distanceTo(MinecraftClient.getInstance().gameRenderer.getCamera().getPos()) * 0.03125); - if(CullingHandler.INSTANCE.shouldSkipBlock(p_112268_, aabb, p_112268_.getPos())) + @Inject(method = "render", at=@At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher;tryRender(Lnet/minecraft/world/level/block/entity/BlockEntity;Ljava/lang/Runnable;)V"), cancellable = true) + public void onShouldRender(E p_112268_, float p_112269_, PoseStack p_112270_, MultiBufferSource p_112271_, CallbackInfo ci) { + AABB aabb = new AABB(p_112268_.getBlockPos()); + aabb.inflate(Vec3.atCenterOf(p_112268_.getBlockPos()).distanceTo(Minecraft.getInstance().gameRenderer.getMainCamera().getPosition()) * 0.03125); + if(CullingHandler.INSTANCE.shouldSkipBlock(p_112268_, aabb, p_112268_.getBlockPos())) ci.cancel(); } } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinEntityRender.java b/src/main/java/rogo/renderingculling/mixin/MixinEntityRender.java index 897dd9e..56f8e21 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinEntityRender.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinEntityRender.java @@ -1,8 +1,8 @@ package rogo.renderingculling.mixin; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,7 +13,7 @@ public class MixinEntityRender { @Inject(method = "shouldRender", at=@At("RETURN"), cancellable = true) public void onShouldRender(E p_114398_, Frustum p_114399_, double p_114400_, double p_114401_, double p_114402_, CallbackInfoReturnable cir) { - if(cir.getReturnValue() && !p_114398_.ignoreCameraFrustum && CullingHandler.INSTANCE.shouldSkipEntity(p_114398_)) { + if(cir.getReturnValue() && !p_114398_.noCulling && CullingHandler.INSTANCE.shouldSkipEntity(p_114398_)) { cir.setReturnValue(false); } } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinInactiveProfiler.java b/src/main/java/rogo/renderingculling/mixin/MixinInactiveProfiler.java index f97d27e..7d943c7 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinInactiveProfiler.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinInactiveProfiler.java @@ -1,16 +1,16 @@ package rogo.renderingculling.mixin; -import net.minecraft.util.profiler.DummyProfiler; +import net.minecraft.util.profiling.InactiveProfiler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import rogo.renderingculling.api.CullingHandler; -@Mixin(DummyProfiler.class) +@Mixin(InactiveProfiler.class) public class MixinInactiveProfiler { - @Inject(method = "swap(Ljava/lang/String;)V", at = @At(value = "HEAD")) + @Inject(method = "popPush(Ljava/lang/String;)V", at = @At(value = "HEAD")) public void onPopPush(String p_18395_, CallbackInfo ci) { if(CullingHandler.INSTANCE != null) CullingHandler.INSTANCE.onProfilerPopPush(p_18395_); diff --git a/src/main/java/rogo/renderingculling/mixin/MixinLevel.java b/src/main/java/rogo/renderingculling/mixin/MixinLevel.java index 135768c..4fc303f 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinLevel.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinLevel.java @@ -1,9 +1,12 @@ package rogo.renderingculling.mixin; -import net.minecraft.entity.Entity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.Box; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.TickingBlockEntity; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -14,24 +17,24 @@ import java.util.function.Consumer; -@Mixin(World.class) +@Mixin(Level.class) public abstract class MixinLevel { - @Inject(method = "tickEntity", at=@At(value = "HEAD"), cancellable = true) + @Inject(method = "guardEntityTick", at=@At(value = "HEAD"), cancellable = true) public void onEntityTick(Consumer p_46654_, T entity, CallbackInfo ci) { - if(!Config.CULL_ENTITY.getValue() || (entity.world instanceof ServerWorld)) return; - Box aabb = entity.getVisibilityBoundingBox().expand(0.5D); - if (aabb.isValid() || aabb.getAverageSideLength() == 0.0D) { - aabb = new Box(entity.getX() - 2.0D, entity.getY() - 2.0D, entity.getZ() - 2.0D, entity.getX() + 2.0D, entity.getY() + 2.0D, entity.getZ() + 2.0D); + if(!Config.CULL_ENTITY.getValue() || (entity.level instanceof ServerLevel)) return; + AABB aabb = entity.getBoundingBoxForCulling().inflate(0.5D); + if (aabb.hasNaN() || aabb.getSize() == 0.0D) { + aabb = new AABB(entity.getX() - 2.0D, entity.getY() - 2.0D, entity.getZ() - 2.0D, entity.getX() + 2.0D, entity.getY() + 2.0D, entity.getZ() + 2.0D); } if(CullingHandler.FRUSTUM != null && !CullingHandler.FRUSTUM.isVisible(aabb)) { - if(entity.age % (20-Config.CULLING_ENTITY_RATE.getValue()+1) != 0) { - entity.age++; + if(entity.tickCount % (20-Config.CULLING_ENTITY_RATE.getValue()+1) != 0) { + entity.tickCount++; ci.cancel(); } } else if(CullingHandler.INSTANCE.culledEntity.contains(entity)) { - if(entity.age % (20-Config.CULLING_ENTITY_RATE.getValue()+1) != 0) { - entity.age++; + if(entity.tickCount % (20-Config.CULLING_ENTITY_RATE.getValue()+1) != 0) { + entity.tickCount++; ci.cancel(); } } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinLevelRender.java b/src/main/java/rogo/renderingculling/mixin/MixinLevelRender.java index d3d7b76..6539e97 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinLevelRender.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinLevelRender.java @@ -1,12 +1,14 @@ package rogo.renderingculling.mixin; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.render.chunk.ChunkBuilder; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Vec3d; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,25 +22,25 @@ import java.lang.reflect.Field; -@Mixin(WorldRenderer.class) +@Mixin(LevelRenderer.class) public class MixinLevelRender implements IEntitiesForRender { @Final @Shadow - private ObjectArrayList chunkInfos; + private ObjectArrayList renderChunksInFrustum; @Inject(method = "applyFrustum", at = @At(value = "RETURN")) - public void onApplyFrustum(Frustum p_194355_, CallbackInfo ci) { + public void onapplyFrustum(Frustum p_194355_, CallbackInfo ci) { if (Config.CULL_CHUNK.getValue()) { if(CullingHandler.OptiFine != null) { try { - Field field = WorldRenderer.class.getDeclaredField("renderInfosTerrain"); + Field field = LevelRenderer.class.getDeclaredField("renderInfosTerrain"); field.setAccessible(true); Object value = field.get(this); if (value instanceof ObjectArrayList) { ((ObjectArrayList)value).removeIf((o -> { - ChunkBuilder.BuiltChunk chunk = ((IRenderChunkInfo) o).getRenderChunk(); + ChunkRenderDispatcher.RenderChunk chunk = ((IRenderChunkInfo) o).getRenderChunk(); return !CullingHandler.INSTANCE.shouldRenderChunk(chunk.getBoundingBox()); })); } @@ -46,21 +48,21 @@ public void onApplyFrustum(Frustum p_194355_, CallbackInfo ci) { } } - this.chunkInfos.removeIf((o -> { - ChunkBuilder.BuiltChunk chunk = ((IRenderChunkInfo) o).getRenderChunk(); + this.renderChunksInFrustum.removeIf((o -> { + ChunkRenderDispatcher.RenderChunk chunk = ((IRenderChunkInfo) o).getRenderChunk(); return !CullingHandler.INSTANCE.shouldRenderChunk(chunk.getBoundingBox()); })); } } - @Inject(method = "setupFrustum", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Frustum;(Lnet/minecraft/util/math/Matrix4f;Lnet/minecraft/util/math/Matrix4f;)V")) - public void onSetupFrustum(MatrixStack p_172962_, Vec3d p_172963_, Matrix4f p_172964_, CallbackInfo ci) { + @Inject(method = "prepareCullFrustum", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/culling/Frustum;(Lcom/mojang/math/Matrix4f;Lcom/mojang/math/Matrix4f;)V")) + public void onapplyFrustum(PoseStack p_172962_, Vec3 p_172963_, Matrix4f p_172964_, CallbackInfo ci) { CullingHandler.PROJECTION_MATRIX = p_172964_.copy(); } @Override public ObjectArrayList renderChunksInFrustum() { - return chunkInfos; + return renderChunksInFrustum; } } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinMinecraft.java b/src/main/java/rogo/renderingculling/mixin/MixinMinecraft.java index b852c87..1d5dba5 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinMinecraft.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinMinecraft.java @@ -1,7 +1,7 @@ package rogo.renderingculling.mixin; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -9,16 +9,16 @@ import rogo.renderingculling.api.CullingHandler; import rogo.renderingculling.event.WorldUnloadEvent; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public class MixinMinecraft { - @Inject(method = "render", at = @At(value = "RETURN")) + @Inject(method = "runTick", at = @At(value = "RETURN")) public void onRender(boolean p_91384_, CallbackInfo ci) { if(CullingHandler.INSTANCE != null) CullingHandler.INSTANCE.onProfilerPopPush("afterRunTick"); } - @Inject(method = "joinWorld", at = @At(value = "HEAD")) - public void onJoinWorld(ClientWorld world, CallbackInfo ci) { + @Inject(method = "setLevel", at = @At(value = "HEAD")) + public void onJoinWorld(ClientLevel world, CallbackInfo ci) { WorldUnloadEvent.WORLD_UNLOAD.invoker().onWorldUnload(world); } } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinRenderChunkInfo.java b/src/main/java/rogo/renderingculling/mixin/MixinRenderChunkInfo.java index fbcb285..21c7914 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinRenderChunkInfo.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinRenderChunkInfo.java @@ -1,20 +1,20 @@ package rogo.renderingculling.mixin; -import net.minecraft.client.render.chunk.ChunkBuilder; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import rogo.renderingculling.api.IRenderChunkInfo; -@Mixin(targets = "net.minecraft.client.render.WorldRenderer$ChunkInfo") +@Mixin(targets = "net.minecraft.client.renderer.LevelRenderer$RenderChunkInfo") public class MixinRenderChunkInfo implements IRenderChunkInfo { @Final @Shadow - ChunkBuilder.BuiltChunk chunk; + ChunkRenderDispatcher.RenderChunk chunk; @Override - public ChunkBuilder.BuiltChunk getRenderChunk() { + public ChunkRenderDispatcher.RenderChunk getRenderChunk() { return chunk; } } diff --git a/src/main/java/rogo/renderingculling/mixin/MixinRenderSectionManager.java b/src/main/java/rogo/renderingculling/mixin/MixinRenderSectionManager.java index 6f10b15..97ad563 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinRenderSectionManager.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinRenderSectionManager.java @@ -2,8 +2,8 @@ import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -14,7 +14,7 @@ public abstract class MixinRenderSectionManager { @Inject(method = "addVisible", at = @At(value = "HEAD"), remap = false, cancellable = true) public void onBfsEnqueue(RenderSection section, Direction flow, CallbackInfo ci) { if(!section.isEmpty() && !CullingHandler.INSTANCE.shouldRenderChunk( - new Box(section.getOriginX(), section.getOriginY(), section.getOriginZ(), (section.getOriginX() + 16), (section.getOriginY() + 16), (section.getOriginZ() + 16)))) + new AABB(section.getOriginX(), section.getOriginY(), section.getOriginZ(), (section.getOriginX() + 16), (section.getOriginY() + 16), (section.getOriginZ() + 16)))) ci.cancel(); } } \ No newline at end of file diff --git a/src/main/java/rogo/renderingculling/mixin/MixinShaderInstance.java b/src/main/java/rogo/renderingculling/mixin/MixinShaderInstance.java index fb21c6f..8c4b172 100644 --- a/src/main/java/rogo/renderingculling/mixin/MixinShaderInstance.java +++ b/src/main/java/rogo/renderingculling/mixin/MixinShaderInstance.java @@ -1,11 +1,11 @@ package rogo.renderingculling.mixin; +import com.mojang.blaze3d.shaders.Program; +import com.mojang.blaze3d.shaders.ProgramManager; +import com.mojang.blaze3d.shaders.Uniform; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gl.GlProgramManager; -import net.minecraft.client.gl.GlUniform; -import net.minecraft.client.gl.Program; -import net.minecraft.client.render.Shader; -import net.minecraft.util.Identifier; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -19,40 +19,40 @@ import rogo.renderingculling.api.ICullingShader; -@Mixin(Shader.class) +@Mixin(ShaderInstance.class) public abstract class MixinShaderInstance implements ICullingShader { @Shadow @Nullable - public GlUniform getUniform(String p_173349_) { + public Uniform getUniform(String p_173349_) { return null; } @Final @Shadow - private static String CORE_DIRECTORY; + private static String SHADER_PATH; @Nullable - public GlUniform CULLING_CAMERA_POS; + public Uniform CULLING_CAMERA_POS; @Nullable - public GlUniform RENDER_DISTANCE; + public Uniform RENDER_DISTANCE; @Nullable - public GlUniform DEPTH_SIZE; + public Uniform DEPTH_SIZE; @Nullable - public GlUniform CULLING_SIZE; + public Uniform CULLING_SIZE; @Nullable - public GlUniform ENTITY_CULLING_SIZE; + public Uniform ENTITY_CULLING_SIZE; @Nullable - public GlUniform LEVEL_HEIGHT_OFFSET; + public Uniform LEVEL_HEIGHT_OFFSET; @Nullable - public GlUniform LEVEL_MIN_SECTION; + public Uniform LEVEL_MIN_SECTION; @Nullable - public GlUniform CULLING_FRUSTUM; + public Uniform CULLING_FRUSTUM; @Nullable - public GlUniform FRUSTUM_POS; + public Uniform FRUSTUM_POS; @Nullable - public GlUniform CULLING_VIEW_MAT; + public Uniform CULLING_VIEW_MAT; @Nullable - public GlUniform CULLING_PROJ_MAT; + public Uniform CULLING_PROJ_MAT; @Final @Shadow @@ -73,21 +73,21 @@ public void construct(CallbackInfo ci) { this.CULLING_PROJ_MAT = this.getUniform("CullingProjMat"); } - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Identifier;(Ljava/lang/String;)V")) + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/resources/ResourceLocation;(Ljava/lang/String;)V")) public String onInit(String string) { - if(CullingHandler.loadShader) { - string = string.replace(CORE_DIRECTORY, ""); + if(CullingHandler.SHADER_ENABLED) { + string = string.replace(SHADER_PATH, ""); string = string.replace(".json", ""); - Identifier rl = Identifier.tryParse(string); - string = rl.getNamespace() + ":" + CORE_DIRECTORY + rl.getPath() + ".json"; + ResourceLocation rl = ResourceLocation.tryParse(string); + string = rl.getNamespace() + ":" + SHADER_PATH + rl.getPath() + ".json"; } return string; } - @ModifyArg(method = "loadProgram", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Identifier;(Ljava/lang/String;)V")) + @ModifyArg(method = "getOrCreate", at = @At(value = "INVOKE", target = "Lnet/minecraft/resources/ResourceLocation;(Ljava/lang/String;)V")) private static String onGetOrCreate(String string) { - if(CullingHandler.loadShader) { - string = string.replace(CORE_DIRECTORY, ""); + if(CullingHandler.SHADER_ENABLED) { + string = string.replace(SHADER_PATH, ""); Program.Type type = Program.Type.FRAGMENT; if(string.contains(".fsh")) string = string.replace(".fsh", ""); @@ -95,67 +95,67 @@ else if(string.contains(".vsh")) { string = string.replace(".vsh", ""); type = Program.Type.VERTEX; } - Identifier rl = Identifier.tryParse(string); - string = rl.getNamespace() + ":" + CORE_DIRECTORY + rl.getPath() + type.getFileExtension(); + ResourceLocation rl = ResourceLocation.tryParse(string); + string = rl.getNamespace() + ":" + SHADER_PATH + rl.getPath() + type.getExtension(); } return string; } @Override - public GlUniform getCullingFrustum() {return CULLING_FRUSTUM;} + public Uniform getCullingFrustum() {return CULLING_FRUSTUM;} @Override - public GlUniform getCullingCameraPos() { + public Uniform getCullingCameraPos() { return CULLING_CAMERA_POS; } @Override - public GlUniform getRenderDistance() { + public Uniform getRenderDistance() { return RENDER_DISTANCE; } @Override - public GlUniform getDepthSize() { + public Uniform getDepthSize() { return DEPTH_SIZE; } @Override - public GlUniform getCullingSize() { + public Uniform getCullingSize() { return CULLING_SIZE; } @Override - public GlUniform getLevelHeightOffset() { + public Uniform getLevelHeightOffset() { return LEVEL_HEIGHT_OFFSET; } @Override - public GlUniform getLevelMinSection() { + public Uniform getLevelMinSection() { return LEVEL_MIN_SECTION; } @Override - public GlUniform getEntityCullingSize() { + public Uniform getEntityCullingSize() { return ENTITY_CULLING_SIZE; } @Override - public GlUniform getFrustumPos() { + public Uniform getFrustumPos() { return FRUSTUM_POS; } @Override - public GlUniform getCullingViewMat() { + public Uniform getCullingViewMat() { return CULLING_VIEW_MAT; } @Override - public GlUniform getCullingProjMat() { + public Uniform getCullingProjMat() { return CULLING_PROJ_MAT; } - @Inject(at = @At("TAIL"), method = "bind") + @Inject(at = @At("TAIL"), method = "apply") public void onApply(CallbackInfo ci) { if(CullingHandler.updatingDepth) - GlProgramManager.useProgram(this.programId); + ProgramManager.glUseProgram(this.programId); } @Mixin(RenderSystem.class) public static class MixinRenderSystem { @Inject(at = @At(value = "TAIL"), method = "setupShaderLights") - private static void shader(Shader p_157462_, CallbackInfo ci) { + private static void shader(ShaderInstance p_157462_, CallbackInfo ci) { CullingRenderEvent.setUniform(p_157462_); } } diff --git a/src/main/java/rogo/renderingculling/util/DepthContext.java b/src/main/java/rogo/renderingculling/util/DepthContext.java new file mode 100644 index 0000000..9177a89 --- /dev/null +++ b/src/main/java/rogo/renderingculling/util/DepthContext.java @@ -0,0 +1,5 @@ +package rogo.renderingculling.util; + +import com.mojang.blaze3d.pipeline.RenderTarget; + +public record DepthContext(RenderTarget frame, int index, float scale, int lastTexture) {} diff --git a/src/main/java/rogo/renderingculling/util/IrisLoaderImpl.java b/src/main/java/rogo/renderingculling/util/IrisLoaderImpl.java index 02cbecd..364c3ad 100644 --- a/src/main/java/rogo/renderingculling/util/IrisLoaderImpl.java +++ b/src/main/java/rogo/renderingculling/util/IrisLoaderImpl.java @@ -1,12 +1,13 @@ package rogo.renderingculling.util; +import com.mojang.blaze3d.platform.GlStateManager; import net.coderbot.iris.Iris; import net.coderbot.iris.gl.framebuffer.GlFramebuffer; import net.coderbot.iris.pipeline.SodiumTerrainPipeline; import net.coderbot.iris.pipeline.WorldRenderingPipeline; import net.coderbot.iris.pipeline.newshader.NewWorldRenderingPipeline; import net.irisshaders.iris.api.v0.IrisApi; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import java.lang.reflect.Field; @@ -32,7 +33,7 @@ public int getFrameBufferID() { } } - return MinecraftClient.getInstance().getFramebuffer().fbo; + return Minecraft.getInstance().getMainRenderTarget().frameBufferId; } @Override @@ -42,6 +43,6 @@ public boolean renderingShader() { @Override public void bindDefaultFrameBuffer() { - MinecraftClient.getInstance().getFramebuffer().beginWrite(true); + Minecraft.getInstance().getMainRenderTarget().bindWrite(true); } } \ No newline at end of file diff --git a/src/main/java/rogo/renderingculling/util/OptiFineLoaderImpl.java b/src/main/java/rogo/renderingculling/util/OptiFineLoaderImpl.java index 1df9449..615613c 100644 --- a/src/main/java/rogo/renderingculling/util/OptiFineLoaderImpl.java +++ b/src/main/java/rogo/renderingculling/util/OptiFineLoaderImpl.java @@ -1,7 +1,7 @@ package rogo.renderingculling.util; import com.mojang.blaze3d.platform.GlStateManager; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import rogo.renderingculling.api.CullingHandler; import java.lang.reflect.Field; @@ -22,7 +22,7 @@ public int getFrameBufferID() { e.fillInStackTrace(); } - return MinecraftClient.getInstance().getFramebuffer().fbo; + return Minecraft.getInstance().getMainRenderTarget().frameBufferId; } @Override @@ -53,11 +53,11 @@ public void bindDefaultFrameBuffer() { Field glFramebuffer = buffer.getClass().getDeclaredField("glFramebuffer"); glFramebuffer.setAccessible(true); GlStateManager._glBindFramebuffer(36160, (int) glFramebuffer.get(buffer)); - GlStateManager._viewport(0, 0, MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight); + GlStateManager._viewport(0, 0, Minecraft.getInstance().getMainRenderTarget().viewWidth, Minecraft.getInstance().getMainRenderTarget().viewHeight); return; } catch (NoSuchFieldException | IllegalAccessException e) { e.fillInStackTrace(); } - MinecraftClient.getInstance().getFramebuffer().beginWrite(true); + Minecraft.getInstance().getMainRenderTarget().bindWrite(true); } } diff --git a/src/main/resources/assets/brute_force_rendering_culling/lang/en_us.json b/src/main/resources/assets/brute_force_rendering_culling/lang/en_us.json index 6538601..04100bd 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/lang/en_us.json +++ b/src/main/resources/assets/brute_force_rendering_culling/lang/en_us.json @@ -20,5 +20,8 @@ "brute_force_rendering_culling.culling_entity_update_rate": "Culled entity update frequency", "brute_force_rendering_culling.enable": "Enable", - "brute_force_rendering_culling.disable": "Disable" + "brute_force_rendering_culling.disable": "Disable", + + "brute_force_rendering_culling.skip_culling_entities": "Entities that skip culling", + "brute_force_rendering_culling.skip_culling_block_entities": "Block Entities that skip culling" } \ No newline at end of file diff --git a/src/main/resources/assets/brute_force_rendering_culling/lang/zh_cn.json b/src/main/resources/assets/brute_force_rendering_culling/lang/zh_cn.json index dd3cc37..01fbd9b 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/lang/zh_cn.json +++ b/src/main/resources/assets/brute_force_rendering_culling/lang/zh_cn.json @@ -20,5 +20,8 @@ "brute_force_rendering_culling.culling_entity_update_rate": "被剔除实体更新频率", "brute_force_rendering_culling.enable": "开启", - "brute_force_rendering_culling.disable": "关闭" + "brute_force_rendering_culling.disable": "关闭", + + "brute_force_rendering_culling.skip_culling_entities": "不被剔除的实体", + "brute_force_rendering_culling.skip_culling_block_entities": "不被剔除的方块实体" } \ No newline at end of file diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.fsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.fsh index 2ccb824..4e34702 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.fsh +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.fsh @@ -1,9 +1,11 @@ #version 150 -uniform sampler2D Sampler7; +uniform sampler2D Sampler0; +uniform sampler2D Sampler1; +uniform sampler2D Sampler2; +uniform sampler2D Sampler3; uniform vec2 CullingSize; -uniform vec2 DepthSize; uniform mat4 CullingViewMat; uniform mat4 CullingProjMat; uniform vec3 CullingCameraPos; @@ -14,12 +16,25 @@ uniform int LevelMinSection; flat in int spacePartitionSize; flat in vec4[6] frustum; +flat in vec2[4] DepthScreenSize; out vec4 fragColor; float near = 0.1; float far = 1000.0; +int getSampler(float xLength, float yLength) { + for(int i = 0; i < DepthScreenSize.length(); ++i) { + float xStep = 3.0 / DepthScreenSize[i].x; + float yStep = 3.0 / DepthScreenSize[i].y; + if(xStep > xLength && yStep > yLength) { + return i; + } + } + + return DepthScreenSize.length() - 1; +} + float LinearizeDepth(float depth) { float z = depth * 2.0 - 1.0; return (near * far) / (far + near - z * (far - near)); @@ -82,6 +97,17 @@ bool isVisible(vec3 vec) { return calculateCube(minX, minY, minZ, maxX, maxY, maxZ); } +float getUVDepth(int idx, vec2 uv) { + if(idx == 0) + return texture(Sampler0, uv).r * 500; + else if(idx == 1) + return texture(Sampler1, uv).r * 500; + else if(idx == 2) + return texture(Sampler2, uv).r * 500; + + return texture(Sampler3, uv).r * 500; +} + void main() { int screenIndex = int(gl_FragCoord.x) + int(gl_FragCoord.y) * int(CullingSize.x); int renderDistance = int(RenderDistance); @@ -141,8 +167,12 @@ void main() { return; } - float xStep = 1.0/DepthSize.x; - float yStep = 1.0/DepthSize.y; + int idx = getSampler( + min(1.0, max(0.0, maxX))-min(1.0, max(0.0, minX)), + min(1.0, max(0.0, maxY))-min(1.0, max(0.0, minY))); + + float xStep = 1.0/DepthScreenSize[idx].x; + float yStep = 1.0/DepthScreenSize[idx].y; minX = min(1.0, max(0.0, minX-xStep)); maxX = min(1.0, max(0.0, maxX+xStep)); @@ -151,7 +181,7 @@ void main() { for(float x = minX; x <= maxX; x += xStep) { for(float y = minY; y <= maxY; y += yStep) { - float pixelDepth = texture(Sampler7, vec2(x, y)).r * 500; + float pixelDepth = getUVDepth(idx, vec2(x, y)); if(chunkDepth < pixelDepth) { fragColor = vec4(0.0, 1.0, 0.0, 1.0); return; diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.json b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.json index bdf5e0b..29ff5f5 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.json +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.json @@ -10,13 +10,16 @@ "Position" ], "samplers": [ - { "name": "Sampler7" } + { "name": "Sampler0" }, + { "name": "Sampler1" }, + { "name": "Sampler2" }, + { "name": "Sampler3" } ], "uniforms": [ { "name": "CullingViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "CullingProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "CullingSize", "type": "float", "count": 2, "values": [1.0, 1.0] }, - { "name": "DepthSize", "type": "float", "count": 2, "values": [1.0, 1.0] }, + { "name": "DepthSize", "type": "float", "count": 8, "values": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] }, { "name": "CullingCameraPos", "type": "float", "count": 3, "values": [ 1.0, 1.0, 1.0] }, { "name": "FrustumPos", "type": "float", "count": 3, "values": [ 1.0, 1.0, 1.0] }, { "name": "RenderDistance", "type": "float", "count": 1, "values": [ 0.0] }, diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.vsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.vsh index a205f3c..d1dd3b5 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.vsh +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/chunk_culling.vsh @@ -6,10 +6,12 @@ in vec3 Position; uniform float[24] CullingFrustum; +uniform float[8] DepthSize; uniform float RenderDistance; flat out int spacePartitionSize; flat out vec4[6] frustum; +flat out vec2[4] DepthScreenSize; void main() { spacePartitionSize = 2 * int(RenderDistance) + 1; @@ -22,6 +24,13 @@ void main() { vec4(CullingFrustum[20], CullingFrustum[21], CullingFrustum[22], CullingFrustum[23]) ); + DepthScreenSize = vec2[]( + vec2(DepthSize[0], DepthSize[1]), + vec2(DepthSize[2], DepthSize[3]), + vec2(DepthSize[4], DepthSize[5]), + vec2(DepthSize[6], DepthSize[7]) + ); + frustum = frustumData; gl_Position = vec4(Position, 1.0); } diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.fsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.fsh index 321fe67..de84a6d 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.fsh +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.fsh @@ -1,9 +1,9 @@ #version 150 uniform sampler2D Sampler0; +uniform float RenderDistance; -uniform vec2 DepthSize; - +flat in vec2 DepthScreenSize; flat in float xStep; flat in float yStep; @@ -18,10 +18,10 @@ float LinearizeDepth(float depth) { } void main() { - float minX = gl_FragCoord.x / DepthSize.x; - float minY = gl_FragCoord.y / DepthSize.y; - float maxX = min(gl_FragCoord.x+1, DepthSize.x)/DepthSize.x; - float maxY = min(gl_FragCoord.y+1, DepthSize.y)/DepthSize.y; + float minX = gl_FragCoord.x / DepthScreenSize.x; + float minY = gl_FragCoord.y / DepthScreenSize.y; + float maxX = min(gl_FragCoord.x+1, DepthScreenSize.x)/DepthScreenSize.x; + float maxY = min(gl_FragCoord.y+1, DepthScreenSize.y)/DepthScreenSize.y; float depth; for(float x = minX; x <= maxX; x+=xStep) { @@ -31,5 +31,9 @@ void main() { } } - fragColor = vec4(vec3(LinearizeDepth(depth)/500.0), 1.0); + if(RenderDistance > 1) { + fragColor = vec4(vec3(depth), 1.0); + } else { + fragColor = vec4(vec3(LinearizeDepth(depth)/500.0), 1.0); + } } diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.json b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.json index 64a6267..48a391e 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.json +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.json @@ -14,6 +14,7 @@ ], "uniforms": [ { "name": "ScreenSize", "type": "float", "count": 2, "values": [1.0, 1.0] }, - { "name": "DepthSize", "type": "float", "count": 2, "values": [1.0, 1.0] } + { "name": "DepthSize", "type": "float", "count": 8, "values": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] }, + { "name": "RenderDistance", "type": "float", "count": 1, "values": [ 0.0] } ] } diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.vsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.vsh index 77a48ca..ec457da 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.vsh +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/copy_depth.vsh @@ -3,12 +3,15 @@ in vec3 Position; uniform vec2 ScreenSize; +uniform float[10] DepthSize; flat out float xStep; flat out float yStep; +flat out vec2 DepthScreenSize; void main() { xStep = 1.0/ScreenSize.x; yStep = 1.0/ScreenSize.y; + DepthScreenSize = vec2(DepthSize[0], DepthSize[1]); gl_Position = vec4(Position, 1.0); } diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/entity_culling.fsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/entity_culling.fsh index f5ae322..e5ad123 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/entity_culling.fsh +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/entity_culling.fsh @@ -1,23 +1,38 @@ #version 150 -uniform sampler2D Sampler7; - uniform vec2 EntityCullingSize; -uniform vec2 DepthSize; uniform mat4 CullingViewMat; uniform mat4 CullingProjMat; uniform float DepthOffset; uniform vec3 FrustumPos; +uniform sampler2D Sampler0; +uniform sampler2D Sampler1; +uniform sampler2D Sampler2; +uniform sampler2D Sampler3; + flat in vec3 Pos; flat in vec2 Size; flat in vec4[6] frustum; +flat in vec2[4] DepthScreenSize; out vec4 fragColor; float near = 0.1; float far = 1000.0; +int getSampler(float xLength, float yLength) { + for(int i = 0; i < DepthScreenSize.length(); ++i) { + float xStep = 3.0 / DepthScreenSize[i].x; + float yStep = 3.0 / DepthScreenSize[i].y; + if(xStep > xLength && yStep > yLength) { + return i; + } + } + + return DepthScreenSize.length() - 1; +} + float LinearizeDepth(float depth) { float z = depth * 2.0 - 1.0; return (near * far) / (far + near - z * (far - near)); @@ -72,6 +87,17 @@ bool isVisible(vec3 vec, float width, float height) { return calculateCube(minX, minY, minZ, maxX, maxY, maxZ); } +float getUVDepth(int idx, vec2 uv) { + if(idx == 0) + return texture(Sampler0, uv).r * 500; + else if(idx == 1) + return texture(Sampler1, uv).r * 500; + else if(idx == 2) + return texture(Sampler2, uv).r * 500; + + return texture(Sampler3, uv).r * 500; +} + void main() { float halfWidth = Size.x*0.5; float halfHeight = Size.y*0.5; @@ -118,8 +144,12 @@ void main() { return; } - float xStep = 1.0/DepthSize.x; - float yStep = 1.0/DepthSize.y; + int idx = getSampler( + min(1.0, max(0.0, maxX))-min(1.0, max(0.0, minX)), + min(1.0, max(0.0, maxY))-min(1.0, max(0.0, minY))); + + float xStep = 1.0/DepthScreenSize[idx].x; + float yStep = 1.0/DepthScreenSize[idx].y; minX = min(1.0, max(0.0, minX-xStep)); maxX = min(1.0, max(0.0, maxX+xStep)); @@ -128,7 +158,7 @@ void main() { for(float x = minX; x <= maxX; x += xStep) { for(float y = minY; y <= maxY; y += yStep) { - float pixelDepth = texture(Sampler7, vec2(x, y)).r * 500; + float pixelDepth = getUVDepth(idx, vec2(x, y)); if(entityDepth < pixelDepth) { fragColor = vec4(0.0, 1.0, 0.0, 1.0); return; diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.json b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.json index 399c04b..659096a 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.json +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.json @@ -8,14 +8,16 @@ "fragment": "brute_force_rendering_culling:entity_culling", "attributes": [], "samplers": [ - { "name": "Sampler7" } + { "name": "Sampler0" }, + { "name": "Sampler1" }, + { "name": "Sampler2" }, + { "name": "Sampler3" } ], "uniforms": [ { "name": "CullingViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "CullingProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "EntityCullingSize", "type": "float", "count": 2, "values": [1.0, 1.0] }, - { "name": "DepthSize", "type": "float", "count": 2, "values": [1.0, 1.0] }, - { "name": "DepthOffset", "type": "float", "count": 1, "values": [ 0.0] }, + { "name": "DepthSize", "type": "float", "count": 8, "values": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] }, { "name": "FrustumPos", "type": "float", "count": 3, "values": [ 1.0, 1.0, 1.0] }, { "name": "CullingFrustum", "type": "float", "count": 24, "values": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] } ] diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.vsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.vsh index 6d741dd..ea6a46e 100644 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.vsh +++ b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/instanced_entity_culling.vsh @@ -8,8 +8,10 @@ layout (location=3) in vec3 EntityCenter; uniform vec2 EntityCullingSize; uniform float[24] CullingFrustum; +uniform float[8] DepthSize; flat out vec4[6] frustum; +flat out vec2[4] DepthScreenSize; flat out vec3 Pos; flat out vec2 Size; @@ -19,7 +21,7 @@ void main() { int x = int(index - (y*EntityCullingSize.x)); vec2 pos = vec2((2.0 * (float(x)+0.5) / EntityCullingSize.x) - 1.0, (2.0 * (float(y)+0.5) / EntityCullingSize.y) - 1.0); - vec4[6] frustumData = vec4[]( + vec4[6] frustumData = vec4[]( vec4(CullingFrustum[0], CullingFrustum[1], CullingFrustum[2], CullingFrustum[3]), vec4(CullingFrustum[4], CullingFrustum[5], CullingFrustum[6], CullingFrustum[7]), vec4(CullingFrustum[8], CullingFrustum[9], CullingFrustum[10], CullingFrustum[11]), @@ -28,6 +30,13 @@ void main() { vec4(CullingFrustum[20], CullingFrustum[21], CullingFrustum[22], CullingFrustum[23]) ); + DepthScreenSize = vec2[]( + vec2(DepthSize[0], DepthSize[1]), + vec2(DepthSize[2], DepthSize[3]), + vec2(DepthSize[4], DepthSize[5]), + vec2(DepthSize[6], DepthSize[7]) + ); + frustum = frustumData; gl_Position = vec4(pixelPos.x + pos.x, pixelPos.y + pos.y, 0.0, 1.0); Pos = EntityCenter; diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.fsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.fsh deleted file mode 100644 index 7ab057f..0000000 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.fsh +++ /dev/null @@ -1,21 +0,0 @@ -#version 150 - -uniform sampler2D Sampler7; - -uniform vec2 DepthSize; - -out vec4 fragColor; - -float near = 0.1; -float far = 1000.0; - -float LinearizeDepth(float depth) { - return depth*500; -} - -void main() { - vec2 screenUV = vec2(gl_FragCoord.x / DepthSize.x, gl_FragCoord.y / DepthSize.y); - float pixelDepth = LinearizeDepth(texture(Sampler7, screenUV).r); - - fragColor = vec4(vec3(pixelDepth/500.0), 1.0); -} diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.json b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.json deleted file mode 100644 index de7a07b..0000000 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "brute_force_rendering_culling:linearize_depth", - "fragment": "brute_force_rendering_culling:linearize_depth", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "Sampler7" } - ], - "uniforms": [ - { "name": "DepthSize", "type": "float", "count": 2, "values": [1.0, 1.0] } - ] -} diff --git a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.vsh b/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.vsh deleted file mode 100644 index ca7c322..0000000 --- a/src/main/resources/assets/brute_force_rendering_culling/shaders/core/linearize_depth.vsh +++ /dev/null @@ -1,7 +0,0 @@ -#version 150 - -in vec3 Position; - -void main() { - gl_Position = vec4(Position, 1.0); -}