diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinGameRenderer.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinGameRenderer.java index 02c823a2d..53c0c3d30 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinGameRenderer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinGameRenderer.java @@ -1,11 +1,13 @@ package ru.dbotthepony.mc.otm.mixin; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.server.packs.resources.ResourceProvider; 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 ru.dbotthepony.mc.otm.client.render.GlitchRenderer; +import ru.dbotthepony.mc.otm.client.render.RenderHelperKt; @Mixin(GameRenderer.class) public class MixinGameRenderer { @@ -19,4 +21,12 @@ public class MixinGameRenderer { private void render(float p_109094_, long p_109095_, boolean p_109096_, CallbackInfo ci) { GlitchRenderer.render(); } + + @Inject( + method = "reloadShaders(Lnet/minecraft/server/packs/resources/ResourceProvider;)V", + at = @At("HEAD") + ) + private void reloadShaders(ResourceProvider p_250719_, CallbackInfo ci) { + RenderHelperKt.reloadShaders(p_250719_); + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt index 84c95ceea..7421ec99f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt @@ -8,11 +8,14 @@ import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.renderer.RenderStateShard import net.minecraft.client.renderer.RenderStateShard.LineStateShard import net.minecraft.client.renderer.RenderType +import net.minecraft.client.renderer.ShaderInstance import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.resources.ResourceLocation +import net.minecraft.server.packs.resources.ResourceProvider import org.joml.Matrix4f import org.lwjgl.opengl.GL11.GL_ALWAYS import org.lwjgl.opengl.GL11.GL_LESS +import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.math.RGBAColor import java.util.* @@ -23,6 +26,7 @@ import kotlin.math.cos import kotlin.math.pow import kotlin.math.roundToInt import kotlin.math.sin +import kotlin.properties.Delegates var is3DContext = false @@ -35,6 +39,13 @@ var lockBlendFunc = false private val defaultUV = UVCoords(0f, 0f, 1f, 1f) +var customTexColorShader: ShaderInstance by Delegates.notNull() + private set + +fun reloadShaders(provider: ResourceProvider) { + customTexColorShader = ShaderInstance(provider, ResourceLocation(OverdriveThatMatters.MOD_ID, "position_tex_color"), DefaultVertexFormat.POSITION_TEX_COLOR) +} + fun renderRect( matrix: Matrix4f, x: Float, @@ -108,7 +119,7 @@ fun renderTexturedRect( if (color.isWhite) RenderSystem.setShader(GameRenderer::getPositionTexShader) else - RenderSystem.setShader(GameRenderer::getPositionTexColorShader) + RenderSystem.setShader { customTexColorShader } if (texture != null) RenderSystem.setShaderTexture(0, texture) diff --git a/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.fsh b/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.fsh new file mode 100644 index 000000000..0ed69a40d --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.fsh @@ -0,0 +1,14 @@ +#version 150 + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; + +in vec2 texCoord0; +in vec4 vertexColor; + +out vec4 fragColor; + +void main() { + fragColor = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; +} diff --git a/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.json b/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.json new file mode 100644 index 000000000..f127dbe01 --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.json @@ -0,0 +1,22 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "overdrive_that_matters:position_tex_color", + "fragment": "overdrive_that_matters:position_tex_color", + "attributes": [ + "Position", + "UV0", + "Color" + ], + "samplers": [ + { "name": "Sampler0" } + ], + "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": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] } + ] +} diff --git a/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.vsh b/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.vsh new file mode 100644 index 000000000..1ed8e4068 --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/shaders/core/position_tex_color.vsh @@ -0,0 +1,18 @@ +#version 150 + +in vec3 Position; +in vec2 UV0; +in vec4 Color; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +out vec2 texCoord0; +out vec4 vertexColor; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + texCoord0 = UV0; + vertexColor = Color; +}