From 1dea3a53086a6b2f1f00593c0c2dae7c71638e0b Mon Sep 17 00:00:00 2001 From: VixidDev <52578495+VixidDev@users.noreply.github.com> Date: Thu, 28 Dec 2023 15:36:01 +0000 Subject: [PATCH 001/260] Add rounded rectangles --- .../features/misc/RoundedRectangleShader.kt | 26 +++++++++++++++ .../hannibal2/skyhanni/utils/RenderUtils.kt | 32 +++++++++++++++++++ .../skyhanni/utils/shader/ShaderHelper.kt | 8 +++++ .../skyhanni/utils/shader/ShaderManager.kt | 5 ++- .../skyhanni/utils/shader/Uniform.kt | 12 +++++-- .../assets/skyhanni/shaders/rounded_rect.fsh | 20 ++++++++++++ .../assets/skyhanni/shaders/rounded_rect.vsh | 8 +++++ 7 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt create mode 100644 src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh create mode 100644 src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt new file mode 100644 index 000000000000..daed84bc19d3 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt @@ -0,0 +1,26 @@ +package at.hannibal2.skyhanni.features.misc + +import at.hannibal2.skyhanni.utils.shader.Shader +import at.hannibal2.skyhanni.utils.shader.Uniform +import net.minecraft.client.Minecraft + +object RoundedRectangleShader : Shader("rounded_rect", "rounded_rect") { + + val INSTANCE: RoundedRectangleShader + get() = this + + var radius: Float = 0f + var smoothness: Float = 0f + var halfSize: FloatArray = floatArrayOf(0f, 0f) + var centerPos: FloatArray = floatArrayOf(0f, 0f) + set(value) { + field = floatArrayOf(value[0], Minecraft.getMinecraft().displayHeight - value[1]) + } + + override fun registerUniforms() { + registerUniform(Uniform.UniformType.FLOAT, "radius") { radius } + registerUniform(Uniform.UniformType.FLOAT, "smoothness") { smoothness } + registerUniform(Uniform.UniformType.VEC2, "halfSize") { halfSize } + registerUniform(Uniform.UniformType.VEC2, "centerPos") { centerPos } + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index b7bbf948778a..af2dcbfe9ae8 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -7,8 +7,10 @@ import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY import at.hannibal2.skyhanni.events.GuiRenderItemEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent import at.hannibal2.skyhanni.test.command.ErrorManager +import at.hannibal2.skyhanni.features.misc.RoundedRectangleShader import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.renderables.Renderable +import at.hannibal2.skyhanni.utils.shader.ShaderManager import io.github.moulberry.moulconfig.internal.TextRenderUtils import io.github.moulberry.notenoughupdates.util.Utils import net.minecraft.client.Minecraft @@ -26,6 +28,8 @@ import net.minecraft.util.MathHelper import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 import java.awt.Color +import net.minecraft.client.gui.ScaledResolution +import org.lwjgl.input.Keyboard import kotlin.math.cos import kotlin.math.sin import kotlin.math.sqrt @@ -1118,4 +1122,32 @@ object RenderUtils { GlStateManager.enableLighting() GlStateManager.enableDepth() } + + /** + * Method to draw a rounded rectangle. + * + * @param color color of rect + * @param radius the radius of the corners (default 10) + * @param smoothness how smooth the corners will appear (default 2) + */ + fun drawRoundRect(x: Int, y: Int, width: Int, height: Int, color: Int, radius: Int = 10, smoothness: Int = 2) { + val scaledRes = ScaledResolution(Minecraft.getMinecraft()) + val widthIn = width * scaledRes.scaleFactor + val heightIn = height * scaledRes.scaleFactor + val xIn = x * scaledRes.scaleFactor + val yIn = y * scaledRes.scaleFactor + + RoundedRectangleShader.radius = radius.toFloat() + RoundedRectangleShader.smoothness = smoothness.toFloat() + RoundedRectangleShader.halfSize = floatArrayOf(widthIn / 2f, heightIn / 2f) + RoundedRectangleShader.centerPos = floatArrayOf(xIn + (widthIn / 2f), yIn + (heightIn / 2f)) + + GlStateManager.pushMatrix() + ShaderManager.enableShader("rounded_rect") + + Gui.drawRect(x, y, x + widthIn, y + heightIn, color) + + ShaderManager.disableShader() + GlStateManager.popMatrix() + } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt index 2576b42489ce..c99cd8062ba8 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt @@ -135,6 +135,14 @@ class ShaderHelper { if (USING_ARB_SHADERS) ARBShaderObjects.glUniform1fARB(location, v0) else GL20.glUniform1f(location, v0) } + fun glUniform2f(location: Int, v0: Float, v1: Float) { + if (USING_ARB_SHADERS) ARBShaderObjects.glUniform2fARB(location, v0, v1) else GL20.glUniform2f( + location, + v0, + v1 + ) + } + fun glUniform3f(location: Int, v0: Float, v1: Float, v2: Float) { if (USING_ARB_SHADERS) ARBShaderObjects.glUniform3fARB(location, v0, v1, v2) else GL20.glUniform3f( location, 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 3dbec3c6e76a..2308f24bdd67 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.misc.RoundedRectangleShader import at.hannibal2.skyhanni.utils.LorenzUtils import net.minecraft.client.Minecraft import net.minecraft.util.ResourceLocation @@ -18,11 +19,13 @@ object ShaderManager { * in the when expression */ enum class Shaders(val shader: Shader) { - CHROMA(ChromaShader.INSTANCE); + CHROMA(ChromaShader.INSTANCE), + ROUNDED_RECTANGLE(RoundedRectangleShader.INSTANCE); companion object { fun getShaderInstance(shaderName: String): Shader? = when (shaderName) { "chroma" -> CHROMA.shader + "rounded_rect" -> ROUNDED_RECTANGLE.shader else -> { null } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt index d57398ea447b..506bdfdc3952 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt @@ -1,6 +1,6 @@ package at.hannibal2.skyhanni.utils.shader -import java.util.* +import java.util.Objects import java.util.function.Supplier /** @@ -20,6 +20,7 @@ class Uniform( class UniformType { companion object { val FLOAT: UniformType = UniformType() + val VEC2: UniformType = UniformType() val VEC3: UniformType = UniformType() val BOOL: UniformType = UniformType() } @@ -32,12 +33,17 @@ class Uniform( val newUniformValue: T = uniformValuesSupplier.get() if (!Objects.deepEquals(previousUniformValue, newUniformValue)) { when (uniformType) { - UniformType.FLOAT -> ShaderHelper.glUniform1f(uniformID, (newUniformValue as Float)) + UniformType.FLOAT -> { + ShaderHelper.glUniform1f(uniformID, (newUniformValue as Float)) + } + UniformType.VEC2 -> { + val values = newUniformValue as FloatArray + ShaderHelper.glUniform2f(uniformID, values[0], values[1]) + } UniformType.VEC3 -> { val values = newUniformValue as FloatArray ShaderHelper.glUniform3f(uniformID, values[0], values[1], values[2]) } - UniformType.BOOL -> ShaderHelper.glUniform1f(uniformID, if (newUniformValue as Boolean) 1f else 0f) } previousUniformValue = newUniformValue diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh b/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh new file mode 100644 index 000000000000..97dcfa9a4956 --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh @@ -0,0 +1,20 @@ +// Based on https://www.shadertoy.com/view/WtdSDs + +#version 130 + +uniform float radius; +uniform float smoothness; +uniform vec2 halfSize; +uniform vec2 centerPos; + +varying vec4 color; + +float roundedRectSDF(vec2 center, vec2 halfSize, float radius) { + return length(max(abs(center) - halfSize + radius, 0.0)) - radius; +} + +void main() { + float distance = roundedRectSDF(gl_FragCoord.xy - centerPos, halfSize, radius); + float smoothed = 1.0 - smoothstep(0.0, smoothness, distance); + gl_FragColor = color * vec4(1.0, 1.0, 1.0, smoothed); +} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh b/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh new file mode 100644 index 000000000000..8a2c196ac63b --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh @@ -0,0 +1,8 @@ +#version 130 + +varying vec4 color; + +void main() { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + color = gl_Color; +} \ No newline at end of file From 873a2c5382a1b1788229f4860b988be3e8cf3e6e Mon Sep 17 00:00:00 2001 From: VixidDev <52578495+VixidDev@users.noreply.github.com> Date: Fri, 5 Jan 2024 02:10:27 +0000 Subject: [PATCH 002/260] Compatibility with translate and scale, also better error logging --- .../features/misc/RoundedRectangleShader.kt | 2 + .../hannibal2/skyhanni/utils/RenderUtils.kt | 20 +++++--- .../hannibal2/skyhanni/utils/shader/Shader.kt | 50 +++++++++++++------ .../skyhanni/utils/shader/ShaderManager.kt | 29 ++++++++--- .../assets/skyhanni/shaders/rounded_rect.fsh | 22 ++++++-- .../assets/skyhanni/shaders/rounded_rect.vsh | 2 +- 6 files changed, 91 insertions(+), 34 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt index daed84bc19d3..6b0ce5e637db 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/RoundedRectangleShader.kt @@ -9,6 +9,7 @@ object RoundedRectangleShader : Shader("rounded_rect", "rounded_rect") { val INSTANCE: RoundedRectangleShader get() = this + var scaleFactor: Float = 0f var radius: Float = 0f var smoothness: Float = 0f var halfSize: FloatArray = floatArrayOf(0f, 0f) @@ -18,6 +19,7 @@ object RoundedRectangleShader : Shader("rounded_rect", "rounded_rect") { } override fun registerUniforms() { + registerUniform(Uniform.UniformType.FLOAT, "scaleFactor") { scaleFactor } registerUniform(Uniform.UniformType.FLOAT, "radius") { radius } registerUniform(Uniform.UniformType.FLOAT, "smoothness") { smoothness } registerUniform(Uniform.UniformType.VEC2, "halfSize") { halfSize } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index af2dcbfe9ae8..c6219084fd28 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -6,16 +6,18 @@ import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY import at.hannibal2.skyhanni.events.GuiRenderItemEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent -import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.features.misc.RoundedRectangleShader +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.renderables.Renderable import at.hannibal2.skyhanni.utils.shader.ShaderManager import io.github.moulberry.moulconfig.internal.TextRenderUtils import io.github.moulberry.notenoughupdates.util.Utils +import java.awt.Color import net.minecraft.client.Minecraft import net.minecraft.client.gui.FontRenderer import net.minecraft.client.gui.Gui +import net.minecraft.client.gui.ScaledResolution import net.minecraft.client.renderer.GlStateManager import net.minecraft.client.renderer.Tessellator import net.minecraft.client.renderer.vertex.DefaultVertexFormats @@ -27,9 +29,6 @@ import net.minecraft.util.AxisAlignedBB import net.minecraft.util.MathHelper import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 -import java.awt.Color -import net.minecraft.client.gui.ScaledResolution -import org.lwjgl.input.Keyboard import kotlin.math.cos import kotlin.math.sin import kotlin.math.sqrt @@ -1126,17 +1125,24 @@ object RenderUtils { /** * Method to draw a rounded rectangle. * + * **NOTE:** If you are using [GlStateManager.translate] or [GlStateManager.scale] + * with this method, ensure they are invoked in the correct order if you use both. That is, [GlStateManager.translate] + * is called **BEFORE** [GlStateManager.scale], otherwise the rectangle will not be rendered correctly + * * @param color color of rect * @param radius the radius of the corners (default 10) - * @param smoothness how smooth the corners will appear (default 2) + * @param smoothness how smooth the corners will appear (default 2). NOTE: This does very + * little to the smoothness of the corners in reality due to how the final pixel color is calculated. + * It is best kept at its default. */ - fun drawRoundRect(x: Int, y: Int, width: Int, height: Int, color: Int, radius: Int = 10, smoothness: Int = 2) { + fun drawRoundRect(x: Int, y: Int, width: Int, height: Int, color: Int, radius: Int = 10, smoothness: Int = 1) { val scaledRes = ScaledResolution(Minecraft.getMinecraft()) val widthIn = width * scaledRes.scaleFactor val heightIn = height * scaledRes.scaleFactor val xIn = x * scaledRes.scaleFactor val yIn = y * scaledRes.scaleFactor + RoundedRectangleShader.scaleFactor = scaledRes.scaleFactor.toFloat() RoundedRectangleShader.radius = radius.toFloat() RoundedRectangleShader.smoothness = smoothness.toFloat() RoundedRectangleShader.halfSize = floatArrayOf(widthIn / 2f, heightIn / 2f) @@ -1145,7 +1151,7 @@ object RenderUtils { GlStateManager.pushMatrix() ShaderManager.enableShader("rounded_rect") - Gui.drawRect(x, y, x + widthIn, y + heightIn, color) + Gui.drawRect(x, y, x + width, y + height, color) ShaderManager.disableShader() GlStateManager.popMatrix() 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 7fb13ab86044..6a95655ca71f 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt @@ -1,10 +1,12 @@ package at.hannibal2.skyhanni.utils.shader +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils +import java.util.function.Supplier import net.minecraft.client.shader.ShaderLinkHelper import org.apache.commons.lang3.StringUtils import org.lwjgl.opengl.GL11 -import java.util.function.Supplier +import org.lwjgl.opengl.OpenGLException /** * Superclass for shader objects to compile and attach vertex and fragment shaders to the shader program @@ -18,23 +20,39 @@ abstract class Shader(vertex: String, fragment: String) { var shaderProgram: Int = ShaderLinkHelper.getStaticShaderLinkHelper().createProgram() private val uniforms: MutableList> = mutableListOf() + var created = false + init { - val vertexShaderID = ShaderManager.loadShader(ShaderType.VERTEX, vertex) - ShaderManager.attachShader(shaderProgram, vertexShaderID) - val fragmentShaderID = ShaderManager.loadShader(ShaderType.FRAGMENT, fragment) - ShaderManager.attachShader(shaderProgram, fragmentShaderID) - - ShaderHelper.glLinkProgram(shaderProgram) - - val linkStatus = ShaderHelper.glGetProgrami(shaderProgram, ShaderHelper.GL_LINK_STATUS) - if (linkStatus == GL11.GL_FALSE) { - LorenzUtils.consoleLog( - "Error occurred when linking program with Vertex Shader: $vertex and Fragment Shader: $fragment : " + - StringUtils.trim(ShaderHelper.glGetProgramInfoLog(shaderProgram, 1024)) - ) - } + run { + val vertexShaderID = ShaderManager.loadShader(ShaderType.VERTEX, vertex).also { if (it == -1) return@run } + ShaderManager.attachShader(shaderProgram, vertexShaderID) + + val fragmentShaderID = ShaderManager.loadShader(ShaderType.FRAGMENT, fragment).also { if (it == -1) return@run } + ShaderManager.attachShader(shaderProgram, fragmentShaderID) - this.registerUniforms() + ShaderHelper.glLinkProgram(shaderProgram) + + 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." + val errorLog = StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderProgram, 1024)) + + if (ShaderManager.inWorld()) { + ErrorManager.logErrorWithData( + OpenGLException("Shader linking error."), + errorMessage, + "Link Error:\n" to errorLog + ) + } else { + LorenzUtils.consoleLog("$errorMessage $errorLog") + } + + return@run + } + + this.registerUniforms() + created = true + } } abstract fun registerUniforms() 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 2308f24bdd67..01993058a112 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt @@ -2,12 +2,14 @@ package at.hannibal2.skyhanni.utils.shader import at.hannibal2.skyhanni.features.chroma.ChromaShader import at.hannibal2.skyhanni.features.misc.RoundedRectangleShader +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils +import java.io.BufferedReader +import java.io.InputStreamReader import net.minecraft.client.Minecraft import net.minecraft.util.ResourceLocation import org.apache.commons.lang3.StringUtils -import java.io.BufferedReader -import java.io.InputStreamReader +import org.lwjgl.opengl.OpenGLException /** * Object to handle shaders for SkyHanni @@ -45,6 +47,8 @@ object ShaderManager { shaders[shaderName] = shader } + if (!shader.created) return + activeShader = shader shader.enable() shader.updateUniforms() @@ -76,14 +80,27 @@ object ShaderManager { ShaderHelper.glCompileShader(shaderID) if (ShaderHelper.glGetShaderi(shaderID, ShaderHelper.GL_COMPILE_STATUS) == 0) { - LorenzUtils.consoleLog( - "Error occurred when compiling shader $fileName${type.extension} : " + - StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderID, 1024)) - ) + val errorMessage = "Failed to compile shader $fileName${type.extension}. Features that utilise this " + + "shader will not work correctly, if at all." + val errorLog = StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderID, 1024)) + + if (inWorld()) { + ErrorManager.logErrorWithData( + OpenGLException("Shader compilation error."), + errorMessage, + "GLSL Compilation Error:\n" to errorLog + ) + } else { + LorenzUtils.consoleLog("$errorMessage $errorLog") + } + + return -1 } return shaderID } + + fun inWorld() = (Minecraft.getMinecraft().theWorld != null) && (Minecraft.getMinecraft().thePlayer != null) } enum class ShaderType(val extension: String, val shaderType: Int) { diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh b/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh index 97dcfa9a4956..9f3c317860b5 100644 --- a/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rect.fsh @@ -1,20 +1,34 @@ -// Based on https://www.shadertoy.com/view/WtdSDs - #version 130 +uniform float scaleFactor; uniform float radius; uniform float smoothness; uniform vec2 halfSize; uniform vec2 centerPos; -varying vec4 color; +in vec4 color; +// From https://www.shadertoy.com/view/WtdSDs float roundedRectSDF(vec2 center, vec2 halfSize, float radius) { return length(max(abs(center) - halfSize + radius, 0.0)) - radius; } void main() { - float distance = roundedRectSDF(gl_FragCoord.xy - centerPos, halfSize, radius); + float xScale = gl_ModelViewMatrix[0][0]; + float yScale = gl_ModelViewMatrix[1][1]; + float xTranslation = gl_ModelViewMatrix[3][0]; + float yTranslation = gl_ModelViewMatrix[3][1]; + + vec2 newHalfSize = vec2(halfSize.x * xScale, halfSize.y * yScale); + + float newCenterPosY = centerPos.y; + if (yScale > 1.0) { + newCenterPosY = centerPos.y - (halfSize.y * (yScale - 1)); + } + + vec2 newCenterPos = vec2((centerPos.x * xScale) + (xTranslation * scaleFactor), newCenterPosY - (yTranslation * scaleFactor)); + + float distance = roundedRectSDF(gl_FragCoord.xy - newCenterPos, newHalfSize, radius); float smoothed = 1.0 - smoothstep(0.0, smoothness, distance); gl_FragColor = color * vec4(1.0, 1.0, 1.0, smoothed); } \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh b/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh index 8a2c196ac63b..beadbf5fb142 100644 --- a/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rect.vsh @@ -1,6 +1,6 @@ #version 130 -varying vec4 color; +out vec4 color; void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; From 18b2bf9c4069dcba328673809926f572892e6f9f Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Sun, 7 Jan 2024 14:02:45 +0100 Subject: [PATCH 003/260] Added Alignment --- .../skyhanni/utils/renderables/Renderable.kt | 77 ++++++++++++++----- .../utils/renderables/RenderableUtils.kt | 43 +++++++++++ 2 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt index 9367e5ee13bf..771d80f8e5c8 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt @@ -19,6 +19,9 @@ import kotlin.math.max interface Renderable { val width: Int val height: Int + + val horizontalAlign: HorizontalAlignment + val verticalAlign: VerticalAlignment fun isHovered(posX: Int, posY: Int) = currentRenderPassMousePosition?.let { (x, y) -> x in (posX..posX + width) && y in (posY..posY + height) // TODO: adjust for variable height? @@ -47,6 +50,10 @@ interface Renderable { } } + enum class HorizontalAlignment { Left, Center, Right } + enum class VerticalAlignment { Top, Center, Bottom } + + fun fromAny(any: Any?, itemScale: Double = 1.0): Renderable? = when (any) { null -> placeholder(12) is Renderable -> any @@ -62,7 +69,7 @@ interface Renderable { text: String, onClick: () -> Unit, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ): Renderable = link(string(text), onClick, bypassChecks, condition) @@ -70,7 +77,7 @@ interface Renderable { renderable: Renderable, onClick: () -> Unit, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ): Renderable { return clickable( hoverable(underlined(renderable), renderable, bypassChecks, condition = condition), @@ -85,7 +92,7 @@ interface Renderable { text: String, tips: List, bypassChecks: Boolean = false, - onClick: () -> Unit + onClick: () -> Unit, ): Renderable { return clickable(hoverTips(text, tips, bypassChecks = bypassChecks), onClick, bypassChecks = bypassChecks) } @@ -95,12 +102,13 @@ interface Renderable { onClick: () -> Unit, button: Int = 0, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ) = object : Renderable { - override val width: Int - get() = render.width - override val height = 10 + override val width = render.width + override val height = render.height + override val horizontalAlign = render.horizontalAlign + override val verticalAlign = render.verticalAlign private var wasDown = false @@ -124,14 +132,15 @@ interface Renderable { indexes: List = listOf(), stack: ItemStack? = null, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ): Renderable { val render = string(text) return object : Renderable { - override val width: Int - get() = render.width - override val height = 11 + override val width = render.width + override val height = render.height + override val horizontalAlign = render.horizontalAlign + override val verticalAlign = render.verticalAlign override fun render(posX: Int, posY: Int) { render.render(posX, posY) @@ -199,6 +208,8 @@ interface Renderable { override val width: Int get() = renderable.width override val height = 10 + override val horizontalAlign = renderable.horizontalAlign + override val verticalAlign = renderable.verticalAlign override fun render(posX: Int, posY: Int) { Gui.drawRect(0, 10, width, 11, 0xFFFFFFFF.toInt()) @@ -211,25 +222,40 @@ interface Renderable { hovered: Renderable, unhovered: Renderable, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ) = object : Renderable { override val width: Int get() = max(hovered.width, unhovered.width) override val height = 10 + override val horizontalAlign get() = if (isHovered) hovered.horizontalAlign else unhovered.horizontalAlign + override val verticalAlign get() = if (isHovered) hovered.verticalAlign else unhovered.verticalAlign + + var isHovered = false override fun render(posX: Int, posY: Int) { - if (isHovered(posX, posY) && condition() && shouldAllowLink(true, bypassChecks)) + if (isHovered(posX, posY) && condition() && shouldAllowLink(true, bypassChecks)) { hovered.render(posX, posY) - else + isHovered = true + } else { unhovered.render(posX, posY) + isHovered = false + } + } } - fun itemStack(any: ItemStack, scale: Double = 1.0) = object : Renderable { + fun itemStack( + any: ItemStack, + scale: Double = 1.0, + horizontalAlign: HorizontalAlignment = HorizontalAlignment.Left, + verticalAlign: VerticalAlignment = VerticalAlignment.Top, + ) = object : Renderable { override val width: Int get() = 12 override val height = 10 + override val horizontalAlign = horizontalAlign + override val verticalAlign = verticalAlign override fun render(posX: Int, posY: Int) { GlStateManager.pushMatrix() @@ -244,19 +270,28 @@ interface Renderable { return Collections.singletonList(string(string)) } - fun string(string: String) = object : Renderable { + fun string( + text: String, + horizontalAlign: HorizontalAlignment = HorizontalAlignment.Left, + verticalAlign: VerticalAlignment = VerticalAlignment.Top, + ) = object : Renderable { + override val width: Int - get() = Minecraft.getMinecraft().fontRendererObj.getStringWidth(string) + get() = Minecraft.getMinecraft().fontRendererObj.getStringWidth(text) override val height = 10 + override val horizontalAlign = horizontalAlign + override val verticalAlign = verticalAlign override fun render(posX: Int, posY: Int) { - Minecraft.getMinecraft().fontRendererObj.drawStringWithShadow("§f$string", 1f, 1f, 0) + Minecraft.getMinecraft().fontRendererObj.drawStringWithShadow("§f$text", 1f, 1f, 0) } } - fun placeholder(width: Int) = object : Renderable { - override val width: Int = width - override val height = 10 + fun placeholder(width: Int, height: Int = 10) = object : Renderable { + override val width = width + override val height = height + override val horizontalAlign = HorizontalAlignment.Left + override val verticalAlign = VerticalAlignment.Top override fun render(posX: Int, posY: Int) { } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt new file mode 100644 index 000000000000..d405e9189b93 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt @@ -0,0 +1,43 @@ +package at.hannibal2.skyhanni.utils.renderables + +import at.hannibal2.skyhanni.utils.renderables.Renderable.Companion.HorizontalAlignment +import at.hannibal2.skyhanni.utils.renderables.Renderable.Companion.VerticalAlignment +import net.minecraft.client.renderer.GlStateManager + +internal object RenderableUtils { + + private fun calculateAlignmentXOffset(renderable: Renderable, xSpace: Int) = when (renderable.horizontalAlign) { + HorizontalAlignment.Left -> 0 + HorizontalAlignment.Center -> (xSpace - renderable.width) / 2 + HorizontalAlignment.Right -> xSpace - renderable.width + } + + private fun calculateAlignmentYOffset(renderable: Renderable, ySpace: Int) = when (renderable.verticalAlign) { + VerticalAlignment.Top -> 0 + VerticalAlignment.Center -> (ySpace - renderable.height) / 2 + VerticalAlignment.Bottom -> ySpace - renderable.height + } + + fun Renderable.renderXYAligned(posX: Int, posY: Int, xSpace: Int, ySpace: Int) { + val xOffset = calculateAlignmentXOffset(this, xSpace) + val yOffset = calculateAlignmentYOffset(this, ySpace) + GlStateManager.translate(xOffset.toFloat(), yOffset.toFloat(), 0f) + this.render(posX + xOffset, posY + yOffset) + GlStateManager.translate(-xOffset.toFloat(), -yOffset.toFloat(), 0f) + } + + fun Renderable.renderXAligned(posX: Int, posY: Int, xSpace: Int) { + val xOffset = calculateAlignmentXOffset(this, xSpace) + GlStateManager.translate(xOffset.toFloat(), 0f, 0f) + this.render(posX + xOffset, posY) + GlStateManager.translate(-xOffset.toFloat(), 0f, 0f) + } + + fun Renderable.renderYAligned(posX: Int, posY: Int, ySpace: Int) { + val yOffset = calculateAlignmentYOffset(this, ySpace) + GlStateManager.translate(0f, yOffset.toFloat(), 0f) + this.render(posX, posY + yOffset) + GlStateManager.translate(0f, -yOffset.toFloat(), 0f) + } + +} From fcd801b67e35f00971acfc9df5b866d4ba76db13 Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Thu, 28 Dec 2023 17:26:47 +0100 Subject: [PATCH 004/260] added Renderable support --- .../skyhanni/utils/renderables/Renderable.kt | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt index 9367e5ee13bf..0e9bf16de419 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt @@ -4,6 +4,7 @@ import at.hannibal2.skyhanni.config.core.config.gui.GuiPositionEditor import at.hannibal2.skyhanni.data.ToolTipData import at.hannibal2.skyhanni.utils.LorenzLogger import at.hannibal2.skyhanni.utils.NEUItems.renderOnScreen +import at.hannibal2.skyhanni.utils.RenderUtils import io.github.moulberry.moulconfig.gui.GuiScreenElementWrapper import io.github.moulberry.notenoughupdates.util.Utils import net.minecraft.client.Minecraft @@ -13,6 +14,7 @@ import net.minecraft.client.gui.inventory.GuiEditSign import net.minecraft.client.renderer.GlStateManager import net.minecraft.item.ItemStack import org.lwjgl.input.Mouse +import java.awt.Color import java.util.Collections import kotlin.math.max @@ -62,7 +64,7 @@ interface Renderable { text: String, onClick: () -> Unit, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ): Renderable = link(string(text), onClick, bypassChecks, condition) @@ -70,7 +72,7 @@ interface Renderable { renderable: Renderable, onClick: () -> Unit, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ): Renderable { return clickable( hoverable(underlined(renderable), renderable, bypassChecks, condition = condition), @@ -85,7 +87,7 @@ interface Renderable { text: String, tips: List, bypassChecks: Boolean = false, - onClick: () -> Unit + onClick: () -> Unit, ): Renderable { return clickable(hoverTips(text, tips, bypassChecks = bypassChecks), onClick, bypassChecks = bypassChecks) } @@ -95,7 +97,7 @@ interface Renderable { onClick: () -> Unit, button: Int = 0, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ) = object : Renderable { override val width: Int @@ -124,7 +126,7 @@ interface Renderable { indexes: List = listOf(), stack: ItemStack? = null, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ): Renderable { val render = string(text) @@ -211,7 +213,7 @@ interface Renderable { hovered: Renderable, unhovered: Renderable, bypassChecks: Boolean = false, - condition: () -> Boolean = { true } + condition: () -> Boolean = { true }, ) = object : Renderable { override val width: Int @@ -254,6 +256,24 @@ interface Renderable { } } + fun drawInsideRoundedRect( + input: Renderable, + color: Color, + padding: Int = 2, + radius: Int = 10, + smoothness: Int = 2, + ) = object : Renderable { + override val width = input.width + padding * 2 + override val height = input.height + padding * 2 + + override fun render(posX: Int, posY: Int) { + RenderUtils.drawRoundRect(0, 0, width, height, color.rgb, radius, smoothness) + GlStateManager.translate(padding.toFloat(), padding.toFloat(), 0f) + input.render(posX + padding, posY + padding) + GlStateManager.translate(-padding.toFloat(), -padding.toFloat(), 0f) + } + } + fun placeholder(width: Int) = object : Renderable { override val width: Int = width override val height = 10 From 653d1e26ac032773bd4e244e107961e5c19b2744 Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Mon, 15 Jan 2024 19:49:45 +0100 Subject: [PATCH 005/260] moved alignment enums to renderUtils --- .../at/hannibal2/skyhanni/utils/RenderUtils.kt | 3 +++ .../skyhanni/utils/renderables/Renderable.kt | 18 ++++++++---------- .../utils/renderables/RenderableUtils.kt | 16 ++++++++-------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index b7bbf948778a..68e20ac8b7b0 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -34,6 +34,9 @@ import kotlin.time.DurationUnit object RenderUtils { + enum class HorizontalAlignment { LEFT, CENTER, RIGHT } + enum class VerticalAlignment { TOP, CENTER, BOTTOM } + private val beaconBeam = ResourceLocation("textures/entity/beacon_beam.png") infix fun Slot.highlight(color: LorenzColor) { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt index 771d80f8e5c8..137f1068cd3a 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt @@ -4,6 +4,8 @@ import at.hannibal2.skyhanni.config.core.config.gui.GuiPositionEditor import at.hannibal2.skyhanni.data.ToolTipData import at.hannibal2.skyhanni.utils.LorenzLogger import at.hannibal2.skyhanni.utils.NEUItems.renderOnScreen +import at.hannibal2.skyhanni.utils.RenderUtils.HorizontalAlignment +import at.hannibal2.skyhanni.utils.RenderUtils.VerticalAlignment import io.github.moulberry.moulconfig.gui.GuiScreenElementWrapper import io.github.moulberry.notenoughupdates.util.Utils import net.minecraft.client.Minecraft @@ -50,10 +52,6 @@ interface Renderable { } } - enum class HorizontalAlignment { Left, Center, Right } - enum class VerticalAlignment { Top, Center, Bottom } - - fun fromAny(any: Any?, itemScale: Double = 1.0): Renderable? = when (any) { null -> placeholder(12) is Renderable -> any @@ -248,8 +246,8 @@ interface Renderable { fun itemStack( any: ItemStack, scale: Double = 1.0, - horizontalAlign: HorizontalAlignment = HorizontalAlignment.Left, - verticalAlign: VerticalAlignment = VerticalAlignment.Top, + horizontalAlign: HorizontalAlignment = HorizontalAlignment.LEFT, + verticalAlign: VerticalAlignment = VerticalAlignment.TOP, ) = object : Renderable { override val width: Int get() = 12 @@ -272,8 +270,8 @@ interface Renderable { fun string( text: String, - horizontalAlign: HorizontalAlignment = HorizontalAlignment.Left, - verticalAlign: VerticalAlignment = VerticalAlignment.Top, + horizontalAlign: HorizontalAlignment = HorizontalAlignment.LEFT, + verticalAlign: VerticalAlignment = VerticalAlignment.TOP, ) = object : Renderable { override val width: Int @@ -290,8 +288,8 @@ interface Renderable { fun placeholder(width: Int, height: Int = 10) = object : Renderable { override val width = width override val height = height - override val horizontalAlign = HorizontalAlignment.Left - override val verticalAlign = VerticalAlignment.Top + override val horizontalAlign = HorizontalAlignment.LEFT + override val verticalAlign = VerticalAlignment.TOP override fun render(posX: Int, posY: Int) { } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt index d405e9189b93..9c6b94a55675 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt @@ -1,21 +1,21 @@ package at.hannibal2.skyhanni.utils.renderables -import at.hannibal2.skyhanni.utils.renderables.Renderable.Companion.HorizontalAlignment -import at.hannibal2.skyhanni.utils.renderables.Renderable.Companion.VerticalAlignment +import at.hannibal2.skyhanni.utils.RenderUtils.HorizontalAlignment +import at.hannibal2.skyhanni.utils.RenderUtils.VerticalAlignment import net.minecraft.client.renderer.GlStateManager internal object RenderableUtils { private fun calculateAlignmentXOffset(renderable: Renderable, xSpace: Int) = when (renderable.horizontalAlign) { - HorizontalAlignment.Left -> 0 - HorizontalAlignment.Center -> (xSpace - renderable.width) / 2 - HorizontalAlignment.Right -> xSpace - renderable.width + HorizontalAlignment.LEFT -> 0 + HorizontalAlignment.CENTER -> (xSpace - renderable.width) / 2 + HorizontalAlignment.RIGHT -> xSpace - renderable.width } private fun calculateAlignmentYOffset(renderable: Renderable, ySpace: Int) = when (renderable.verticalAlign) { - VerticalAlignment.Top -> 0 - VerticalAlignment.Center -> (ySpace - renderable.height) / 2 - VerticalAlignment.Bottom -> ySpace - renderable.height + VerticalAlignment.TOP -> 0 + VerticalAlignment.CENTER -> (ySpace - renderable.height) / 2 + VerticalAlignment.BOTTOM -> ySpace - renderable.height } fun Renderable.renderXYAligned(posX: Int, posY: Int, xSpace: Int, ySpace: Int) { From e30247e1b06bf82aab60399cef8b97bed1edbc73 Mon Sep 17 00:00:00 2001 From: Thunderblade73 <85900443+Thunderblade73@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:17:07 +0100 Subject: [PATCH 006/260] removed unintentional changes --- .../hannibal2/skyhanni/utils/shader/Shader.kt | 88 +++++++++++++------ .../skyhanni/utils/shader/ShaderHelper.kt | 6 +- .../skyhanni/utils/shader/ShaderManager.kt | 3 +- 3 files changed, 63 insertions(+), 34 deletions(-) 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 e09972817fff..03b2fb3acddb 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt @@ -2,11 +2,14 @@ package at.hannibal2.skyhanni.utils.shader import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils -import java.util.function.Supplier +import net.minecraft.client.Minecraft +import net.minecraft.client.renderer.OpenGlHelper +import net.minecraft.client.resources.IReloadableResourceManager import net.minecraft.client.shader.ShaderLinkHelper import org.apache.commons.lang3.StringUtils import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.OpenGLException +import java.util.function.Supplier /** * Superclass for shader objects to compile and attach vertex and fragment shaders to the shader program @@ -26,36 +29,63 @@ abstract class Shader(val vertex: String, val fragment: String) { var created = false init { - run { - val vertexShaderID = ShaderManager.loadShader(ShaderType.VERTEX, vertex).also { if (it == -1) return@run } - ShaderManager.attachShader(shaderProgram, vertexShaderID) - - val fragmentShaderID = ShaderManager.loadShader(ShaderType.FRAGMENT, fragment).also { if (it == -1) return@run } - ShaderManager.attachShader(shaderProgram, fragmentShaderID) - - ShaderHelper.glLinkProgram(shaderProgram) - - 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." - val errorLog = StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderProgram, 1024)) - - if (ShaderManager.inWorld()) { - ErrorManager.logErrorWithData( - OpenGLException("Shader linking error."), - errorMessage, - "Link Error:\n" to errorLog - ) - } else { - LorenzUtils.consoleLog("$errorMessage $errorLog") - } - - return@run - } + recompile() + (Minecraft.getMinecraft().resourceManager as IReloadableResourceManager).registerReloadListener { + recompile() + } + } + + fun deleteOldShaders() { + if (vertexShaderID >= 0) { + OpenGlHelper.glDeleteShader(vertexShaderID) + vertexShaderID = -1 + } + if (fragmentShaderID >= 0) { + OpenGlHelper.glDeleteShader(fragmentShaderID) + fragmentShaderID = -1 + } + if (shaderProgram >= 0) { + OpenGlHelper.glDeleteProgram(shaderProgram) + shaderProgram = -1 + } + uniforms.clear() + created = false + } - this.registerUniforms() - created = true + fun recompile() { + deleteOldShaders() + shaderProgram = ShaderLinkHelper.getStaticShaderLinkHelper().createProgram() + if (shaderProgram < 0) return + + vertexShaderID = ShaderManager.loadShader(ShaderType.VERTEX, vertex) + if (vertexShaderID < 0) return + ShaderManager.attachShader(shaderProgram, vertexShaderID) + + fragmentShaderID = ShaderManager.loadShader(ShaderType.FRAGMENT, fragment) + if (fragmentShaderID < 0) return + ShaderManager.attachShader(shaderProgram, fragmentShaderID) + + ShaderHelper.glLinkProgram(shaderProgram) + + 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" + val errorLog = StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderProgram, 1024)) + + if (ShaderManager.inWorld()) { + ErrorManager.logErrorWithData( + OpenGLException("Shader linking error."), + errorMessage, + "Link Error:\n" to errorLog + ) + } else { + LorenzUtils.consoleLog("$errorMessage $errorLog") + } + return } + + this.registerUniforms() + created = true } abstract fun registerUniforms() diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt index 6e36285b10d0..fdc34f0ae4ff 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt @@ -139,9 +139,9 @@ class ShaderHelper { fun glUniform2f(location: Int, v0: Float, v1: Float) { if (USING_ARB_SHADERS) ARBShaderObjects.glUniform2fARB(location, v0, v1) else GL20.glUniform2f( - location, - v0, - v1 + location, + v0, + v1 ) } 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 52719f2d4068..9398d0e53871 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt @@ -33,7 +33,6 @@ object ShaderManager { "standard_chroma" -> STANDARD_CHROMA.shader "textured_chroma" -> TEXTURED_CHROMA.shader "rounded_rect" -> ROUNDED_RECTANGLE.shader - "rounded_rect" -> ROUNDED_RECTANGLE.shader else -> { null } @@ -87,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()) { From ed3209e70866950759fe8f70dfd2ce50cba52a55 Mon Sep 17 00:00:00 2001 From: Thunderblade73 <85900443+Thunderblade73@users.noreply.github.com> Date: Fri, 8 Mar 2024 21:51:40 +0100 Subject: [PATCH 007/260] init --- .../skyhanni/data/model/TabWidget.kt | 22 +++++++++++++++++++ .../skyhanni/events/TabWidgetUpdate.kt | 8 +++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/events/TabWidgetUpdate.kt diff --git a/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt b/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt new file mode 100644 index 000000000000..9e2e39ddd4ca --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt @@ -0,0 +1,22 @@ +package at.hannibal2.skyhanni.data.model + +import at.hannibal2.skyhanni.events.TabWidgetUpdate +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern + +enum class TabWidget(pattern0: String) { + + ; + + val pattern by RepoPattern.pattern("tab.widget.$name", pattern0) + + fun postEvent(lines: List) = TabWidgetUpdate(this, lines).postAndCatch() + + fun isEventForThis(event: TabWidgetUpdate) = event.widget == this + + companion object { + init { + entries.forEach { it.pattern } + + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/events/TabWidgetUpdate.kt b/src/main/java/at/hannibal2/skyhanni/events/TabWidgetUpdate.kt new file mode 100644 index 000000000000..9bb9d5b58514 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/events/TabWidgetUpdate.kt @@ -0,0 +1,8 @@ +package at.hannibal2.skyhanni.events + +import at.hannibal2.skyhanni.data.model.TabWidget + +class TabWidgetUpdate( + val widget: TabWidget, + val lines: List, +) : LorenzEvent() From 6a43b1e391bac1cf1fb6bcc191436b21ca440328 Mon Sep 17 00:00:00 2001 From: Thunderblade73 <85900443+Thunderblade73@users.noreply.github.com> Date: Tue, 12 Mar 2024 19:32:40 +0100 Subject: [PATCH 008/260] added all widgets --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../skyhanni/data/model/TabWidget.kt | 135 +++++++++++++++++- 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 6c05aadbda3c..03f55167b177 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -50,6 +50,7 @@ import at.hannibal2.skyhanni.data.TrackerManager import at.hannibal2.skyhanni.data.jsonobjects.local.FriendsJson import at.hannibal2.skyhanni.data.jsonobjects.local.JacobContestsJson import at.hannibal2.skyhanni.data.jsonobjects.local.KnownFeaturesJson +import at.hannibal2.skyhanni.data.model.TabWidget import at.hannibal2.skyhanni.data.repo.RepoManager import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.events.PreInitFinishedEvent @@ -469,6 +470,7 @@ class SkyHanniMod { loadModule(BossbarData) loadModule(EntityUtils) loadModule(ChatUtils) + loadModule(TabWidget) // APIs loadModule(BazaarApi()) diff --git a/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt b/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt index 9e2e39ddd4ca..3430f11014c1 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/model/TabWidget.kt @@ -1,22 +1,153 @@ package at.hannibal2.skyhanni.data.model +import at.hannibal2.skyhanni.events.TabListUpdateEvent import at.hannibal2.skyhanni.events.TabWidgetUpdate +import at.hannibal2.skyhanni.utils.CollectionUtils.editCopy +import at.hannibal2.skyhanni.utils.CollectionUtils.getOrNull +import at.hannibal2.skyhanni.utils.ConditionalUtils.transformIf +import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern +import io.github.moulberry.moulconfig.observer.Property +import net.minecraftforge.fml.common.eventhandler.EventPriority +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -enum class TabWidget(pattern0: String) { +enum class TabWidget( + pattern0: String +) { + PLAYER_LIST("(?:§.)*Players (?:§.)*\\(\\d+\\)"), + INFO("(?:§.)*Info"), + AREA("(?:§.)*(Area|Dungeon): (?:§.)*(?.*)"), + SERVER( + "Server: (?:§.)*(?.*)" + ), + GEMS("Gems: (?:§.)*(?.*)"), + FAIRY_SOULS("Fairy Souls: (?:§.)*(?\\d+)(?:§.)*\\/(?:§.)*(?\\d+)"), + PROFILE("(?:§.)*Profile: (?:§.)*(?\\S+) .*"), + SB_LEVEL( + "SB Level(?:§.)*: (?:§.)*\\[(?:§.)*(?\\d+)(?:§.)*\\] (?:§.)*(?\\d+).*" + ), + BANK("Bank: (?:§.)*(?[^§]+)(?:\\(?:§.)*/(?:§.)*(?.*))?"), + INTEREST("Interest: (?:§.)*(?