diff --git a/build.gradle b/build.gradle index e9d578c..cb2d8f1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ buildscript { repositories { maven { url = 'https://files.minecraftforge.net/maven' } - jcenter() mavenCentral() } dependencies { @@ -12,9 +11,8 @@ apply plugin: 'net.minecraftforge.gradle' // Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. apply plugin: 'eclipse' apply plugin: 'maven-publish' -apply from: 'https://raw.githubusercontent.com/SizableShrimp/Forge-Class-Remapper/main/classremapper.gradle' -version = '1.16.3-2.24' +version = '1.17.1-2.24' group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'effortlessbuilding' diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index a0ba9b2..c7d9bc2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -37,7 +37,6 @@ import nl.requios.effortlessbuilding.proxy.ServerProxy; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -// The value here should match an entry in the META-INF/mods.toml file @Mod(EffortlessBuilding.MODID) public class EffortlessBuilding { diff --git a/src/main/java/nl/requios/effortlessbuilding/ModClientEventHandler.java b/src/main/java/nl/requios/effortlessbuilding/ModClientEventHandler.java index 8233196..63aaec7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/ModClientEventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/ModClientEventHandler.java @@ -1,16 +1,21 @@ package nl.requios.effortlessbuilding; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeOptions; +import nl.requios.effortlessbuilding.render.BuildRenderTypes; +import java.io.IOException; import java.util.HashMap; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, value = {Dist.CLIENT}) @@ -43,4 +48,12 @@ public class ModClientEventHandler { public static TextureAtlasSprite getModeOptionIcon(ModeOptions.ActionEnum action) { return Minecraft.getInstance().getModelManager().getAtlas(TextureAtlas.LOCATION_BLOCKS).getSprite(modeOptionIcons.get(action)); } + + @SubscribeEvent + public static void registerShaders(RegisterShadersEvent event) throws IOException { + event.registerShader(new ShaderInstance(event.getResourceManager(), + new ResourceLocation(EffortlessBuilding.MODID, "dissolve"), + DefaultVertexFormat.BLOCK), + shaderInstance -> BuildRenderTypes.dissolveShaderInstance = shaderInstance); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 98bfa7d..b3e8591 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -5,7 +5,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.SoundType; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.KeyMapping; @@ -29,28 +28,23 @@ import net.minecraftforge.client.settings.KeyConflictContext; import net.minecraftforge.client.settings.KeyModifier; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.DeferredWorkQueue; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fmlclient.registry.ClientRegistry; import net.minecraftforge.fmllegacy.network.NetworkEvent; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.compatibility.CompatHelper; -import nl.requios.effortlessbuilding.gui.RandomizerBagScreen; import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui; import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu; import nl.requios.effortlessbuilding.gui.buildmodifier.ModifierSettingsGui; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.network.*; -import nl.requios.effortlessbuilding.render.ShaderHandler; import org.lwjgl.glfw.GLFW; import javax.annotation.ParametersAreNonnullByDefault; @@ -66,7 +60,6 @@ public class ClientProxy implements IProxy { public static int ticksInGame = 0; private static int placeCooldown = 0; private static int breakCooldown = 0; - private static boolean shadersInitialized = false; @SubscribeEvent public static void onClientTick(TickEvent.ClientTickEvent event) { @@ -102,12 +95,6 @@ public class ClientProxy implements IProxy { if (gui == null || !gui.isPauseScreen()) { ticksInGame++; } - - //Init shaders in the first tick. Doing it anywhere before this seems to crash the game. - if (!shadersInitialized) { - ShaderHandler.init(); - shadersInitialized = true; - } } } @@ -276,12 +263,6 @@ public class ClientProxy implements IProxy { } } - //For shader development - if (keyBindings.length >= 8 && keyBindings[7].consumeClick()) { - ShaderHandler.init(); - EffortlessBuilding.log(player, "Reloaded shaders"); - } - } public static void openModifierSettings() { @@ -367,7 +348,6 @@ public class ClientProxy implements IProxy { keyBindings[4] = new KeyMapping("key.effortlessbuilding.undo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, InputConstants.getKey(GLFW.GLFW_KEY_Z, 0), "key.effortlessbuilding.category"); keyBindings[5] = new KeyMapping("key.effortlessbuilding.redo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, InputConstants.getKey(GLFW.GLFW_KEY_Y, 0), "key.effortlessbuilding.category"); keyBindings[6] = new KeyMapping("key.effortlessbuilding.altplacement.desc", KeyConflictContext.IN_GAME, InputConstants.getKey(GLFW.GLFW_KEY_LEFT_CONTROL, 0), "key.effortlessbuilding.category"); - //keyBindings[7] = new KeyBinding("Reload shaders", KeyConflictContext.UNIVERSAL, InputMappings.getInputByCode(GLFW.GLFW_KEY_TAB, 0), "key.effortlessbuilding.category"); // register all the key bindings for (KeyMapping keyBinding : keyBindings) { diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java b/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java index b848f74..514f372 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java @@ -1,26 +1,38 @@ package nl.requios.effortlessbuilding.render; +import com.mojang.blaze3d.shaders.Uniform; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.texture.TextureAtlas; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; +import nl.requios.effortlessbuilding.BuildConfig; +import nl.requios.effortlessbuilding.EffortlessBuilding; import org.lwjgl.opengl.*; import java.util.OptionalDouble; import java.util.function.Consumer; +import java.util.function.Function; public class BuildRenderTypes extends RenderType { + public static ResourceLocation shaderMaskTextureLocation = new ResourceLocation(EffortlessBuilding.MODID, "textures/shader_mask.png"); + public static final RenderType LINES; public static final RenderType PLANES; - private static final int primaryTextureUnit = 0; - private static final int secondaryTextureUnit = 2; + public static ShaderInstance dissolveShaderInstance; + private static final ShaderStateShard RENDERTYPE_DISSOLVE_SHADER = new ShaderStateShard(() -> dissolveShaderInstance); + + //Between 0 and 7, but dont override vanilla textures + //Also update dissolve.fsh SamplerX + private static final int maskTextureIndex = 7; static { final LineStateShard LINE = new LineStateShard(OptionalDouble.of(2.0)); @@ -58,39 +70,27 @@ public class BuildRenderTypes extends RenderType { DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, false, false, renderState); } + + // Dummy constructor needed to make java happy public BuildRenderTypes(String p_173178_, VertexFormat p_173179_, VertexFormat.Mode p_173180_, int p_173181_, boolean p_173182_, boolean p_173183_, Runnable p_173184_, Runnable p_173185_) { super(p_173178_, p_173179_, p_173180_, p_173181_, p_173182_, p_173183_, p_173184_, p_173185_); } - public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos, - BlockPos secondPos, boolean red) { -// RenderSystem.pushLightingAttributes(); -// RenderSystem.pushTextureAttributes(); -// RenderSystem.enableCull(); -// RenderSystem.enableTexture(); -// Minecraft.getInstance().textureManager.bindTexture(ShaderHandler.shaderMaskTextureLocation); -// -// RenderSystem.enableBlend(); -// RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); -// RenderSystem.blendColor(1f, 1f, 1f, 0.8f); - //end -// ShaderHandler.releaseShader(); + public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos, BlockPos secondPos, boolean red) { - //highjacking texturing state (which does nothing by default) to do my own things + Boolean useShaders = BuildConfig.visuals.useShaders.get(); + //TODO 1.17 don't use shaders if config says no String stateName = "eb_texturing_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red; - RenderStateShard.TexturingStateShard MY_TEXTURING = new RenderStateShard.TexturingStateShard(stateName, () -> { -// RenderSystem.pushLightingAttributes(); -// RenderSystem.pushTextureAttributes(); - - ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, Vec3.atLowerCornerOf(blockPos), Vec3.atLowerCornerOf(firstPos), Vec3.atLowerCornerOf(secondPos), blockPos == secondPos, red)); + TexturingStateShard MY_TEXTURING = new TexturingStateShard(stateName, () -> { + setShaderParameters(dissolveShaderInstance, dissolve, Vec3.atLowerCornerOf(blockPos), Vec3.atLowerCornerOf(firstPos), Vec3.atLowerCornerOf(secondPos), blockPos == secondPos, red); RenderSystem.setShaderColor(1f, 1f, 1f, 0.8f); - }, ShaderHandler::releaseShader); + }, () -> {}); RenderType.CompositeState renderState = RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(ShaderHandler.shaderMaskTextureLocation, false, false)) + .setShaderState(RENDERTYPE_DISSOLVE_SHADER) .setTexturingState(MY_TEXTURING) + .setTextureState(new RenderStateShard.TextureStateShard(shaderMaskTextureLocation, false, false)) .setTransparencyState(TRANSLUCENT_TRANSPARENCY) //TODO 1.17 // .setDiffuseLightingState(DIFFUSE_LIGHTING_DISABLED) @@ -105,49 +105,26 @@ public class BuildRenderTypes extends RenderType { DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, true, true, renderState); } - private static Consumer generateShaderCallback(final float dissolve, final Vec3 blockpos, + private static void setShaderParameters(ShaderInstance shader, final float dissolve, final Vec3 blockpos, final Vec3 firstpos, final Vec3 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"); + Uniform percentileUniform = shader.getUniform("dissolve"); + Uniform highlightUniform = shader.getUniform("highlight"); + Uniform redUniform = shader.getUniform("red"); + Uniform blockposUniform = shader.getUniform("blockpos"); + Uniform firstposUniform = shader.getUniform("firstpos"); + Uniform secondposUniform = shader.getUniform("secondpos"); - RenderSystem.enableTexture(); - GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS); + RenderSystem.setShaderTexture(maskTextureIndex, shaderMaskTextureLocation); - //mask - ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit); - glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit); - RenderSystem.setShaderTexture(0, ShaderHandler.shaderMaskTextureLocation); - //mc.getTextureManager().bindForSetup(ShaderHandler.shaderMaskTextureLocation);//getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture(); - //GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId()); + percentileUniform.set(dissolve); + highlightUniform.set(highlight ? 1 : 0); + redUniform.set(red ? 1 : 0); - //image - ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit); - glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit); - RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS); - //mc.getTextureManager().bindForSetup(TextureAtlas.LOCATION_BLOCKS);//.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); - }; + blockposUniform.set((float) blockpos.x, (float) blockpos.y, (float) blockpos.z); + firstposUniform.set((float) firstpos.x, (float) firstpos.y, (float) firstpos.z); + secondposUniform.set((float) secondpos.x, (float) secondpos.y, (float) secondpos.z); } public static void glActiveTexture(int texture) { diff --git a/src/main/java/nl/requios/effortlessbuilding/render/ShaderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/ShaderHandler.java deleted file mode 100644 index daeffd3..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/render/ShaderHandler.java +++ /dev/null @@ -1,201 +0,0 @@ -/** - * This class was created by . It's distributed as - * part of the Botania Mod. Get the Source Code in github: - * https://github.com/Vazkii/Botania - *

- * Modified by Requios - *

- * Botania is Open Source and distributed under the - * Botania License: http://botaniamod.net/license.php - *

- * File Created @ [Apr 9, 2014, 11:20:26 PM (GMT)] - */ -package nl.requios.effortlessbuilding.render; - -import net.minecraft.resources.ResourceLocation; -import nl.requios.effortlessbuilding.BuildConfig; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.proxy.ClientProxy; -import org.apache.logging.log4j.Level; -import org.lwjgl.opengl.*; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.function.Consumer; - -public final class ShaderHandler { - - private static final int VERT_ST = ARBVertexShader.GL_VERTEX_SHADER_ARB; - private static final int FRAG_ST = ARBFragmentShader.GL_FRAGMENT_SHADER_ARB; - - private static final int VERT = 1; - private static final int FRAG = 2; - - private static final String VERT_EXTENSION = ".vert"; - private static final String FRAG_EXTENSION = ".frag"; - - public static int rawColor; - public static int dissolve; - - public static ResourceLocation shaderMaskTextureLocation = new ResourceLocation(EffortlessBuilding.MODID, "textures/shader_mask.png"); - - public static void init() { - if (!doUseShaders()) - return; - -// rawColor = createProgram("/assets/effortlessbuilding/shaders/raw_color", FRAG); - dissolve = createProgram("/assets/effortlessbuilding/shaders/dissolve", VERT + FRAG); - } - - public static void useShader(int shader, Consumer callback) { - if (!doUseShaders()) - return; - - ARBShaderObjects.glUseProgramObjectARB(shader); - - if (shader != 0) { - int time = ARBShaderObjects.glGetUniformLocationARB(shader, "time"); - ARBShaderObjects.glUniform1iARB(time, ClientProxy.ticksInGame); - - if (callback != null) - callback.accept(shader); - } - } - - public static void useShader(int shader) { - useShader(shader, null); - } - - public static void releaseShader() { - useShader(0); - } - - public static boolean doUseShaders() { - //Extracted from OpenGLHelper in 1.13 and earlier - //Can probably be simplified - GLCapabilities glcapabilities = GL.getCapabilities(); - boolean openGL14 = glcapabilities.OpenGL14 || glcapabilities.GL_EXT_blend_func_separate; - boolean openGL21 = glcapabilities.OpenGL21; - boolean framebufferSupported = openGL14 && (glcapabilities.GL_ARB_framebuffer_object || glcapabilities.GL_EXT_framebuffer_object || glcapabilities.OpenGL30); - boolean shadersAvailable = openGL21 || glcapabilities.GL_ARB_vertex_shader && glcapabilities.GL_ARB_fragment_shader && glcapabilities.GL_ARB_shader_objects; - boolean shadersSupported = framebufferSupported && shadersAvailable; - return BuildConfig.visuals.useShaders.get() && shadersSupported; - } - - private static int createProgram(String s, int sides) { - boolean vert = (sides & VERT) != 0; - boolean frag = (sides & FRAG) != 0; - - return createProgram(vert ? s + VERT_EXTENSION : null, frag ? s + FRAG_EXTENSION : null); - } - - // Most of the code taken from the LWJGL wiki - // http://lwjgl.org/wiki/index.php?title=GLSL_Shaders_with_LWJGL - - private static int createProgram(String vert, String frag) { - int vertId = 0, fragId = 0, program; - if (vert != null) - vertId = createShader(vert, VERT_ST); - if (frag != null) - fragId = createShader(frag, FRAG_ST); - - program = ARBShaderObjects.glCreateProgramObjectARB(); - if (program == 0) - return 0; - - if (vert != null) - ARBShaderObjects.glAttachObjectARB(program, vertId); - if (frag != null) - ARBShaderObjects.glAttachObjectARB(program, fragId); - - ARBShaderObjects.glLinkProgramARB(program); - if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) { - EffortlessBuilding.logger.log(Level.ERROR, getLogInfo(program)); - return 0; - } - - ARBShaderObjects.glValidateProgramARB(program); - if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) { - EffortlessBuilding.logger.log(Level.ERROR, getLogInfo(program)); - return 0; - } - - return program; - } - - private static int createShader(String filename, int shaderType) { - int shader = 0; - try { - shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType); - - if (shader == 0) - return 0; - - ARBShaderObjects.glShaderSourceARB(shader, readFileAsString(filename)); - ARBShaderObjects.glCompileShaderARB(shader); - - if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE) - throw new RuntimeException("Error creating shader: " + getLogInfo(shader)); - - return shader; - } catch (Exception e) { - ARBShaderObjects.glDeleteObjectARB(shader); - e.printStackTrace(); - return -1; - } - } - - private static String getLogInfo(int obj) { - return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB)); - } - - private static String readFileAsString(String filename) throws Exception { - StringBuilder source = new StringBuilder(); - InputStream in = ShaderHandler.class.getResourceAsStream(filename); - Exception exception = null; - BufferedReader reader; - - if (in == null) - return ""; - - try { - reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); - - Exception innerExc = null; - try { - String line; - while ((line = reader.readLine()) != null) - source.append(line).append('\n'); - } catch (Exception exc) { - exception = exc; - } finally { - try { - reader.close(); - } catch (Exception exc) { - innerExc = exc; - } - } - - if (innerExc != null) - throw innerExc; - } catch (Exception exc) { - exception = exc; - } finally { - try { - in.close(); - } catch (Exception exc) { - if (exception == null) - exception = exc; - else exc.printStackTrace(); - } - - if (exception != null) - throw exception; - } - - return source.toString(); - } - -} diff --git a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh similarity index 65% rename from src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag rename to src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh index d322425..0c6261c 100644 --- a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag +++ b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh @@ -1,6 +1,15 @@ -#version 120 +#version 150 -uniform int time; // Passed in, see ShaderHelper.java +#moj_import + +uniform sampler2D Sampler0; +uniform sampler2D Sampler7; + +uniform float GameTime; +uniform vec4 ColorModulator; +uniform float FogStart; +uniform float FogEnd; +uniform vec4 FogColor; uniform float dissolve; // Passed in via Callback uniform int highlight; @@ -8,18 +17,23 @@ uniform int red; uniform vec3 blockpos; uniform vec3 firstpos; uniform vec3 secondpos; -uniform sampler2D image; -uniform sampler2D mask; -varying vec4 position; -varying vec3 normal; +in vec3 vertexPosition; +in float vertexDistance; +in vec4 vertexColor; +in vec2 texCoord0; +in vec4 normal; + +out vec4 fragColor; void main() { - vec3 pixelposition = floor(position.xyz * 8.0) / 8.0; + //convert gametime to seconds (roughly) + float time = GameTime * 1200; + + vec3 pixelposition = floor(vertexPosition * 8.0) / 8.0; vec3 worldpos = blockpos + pixelposition.xyz; - vec2 texcoord = vec2(gl_TexCoord[0]); - vec4 texcolor = texture2D(image, texcoord); + vec4 texcolor = texture2D(Sampler0, texCoord0) * vertexColor * ColorModulator; vec4 color = texcolor; vec3 firstposc = firstpos + 0.51; //center in block vec3 secondposc = secondpos + 0.5; @@ -41,10 +55,10 @@ void main() { maskcoord = vec2(worldpos.x, worldpos.y); maskcoord /= 20.0; - vec4 maskColor = texture2D(mask, maskcoord); + vec4 maskColor = texture2D(Sampler7, maskcoord); float maskgs = maskColor.r; - color.rgb *= gl_Color.rgb; + color.rgb *= vertexColor.rgb; //desaturate color.rgb *= vec3(0.8); @@ -53,30 +67,18 @@ void main() { color.rgb += vec3(-0.1, 0.0, 0.2); //add pulsing blue - float pulse = (sin(time / 5.0) + 1.0) / 2.0; + float pulse = (sin(time * 4.0) + 1.0) / 2.0; color.rgb += 0.4 * vec3(-0.5, 0.2, 0.6) * pulse; //add diagonal highlights - float diagTime = mod(time / 40.0, 1.4) - 0.2; + float diagTime = mod(time / 2.0, 1.4) - 0.2; float diag = smoothstep(diagTime - 0.2, diagTime, place) - smoothstep(diagTime, diagTime + 0.2, place); color.rgb += 0.2 * diag * vec3(0.0, 0.2, 0.4); - float diagTime2 = mod(time / 70.0, 1.4) - 0.2; + float diagTime2 = mod(time / 3.5, 1.4) - 0.2; float diag2 = smoothstep(diagTime2 - 0.2, diagTime2, place) - smoothstep(diagTime2, diagTime2 + 0.2, place); color.rgb += 0.2 * diag2 * vec3(0.0, 0.4, 0.8); - //add edge shading -// vec3 p1; -// //if (firstpos.x < secondpos.x) -// -// vec3 wmf = worldpos - firstposc; -// vec3 wms = worldpos - (secondposc + vec3(0.0, 1.0, 1.0)); -// float distToEdge1 = min(length(wmf.xy), length(wmf.xz)); -// float distToEdge2 = min(length(wmf.yz), length(wms.xy)); -// float distToEdge3 = min(length(wms.xz), length(wms.yz)); -// float distToEdge = min(min(distToEdge1, distToEdge2), distToEdge3); -// color.rgb += vec3(0.5 - smoothstep(0, 0.5, distToEdge)) * 0.5; - //add flat shading // if (abs(normal.x) > 0.5) // color.rgb -= 0.0; @@ -99,6 +101,6 @@ void main() { color.b = max(0, min(1, color.b)); if (maskgs * 0.3 + place * 0.7 <= dissolve) - gl_FragColor = vec4(texcolor.rgb, 0.0); - else gl_FragColor = color; + fragColor = vec4(texcolor.rgb, 0.0); + else fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); } diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json new file mode 100644 index 0000000..6af1cc9 --- /dev/null +++ b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json @@ -0,0 +1,37 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "effortlessbuilding:dissolve", + "fragment": "effortlessbuilding:dissolve", + "attributes": [ + "Position", + "Color", + "UV0", + "UV2", + "Normal" + ], + "samplers": [ + { "name": "Sampler0" }, + { "name": "Sampler2" } + ], + "uniforms": [ + { "name": "ModelViewMat", "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": "ProjMat", "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": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + + { "name": "dissolve", "type": "float", "count": 1, "values": [0.0] }, + { "name": "highlight", "type": "int", "count": 1, "values": [0] }, + { "name": "red", "type": "int", "count": 1, "values": [0] }, + { "name": "blockpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, + { "name": "firstpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, + { "name": "secondpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh new file mode 100644 index 0000000..742b73f --- /dev/null +++ b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh @@ -0,0 +1,31 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec4 Color; +in vec2 UV0; +in ivec2 UV2; +in vec3 Normal; + +uniform sampler2D Sampler2; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; +uniform vec3 ChunkOffset; + +out vec3 vertexPosition; +out float vertexDistance; +out vec4 vertexColor; +out vec2 texCoord0; +out vec4 normal; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position + ChunkOffset, 1.0); + + vertexPosition = gl_Position.xyz; + vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); + texCoord0 = UV0; + normal = ProjMat * ModelViewMat * vec4(Normal, 0.0); +} \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert b/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert deleted file mode 100644 index c3975f6..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert +++ /dev/null @@ -1,14 +0,0 @@ -#version 120 - -varying vec4 position; -varying vec3 normal; - -void main() { - gl_Position = ftransform();//gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; - gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - gl_FrontColor = gl_Color; - //gl_BackColor = gl_Color; - - position = gl_Vertex; - normal = gl_Normal; -} \ No newline at end of file