From d440325b2abc61ae2542bee2c22d469d69b5ab7b Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Tue, 25 Aug 2020 15:36:43 +0200 Subject: [PATCH] Shader works partially --- .../render/BlockPreviewRenderer.java | 59 +----------- .../render/BuildRenderTypes.java | 96 +++++++++++++++---- .../render/RenderHandler.java | 25 ++--- 3 files changed, 90 insertions(+), 90 deletions(-) diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java index e99d616..0265de9 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java @@ -71,9 +71,6 @@ public class BlockPreviewRenderer { private static List placedDataList = new ArrayList<>(); - private static final int primaryTextureUnit = 0; - private static final int secondaryTextureUnit = 2; - public static void render(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, PlayerEntity player, ModifierSettings modifierSettings, ModeSettings modeSettings) { //Render placed blocks with dissolve effect @@ -316,10 +313,7 @@ public class BlockPreviewRenderer { if ((!checkCanPlace /*&& player.world.getNewBlockState(blockPos) == blockState*/) || //TODO enable (breaks the breaking shader) SurvivalHelper.canPlace(player.world, player, blockPos, blockState, itemstack, modifierSettings.doQuickReplace(), Direction.UP)) { -// ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, -// new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos), -// blockPos == secondPos, red)); - RenderHandler.renderBlockPreview(matrixStack, renderTypeBuffer, dispatcher, blockPos, blockState); + RenderHandler.renderBlockPreview(matrixStack, renderTypeBuffer, dispatcher, blockPos, blockState, dissolve, firstPos, secondPos, red); blocksValid++; } } @@ -376,57 +370,6 @@ public class BlockPreviewRenderer { } - private static Consumer generateShaderCallback(final float dissolve, final Vec3d blockpos, - final Vec3d firstpos, final Vec3d secondpos, - final boolean highlight, final boolean red) { - Minecraft mc = Minecraft.getInstance(); - return (Integer shader) -> { - int percentileUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "dissolve"); - int highlightUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "highlight"); - int redUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "red"); - int blockposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "blockpos"); - int firstposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "firstpos"); - int secondposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "secondpos"); - int imageUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "image"); - int maskUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "mask"); - - RenderSystem.enableTexture(); - GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - - //mask - ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit); - glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit); - mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture(); - //GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId()); - - //image - ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit); - glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit); - mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).bindTexture(); - //GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId()); - - //blockpos - ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z); - ARBShaderObjects.glUniform3fARB(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z); - ARBShaderObjects.glUniform3fARB(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z); - - //dissolve - ARBShaderObjects.glUniform1fARB(percentileUniform, dissolve); - //highlight - ARBShaderObjects.glUniform1iARB(highlightUniform, highlight ? 1 : 0); - //red - ARBShaderObjects.glUniform1iARB(redUniform, red ? 1 : 0); - }; - } - - public static void glActiveTexture(int texture) { - if (GL.getCapabilities().GL_ARB_multitexture && !GL.getCapabilities().OpenGL13) { - ARBMultitexture.glActiveTextureARB(texture); - } else { - GL13.glActiveTexture(texture); - } - - } private static void sortOnDistanceToPlayer(List coordinates, PlayerEntity player) { diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java b/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java index bb0299a..4623ab7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java @@ -2,14 +2,18 @@ package nl.requios.effortlessbuilding.render; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderState; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.fml.common.ObfuscationReflectionHelper; -import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.*; import java.util.OptionalDouble; +import java.util.function.Consumer; public class BuildRenderTypes { public static final RenderState.TransparencyState TRANSLUCENT_TRANSPARENCY; @@ -27,22 +31,15 @@ public class BuildRenderTypes { public static final RenderState.WriteMaskState WRITE_TO_DEPTH_AND_COLOR; public static final RenderState.WriteMaskState COLOR_WRITE; - public static final RenderState.TransparencyState MY_TRANSPARENCY; - public static final RenderType LINES; public static final RenderType PLANES; - public static final RenderType BLOCK_PREVIEWS; + + private static final int primaryTextureUnit = 0; + private static final int secondaryTextureUnit = 2; static { TRANSLUCENT_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_"); NO_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228510_b_"); - MY_TRANSPARENCY = new RenderState.TransparencyState("eb_transparency", () -> { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - }, () -> { - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - }); DIFFUSE_LIGHTING_ENABLED = new RenderState.DiffuseLightingState(true); DIFFUSE_LIGHTING_DISABLED = new RenderState.DiffuseLightingState(false); @@ -92,7 +89,10 @@ public class BuildRenderTypes { PLANES = RenderType.makeType("eb_planes", DefaultVertexFormats.POSITION_COLOR, GL11.GL_TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, renderState); - //BLOCK PREVIEWS + } + + public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos, + BlockPos secondPos, boolean red) { // RenderSystem.pushLightingAttributes(); // RenderSystem.pushTextureAttributes(); // RenderSystem.enableCull(); @@ -105,8 +105,20 @@ public class BuildRenderTypes { //end // ShaderHandler.releaseShader(); - renderState = RenderType.State.getBuilder() - .texture(new RenderState.TextureState(AtlasTexture.LOCATION_BLOCKS_TEXTURE, false, false)) + //highjacking texturing state (which does nothing by default) to do my own things + RenderState.TexturingState MY_TEXTURING = new RenderState.TexturingState("eb_texturing", () -> { +// RenderSystem.pushLightingAttributes(); +// RenderSystem.pushTextureAttributes(); + ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos), blockPos == secondPos, red)); + + RenderSystem.blendColor(1f, 1f, 1f, 0.8f); + }, () -> { + ShaderHandler.releaseShader(); + }); + + RenderType.State renderState = RenderType.State.getBuilder() + .texture(new RenderState.TextureState(ShaderHandler.shaderMaskTextureLocation, false, false)) + .texturing(MY_TEXTURING) .transparency(TRANSLUCENT_TRANSPARENCY) .diffuseLighting(DIFFUSE_LIGHTING_DISABLED) .alpha(DEFAULT_ALPHA) @@ -114,8 +126,60 @@ public class BuildRenderTypes { .lightmap(new RenderState.LightmapState(false)) .overlay(new RenderState.OverlayState(false)) .build(true); - BLOCK_PREVIEWS = RenderType.makeType("eb_block_previews", - DefaultVertexFormats.BLOCK, GL11.GL_QUADS, INITIAL_BUFFER_SIZE, true, true, renderState); + return RenderType.makeType("eb_block_previews", + DefaultVertexFormats.BLOCK, GL11.GL_QUADS, 256, true, true, renderState); } + + private static Consumer generateShaderCallback(final float dissolve, final Vec3d blockpos, + final Vec3d firstpos, final Vec3d secondpos, + final boolean highlight, final boolean red) { + Minecraft mc = Minecraft.getInstance(); + return (Integer shader) -> { + int percentileUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "dissolve"); + int highlightUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "highlight"); + int redUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "red"); + int blockposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "blockpos"); + int firstposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "firstpos"); + int secondposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "secondpos"); + int imageUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "image"); + int maskUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "mask"); + + RenderSystem.enableTexture(); + GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + + //mask + ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit); + glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit); + mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture(); + //GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId()); + + //image + ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit); + glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit); + mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).bindTexture(); + //GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId()); + + //blockpos + ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z); + ARBShaderObjects.glUniform3fARB(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z); + ARBShaderObjects.glUniform3fARB(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z); + + //dissolve + ARBShaderObjects.glUniform1fARB(percentileUniform, dissolve); + //highlight + ARBShaderObjects.glUniform1iARB(highlightUniform, highlight ? 1 : 0); + //red + ARBShaderObjects.glUniform1iARB(redUniform, red ? 1 : 0); + }; + } + + public static void glActiveTexture(int texture) { + if (GL.getCapabilities().GL_ARB_multitexture && !GL.getCapabilities().OpenGL13) { + ARBMultitexture.glActiveTextureARB(texture); + } else { + GL13.glActiveTexture(texture); + } + + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java index 4274dc6..69d039e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java @@ -174,16 +174,8 @@ public class RenderHandler { renderTypeBuffer.finish(); } - protected static IVertexBuilder beginBlockPreviews(IRenderTypeBuffer.Impl renderTypeBuffer) { -// return renderTypeBuffer.getBuffer(Atlases.getTranslucentBlockType()); - return renderTypeBuffer.getBuffer(BuildRenderTypes.BLOCK_PREVIEWS); - } - - protected static void endBlockPreviews(IRenderTypeBuffer.Impl renderTypeBuffer) { - renderTypeBuffer.finish(); - } - - protected static void renderBlockPreview(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, BlockRendererDispatcher dispatcher, BlockPos blockPos, BlockState blockState) { + protected static void renderBlockPreview(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, BlockRendererDispatcher dispatcher, + BlockPos blockPos, BlockState blockState, float dissolve, BlockPos firstPos, BlockPos secondPos, boolean red) { if (blockState == null) return; matrixStack.push(); @@ -192,8 +184,10 @@ public class RenderHandler { matrixStack.translate(-0.01f, -0.01f, -0.01f); matrixStack.scale(1.02f, 1.02f, 1.02f); - IVertexBuilder buffer = RenderHandler.beginBlockPreviews(renderTypeBuffer); -// RenderType renderType = RenderTypeLookup.getRenderType(blockState); + //Begin block preview rendering + RenderType blockPreviewRenderType = BuildRenderTypes.getBlockPreviewRenderType(dissolve, blockPos, firstPos, secondPos, red); + IVertexBuilder buffer = renderTypeBuffer.getBuffer(blockPreviewRenderType); + // MinecraftServer server = Minecraft.getInstance().getIntegratedServer(); // World world = DimensionManager.getWorld(server, DimensionType.OVERWORLD, false, true); @@ -208,16 +202,15 @@ public class RenderHandler { //Render outline as backup, escape out of the current renderstack matrixStack.pop(); - endBlockPreviews(renderTypeBuffer); + renderTypeBuffer.finish(); IVertexBuilder lineBuffer = beginLines(renderTypeBuffer); renderBlockOutline(matrixStack, lineBuffer, blockPos, new Vec3d(1f, 1f, 1f)); endLines(renderTypeBuffer); - buffer = beginBlockPreviews(renderTypeBuffer); + buffer = renderTypeBuffer.getBuffer(Atlases.getTranslucentBlockType()); //any type will do, as long as we have something on the stack matrixStack.push(); } - endBlockPreviews(renderTypeBuffer); - + renderTypeBuffer.finish(); matrixStack.pop(); }