diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java index 3aeeab7d6..c88795ded 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.common.wrappers; import com.seibel.distanthorizons.common.wrappers.gui.ClassicConfigGUI; import com.seibel.distanthorizons.common.wrappers.gui.LangWrapper; import com.seibel.distanthorizons.common.wrappers.level.KeyedClientLevelManager; +import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftGLWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper; import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; import com.seibel.distanthorizons.core.wrapperInterfaces.config.IConfigGui; @@ -32,6 +33,7 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; @@ -69,6 +71,7 @@ public class DependencySetup SingletonInjector.INSTANCE.bind(IMinecraftClientWrapper.class, MinecraftClientWrapper.INSTANCE); SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftClientWrapper.INSTANCE); SingletonInjector.INSTANCE.bind(IMinecraftRenderWrapper.class, MinecraftRenderWrapper.INSTANCE); + SingletonInjector.INSTANCE.bind(IMinecraftGLWrapper.class, MinecraftGLWrapper.INSTANCE); SingletonInjector.INSTANCE.bind(IConfigGui.class, ClassicConfigGUI.CONFIG_CORE_INTERFACE); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftGLWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftGLWrapper.java new file mode 100644 index 000000000..6e7bd45a7 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftGLWrapper.java @@ -0,0 +1,192 @@ +/* + * This file is part of the Distant Horizons mod + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020-2023 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.distanthorizons.common.wrappers.minecraft; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.platform.NativeImage; +import com.seibel.distanthorizons.common.wrappers.WrapperFactory; +import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; +import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.ColorUtil; +import com.seibel.distanthorizons.core.util.math.Vec3d; +import com.seibel.distanthorizons.core.util.math.Vec3f; +import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.material.FogType; +import net.minecraft.world.phys.Vec3; +import org.apache.logging.log4j.Logger; +import org.joml.Vector4f; +import org.lwjgl.opengl.GL32; +import org.lwjgl.system.NativeType; + +import java.awt.*; +import java.lang.invoke.MethodHandles; +import java.util.concurrent.ConcurrentHashMap; + + +/** + * A singleton that contains everything + * related to rendering in Minecraft. + * + * @author James Seibel + * @version 12-12-2021 + */ +//@Environment(EnvType.CLIENT) +public class MinecraftGLWrapper implements IMinecraftGLWrapper +{ + public static final MinecraftGLWrapper INSTANCE = new MinecraftGLWrapper(); + + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + + + + /* + private static final StencilState STENCIL; + */ + + + // scissor // + + /** @see GL32#GL_SCISSOR_TEST */ + @Override + public void enableScissorTest() { GlStateManager._enableScissorTest(); } + /** @see GL32#GL_SCISSOR_TEST */ + @Override + public void disableScissorTest() { GlStateManager._disableScissorTest(); } + + + // stencil // +// +// /** @see GL32#GL_SCISSOR_TEST */ +// public void enableScissorTest() { GlStateManager._stencilFunc(); } +// /** @see GL32#GL_SCISSOR_TEST */ +// public void disableScissorTest() { GlStateManager._disableScissorTest(); } + + + // depth // + + /** @see GL32#GL_DEPTH_TEST */ + @Override + public void enableDepthTest() { GlStateManager._enableDepthTest(); } + /** @see GL32#GL_DEPTH_TEST */ + @Override + public void disableDepthTest() { GlStateManager._disableDepthTest(); } + + /** @see GL32#glDepthFunc(int) */ + @Override + public void glDepthFunc(int func) { GlStateManager._depthFunc(func); } + + /** @see GL32#glDepthMask(boolean) */ + @Override + public void enableDepthMask() { GlStateManager._depthMask(true); } + /** @see GL32#glDepthMask(boolean) */ + @Override + public void disableDepthMask() { GlStateManager._depthMask(false); } + + + // blending // + + /** @see GL32#GL_BLEND */ + @Override + public void enableBlend() { GlStateManager._enableBlend(); } + /** @see GL32#GL_BLEND */ + @Override + public void disableBlend() { GlStateManager._disableBlend(); } + + /** @see GL32#glBlendFunc */ + @Override + public void glBlendFunc(int sfactor, int dfactor) { GlStateManager._blendFunc(sfactor, dfactor); } + /** @see GL32#glBlendFuncSeparate */ + @Override + public void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha) + { GlStateManager._blendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } + + + // frame buffers // + + /** @see GL32#glBindFramebuffer */ + @Override + public void glBindFramebuffer(int target, int framebuffer) + { GlStateManager._glBindFramebuffer(target, framebuffer); } + + + // buffers // + + /** @see GL32#glGenBuffers() */ + @Override + public int glGenBuffers() + { return GlStateManager._glGenBuffers(); } + + /** @see GL32#glDeleteBuffers(int) */ + @Override + public void glDeleteBuffers(int buffer) + { GlStateManager._glDeleteBuffers(buffer); } + + + // culling // + + /** @see GL32#GL_CULL_FACE */ + @Override + public void enableFaceCulling() { GlStateManager._enableCull(); } + /** @see GL32#GL_CULL_FACE */ + @Override + public void disableFaceCulling() { GlStateManager._disableCull(); } + + + // textures // + + /** @see GL32#glGenTextures() */ + @Override + public int glGenTextures() { return GlStateManager._genTexture(); } + /** @see GL32#glDeleteTextures(int) */ + @Override + public void glDeleteTextures(int texture) { GlStateManager._deleteTexture(texture); } + + /** @see GL32#glActiveTexture(int) */ + @Override + public void glActiveTexture(int textureId) { GlStateManager._activeTexture(textureId); } + /** only works for textures bound via this system or MC's {@link GlStateManager} */ + @Override + public int getActiveTexture() { return GlStateManager._getActiveTexture(); } + + /** + * Always binds to {@link GL32#GL_TEXTURE_2D} + * @see GL32#glBindTexture(int, int) + */ + @Override + public void glBindTexture(int texture) { GlStateManager._bindTexture(texture); } + + + + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java index ac0db1873..59b904b75 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java @@ -20,7 +20,8 @@ package com.seibel.distanthorizons.common.wrappers.misc; import com.mojang.blaze3d.platform.NativeImage; -import com.seibel.distanthorizons.core.render.glObject.GLState; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; import org.lwjgl.opengl.GL32; @@ -28,6 +29,8 @@ import java.nio.ByteBuffer; public class LightMapWrapper implements ILightMapWrapper { + private static final IMinecraftGLWrapper GLMC = SingletonInjector.INSTANCE.get(IMinecraftGLWrapper.class); + private int textureId = 0; @@ -46,22 +49,22 @@ public class LightMapWrapper implements ILightMapWrapper public void uploadLightmap(NativeImage image) { - int currentBind = GL32.glGetInteger(GL32.GL_TEXTURE_BINDING_2D); + int currentTexture = GLMC.getActiveTexture(); if (this.textureId == 0) { this.createLightmap(image); } else { - GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); + GLMC.glBindTexture(this.textureId); } image.upload(0, 0, 0, false); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, currentBind); + GLMC.glBindTexture(currentTexture); } private void createLightmap(NativeImage image) { - this.textureId = GL32.glGenTextures(); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); + this.textureId = GLMC.glGenTextures(); + GLMC.glBindTexture(this.textureId); GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, image.format().glFormat(), image.getWidth(), image.getHeight(), 0, image.format().glFormat(), GL32.GL_UNSIGNED_BYTE, (ByteBuffer) null); } @@ -81,12 +84,12 @@ public class LightMapWrapper implements ILightMapWrapper @Override public void bind() { - GL32.glActiveTexture(GL32.GL_TEXTURE0); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); + GLMC.glActiveTexture(GL32.GL_TEXTURE0); + GLMC.glBindTexture(this.textureId); } @Override - public void unbind() { GL32.glBindTexture(GL32.GL_TEXTURE_2D, 0); } + public void unbind() { GLMC.glBindTexture(0); } } diff --git a/coreSubProjects b/coreSubProjects index 54dd65b0a..821fa086e 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 54dd65b0a37a7e9f8478ddbfd5f6ad74df47fdc9 +Subproject commit 821fa086e66531dec7ca8dfff66a1ca605957161 diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java index c8b9d15d3..c49aea75e 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java @@ -25,7 +25,6 @@ import com.mojang.blaze3d.platform.NativeImage; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; -import com.seibel.distanthorizons.core.render.glObject.GLState; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import net.minecraft.client.renderer.LightTexture;