From cba23271513a6809f24760a4b93687d8148f813f Mon Sep 17 00:00:00 2001 From: Vixid <52578495+VixidDev@users.noreply.github.com> Date: Tue, 20 Feb 2024 18:44:13 +0000 Subject: Adds a chroma shader to be used on non-textured GUI elements. #960 --- .../skyhanni/features/chroma/ChromaFontRenderer.kt | 2 +- .../skyhanni/features/chroma/ChromaShader.kt | 5 +-- .../features/chroma/ChromaShaderManager.kt | 27 ++++++++++++-- .../features/chroma/StandardChromaShader.kt | 20 ++++++++++ .../features/chroma/TexturedChromaShader.kt | 20 ++++++++++ .../at/hannibal2/skyhanni/utils/shader/Shader.kt | 8 ++-- .../skyhanni/utils/shader/ShaderManager.kt | 11 ++++-- .../resources/assets/skyhanni/shaders/chroma.fsh | 43 ---------------------- .../resources/assets/skyhanni/shaders/chroma.vsh | 15 -------- .../assets/skyhanni/shaders/standard_chroma.fsh | 37 +++++++++++++++++++ .../assets/skyhanni/shaders/standard_chroma.vsh | 13 +++++++ .../assets/skyhanni/shaders/textured_chroma.fsh | 43 ++++++++++++++++++++++ .../assets/skyhanni/shaders/textured_chroma.vsh | 15 ++++++++ 13 files changed, 184 insertions(+), 75 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/chroma/StandardChromaShader.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/chroma/TexturedChromaShader.kt delete mode 100644 src/main/resources/assets/skyhanni/shaders/chroma.fsh delete mode 100644 src/main/resources/assets/skyhanni/shaders/chroma.vsh create mode 100644 src/main/resources/assets/skyhanni/shaders/standard_chroma.fsh create mode 100644 src/main/resources/assets/skyhanni/shaders/standard_chroma.vsh create mode 100644 src/main/resources/assets/skyhanni/shaders/textured_chroma.fsh create mode 100644 src/main/resources/assets/skyhanni/shaders/textured_chroma.vsh diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt index 26dc45969..4e3a4d37f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt @@ -36,7 +36,7 @@ class ChromaFontRenderer(private val baseColor: Int) { fun newChromaEnv(): ChromaFontRenderer { if (ShaderHelper.areShadersSupported()) { - ChromaShaderManager.begin() + ChromaShaderManager.begin(ChromaType.TEXTURED) GlStateManager.shadeModel(GL11.GL_SMOOTH) } return this diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt index 61e69a67b..96b6d24b7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt @@ -14,11 +14,8 @@ import net.minecraft.client.Minecraft * Credit: [ChromaShader.java](https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/java/codes/biscuit/skyblockaddons/shader/chroma/ChromaShader.java) */ -object ChromaShader : Shader("chroma", "chroma") { - +abstract class ChromaShader(vertex: String, fragment: String) : Shader(vertex, fragment) { val config get() = SkyHanniMod.feature.chroma - val INSTANCE: ChromaShader - get() = this override fun registerUniforms() { registerUniform(Uniform.UniformType.FLOAT, "chromaSize") { diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShaderManager.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShaderManager.kt index ccf0ec21e..98e1daa71 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShaderManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShaderManager.kt @@ -13,19 +13,27 @@ object ChromaShaderManager { private var chromaEnabled = false - fun begin() { + /** + * Enables the type of chroma shader passed in + * + * @param chromaType A type of chroma shader from [ChromaType] + */ + fun begin(chromaType: ChromaType) { disable() - enable() + enable(chromaType) } + /** + * Disables the currently active chroma shader + */ fun end() { disable() } - private fun enable() { + private fun enable(chromaType: ChromaType) { if (!chromaEnabled) { chromaEnabled = true - ShaderManager.enableShader("chroma") + ShaderManager.enableShader(chromaType.shaderName) } } @@ -35,4 +43,15 @@ object ChromaShaderManager { ShaderManager.disableShader() } } +} + +enum class ChromaType(val shaderName: String) { + /** + * See [StandardChromaShader] + */ + STANDARD("standard_chroma"), + /** + * See [TexturedChromaShader] + */ + TEXTURED("textured_chroma") } \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/StandardChromaShader.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/StandardChromaShader.kt new file mode 100644 index 000000000..268b37b4c --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/StandardChromaShader.kt @@ -0,0 +1,20 @@ +package at.hannibal2.skyhanni.features.chroma + +/** + * A type of chroma shader generally used for standard GUI elements using Gui.drawRect and + * other GUI element drawing functions. + * + * Explicitly those that do not depend on a texture. + * + * **Usage:** + * + * ``` + * ChromaShaderManager.begin(ChromaType.STANDARD) + * // draw GUI element here + * ChromaShaderManager.end() + * ``` + */ +object StandardChromaShader : ChromaShader("standard_chroma", "standard_chroma") { + val INSTANCE: StandardChromaShader + get() = this +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/TexturedChromaShader.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/TexturedChromaShader.kt new file mode 100644 index 000000000..544d10184 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/TexturedChromaShader.kt @@ -0,0 +1,20 @@ +package at.hannibal2.skyhanni.features.chroma + +/** + * This chroma type is used for GUI elements with textures, that includes text, + * any assets from Minecraft or from the mod, etc... + * + * **Usage:** + * + * If you want to use chroma for text see [FontRendererHook][at.hannibal2.skyhanni.mixins.hooks.FontRendererHook.setupChromaFont] + * + * ``` + * ChromaShaderManager.begin(ChromaType.TEXTURE) + * // draw GUI element here + * ChromaShaderManager.end() + * ``` + */ +object TexturedChromaShader : ChromaShader("textured_chroma", "textured_chroma") { + val INSTANCE: TexturedChromaShader + get() = this +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt index f846c3d4d..dedb60ef2 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt @@ -69,14 +69,14 @@ abstract class Shader(val vertex: String, val fragment: String) { if (ShaderHelper.glGetProgrami(shaderProgram, ShaderHelper.GL_LINK_STATUS) == GL11.GL_FALSE) { val errorMessage = "Failed to link vertex shader $vertex and fragment shader $fragment. Features that " + - "utilise this shader will not work correctly, if at all." + "utilise this shader will not work correctly, if at all" val errorLog = StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderProgram, 1024)) if (ShaderManager.inWorld()) { ErrorManager.logErrorWithData( - OpenGLException("Shader linking error."), - errorMessage, - "Link Error:\n" to errorLog + OpenGLException("Shader linking error."), + errorMessage, + "Link Error:\n" to errorLog ) } else { LorenzUtils.consoleLog("$errorMessage $errorLog") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt index f9b5541c5..5621a5f87 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.utils.shader -import at.hannibal2.skyhanni.features.chroma.ChromaShader +import at.hannibal2.skyhanni.features.chroma.StandardChromaShader +import at.hannibal2.skyhanni.features.chroma.TexturedChromaShader import at.hannibal2.skyhanni.features.misc.RoundedRectangleShader import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils @@ -22,13 +23,15 @@ object ShaderManager { */ enum class Shaders(val shader: Shader) { - CHROMA(ChromaShader.INSTANCE), + STANDARD_CHROMA(StandardChromaShader.INSTANCE), + TEXTURED_CHROMA(TexturedChromaShader.INSTANCE), ROUNDED_RECTANGLE(RoundedRectangleShader.INSTANCE); companion object { fun getShaderInstance(shaderName: String): Shader? = when (shaderName) { - "chroma" -> CHROMA.shader + "standard_chroma" -> STANDARD_CHROMA.shader + "textured_chroma" -> TEXTURED_CHROMA.shader "rounded_rect" -> ROUNDED_RECTANGLE.shader else -> { null @@ -83,7 +86,7 @@ object ShaderManager { if (ShaderHelper.glGetShaderi(shaderID, ShaderHelper.GL_COMPILE_STATUS) == 0) { val errorMessage = "Failed to compile shader $fileName${type.extension}. Features that utilise this " + - "shader will not work correctly, if at all." + "shader will not work correctly, if at all" val errorLog = StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderID, 1024)) if (inWorld()) { diff --git a/src/main/resources/assets/skyhanni/shaders/chroma.fsh b/src/main/resources/assets/skyhanni/shaders/chroma.fsh deleted file mode 100644 index 7b48a62f9..000000000 --- a/src/main/resources/assets/skyhanni/shaders/chroma.fsh +++ /dev/null @@ -1,43 +0,0 @@ -// Chroma Fragment Shader -// Modified from SkyblockAddons -// Credit: https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/resources/assets/skyblockaddons/shaders/program/chroma_screen_textured.fsh - -#version 120 - -uniform float chromaSize; -uniform float timeOffset; -uniform float saturation; -uniform bool forwardDirection; - -uniform sampler2D outTexture; - -varying vec2 outTextureCoords; -varying vec4 outColor; - -float rgb2b(vec3 rgb) { - return max(max(rgb.r, rgb.g), rgb.b); -} - -vec3 hsb2rgb_smooth(vec3 c) { - vec3 rgb = clamp(abs(mod(c.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0); - rgb = rgb * rgb * (3.0 - 2.0 * rgb); // Cubic smoothing - return c.z * mix(vec3(1.0), rgb, c.y); -} - -void main() { - vec4 originalColor = texture2D(outTexture, outTextureCoords) * outColor; - - // Determine the direction chroma moves - float fragCoord; - if (forwardDirection) { - fragCoord = gl_FragCoord.x - gl_FragCoord.y; - } else { - fragCoord = gl_FragCoord.x + gl_FragCoord.y; - } - - // The hue takes in account the position, chroma settings, and time - float hue = mod(((fragCoord) / chromaSize) - timeOffset, 1.0); - - // Set the color to use the new hue & original saturation/value/alpha values - gl_FragColor = vec4(hsb2rgb_smooth(vec3(hue, saturation, rgb2b(originalColor.rgb))), originalColor.a); -} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/shaders/chroma.vsh b/src/main/resources/assets/skyhanni/shaders/chroma.vsh deleted file mode 100644 index 5f5030d07..000000000 --- a/src/main/resources/assets/skyhanni/shaders/chroma.vsh +++ /dev/null @@ -1,15 +0,0 @@ -// Chroma Vertex Shader -// Credit: https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/resources/assets/skyblockaddons/shaders/program/chroma_screen_textured.vsh - -#version 120 - -varying vec2 outTextureCoords; -varying vec4 outColor; - -void main() { - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; - - // Pass the color & texture coords to the fragment shader - outColor = gl_Color; - outTextureCoords = gl_MultiTexCoord0.st; -} diff --git a/src/main/resources/assets/skyhanni/shaders/standard_chroma.fsh b/src/main/resources/assets/skyhanni/shaders/standard_chroma.fsh new file mode 100644 index 000000000..8e10708bb --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/standard_chroma.fsh @@ -0,0 +1,37 @@ +// Chroma Fragment Shader +// (Same as textured_chroma.fsh but isn't restricted to textured elements) + +#version 130 + +uniform float chromaSize; +uniform float timeOffset; +uniform float saturation; +uniform bool forwardDirection; + +in vec4 originalColor; + +float rgb2b(vec3 rgb) { + return max(max(rgb.r, rgb.g), rgb.b); +} + +vec3 hsb2rgb_smooth(vec3 c) { + vec3 rgb = clamp(abs(mod(c.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0); + rgb = rgb * rgb * (3.0 - 2.0 * rgb); // Cubic smoothing + return c.z * mix(vec3(1.0), rgb, c.y); +} + +void main() { + // Determine the direction chroma moves + float fragCoord; + if (forwardDirection) { + fragCoord = gl_FragCoord.x - gl_FragCoord.y; + } else { + fragCoord = gl_FragCoord.x + gl_FragCoord.y; + } + + // The hue takes in account the position, chroma settings, and time + float hue = mod(((fragCoord) / chromaSize) - timeOffset, 1.0); + + // Set the color to use the new hue & original saturation/value/alpha values + gl_FragColor = vec4(hsb2rgb_smooth(vec3(hue, saturation, rgb2b(originalColor.rgb))), originalColor.a); +} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/shaders/standard_chroma.vsh b/src/main/resources/assets/skyhanni/shaders/standard_chroma.vsh new file mode 100644 index 000000000..4895d119e --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/standard_chroma.vsh @@ -0,0 +1,13 @@ +// Chroma Vertex Shader +// (Same as textured_chroma.vsh but isn't restricted to only texture elements) + +#version 130 + +out vec4 originalColor; + +void main() { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + + // Pass original color to fragment + originalColor = gl_Color; +} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/shaders/textured_chroma.fsh b/src/main/resources/assets/skyhanni/shaders/textured_chroma.fsh new file mode 100644 index 000000000..2f3d76af7 --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/textured_chroma.fsh @@ -0,0 +1,43 @@ +// Textured Chroma Fragment Shader +// Modified from SkyblockAddons +// Credit: https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/resources/assets/skyblockaddons/shaders/program/chroma_screen_textured.fsh + +#version 130 + +uniform float chromaSize; +uniform float timeOffset; +uniform float saturation; +uniform bool forwardDirection; + +uniform sampler2D outTexture; + +in vec2 outTextureCoords; +in vec4 outColor; + +float rgb2b(vec3 rgb) { + return max(max(rgb.r, rgb.g), rgb.b); +} + +vec3 hsb2rgb_smooth(vec3 c) { + vec3 rgb = clamp(abs(mod(c.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0); + rgb = rgb * rgb * (3.0 - 2.0 * rgb); // Cubic smoothing + return c.z * mix(vec3(1.0), rgb, c.y); +} + +void main() { + vec4 originalColor = texture2D(outTexture, outTextureCoords) * outColor; + + // Determine the direction chroma moves + float fragCoord; + if (forwardDirection) { + fragCoord = gl_FragCoord.x - gl_FragCoord.y; + } else { + fragCoord = gl_FragCoord.x + gl_FragCoord.y; + } + + // The hue takes in account the position, chroma settings, and time + float hue = mod(((fragCoord) / chromaSize) - timeOffset, 1.0); + + // Set the color to use the new hue & original saturation/value/alpha values + gl_FragColor = vec4(hsb2rgb_smooth(vec3(hue, saturation, rgb2b(originalColor.rgb))), originalColor.a); +} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/shaders/textured_chroma.vsh b/src/main/resources/assets/skyhanni/shaders/textured_chroma.vsh new file mode 100644 index 000000000..87ca9fece --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/textured_chroma.vsh @@ -0,0 +1,15 @@ +// Textured Chroma Vertex Shader +// Credit: https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/resources/assets/skyblockaddons/shaders/program/chroma_screen_textured.vsh + +#version 130 + +out vec2 outTextureCoords; +out vec4 outColor; + +void main() { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + + // Pass the color & texture coords to the fragment shader + outColor = gl_Color; + outTextureCoords = gl_MultiTexCoord0.st; +} -- cgit