Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backend: *RenderUtils Todos #3067

Open
wants to merge 4 commits into
base: beta
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion src/main/java/at/hannibal2/skyhanni/utils/ColorUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,24 @@ object ColorUtils {

fun String.getFirstColorCode() = takeIf { it.firstOrNull() == '§' }?.getOrNull(1)

fun getAlpha(color: Int) = color shr 24 and 0xFF

fun getRed(color: Int) = color shr 16 and 0xFF

fun getGreen(color: Int) = color shr 8 and 0xFF

fun getBlue(color: Int) = color and 0xFF

fun getAlpha(color: Int) = color shr 24 and 0xFF
/**
* Returns a quad of the color's alpha, red, green, and blue values, in that order.
*/
fun getQuad(color: Int): Quad<Float, Float, Float, Float> =
Quad(
getAlpha(color) / 255f,
getRed(color) / 255f,
getGreen(color) / 255f,
getBlue(color) / 255f
)

fun blendRGB(start: Color, end: Color, percent: Double) = Color(
(start.red * (1 - percent) + end.red * percent).toInt(),
Expand Down
228 changes: 17 additions & 211 deletions src/main/java/at/hannibal2/skyhanni/utils/GuiRenderUtils.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package at.hannibal2.skyhanni.utils

import at.hannibal2.skyhanni.config.features.skillprogress.SkillProgressBarConfig
import at.hannibal2.skyhanni.features.chroma.ChromaShaderManager
import at.hannibal2.skyhanni.features.chroma.ChromaType
import at.hannibal2.skyhanni.utils.NumberUtil.fractionOf
import at.hannibal2.skyhanni.utils.NumberUtil.roundTo
import at.hannibal2.skyhanni.utils.RenderUtils.HorizontalAlignment
Expand All @@ -20,16 +17,13 @@ import org.lwjgl.opengl.GL11
import org.lwjgl.opengl.GL14
import java.awt.Color
import java.text.DecimalFormat
import kotlin.math.ceil
import kotlin.math.min

/**
* Some functions taken from NotEnoughUpdates
*/
// TODO cleanup of redundant functions
object GuiRenderUtils {

fun drawStringCentered(str: String?, fr: FontRenderer, x: Float, y: Float, shadow: Boolean, color: Int) {
private fun drawStringCentered(str: String?, fr: FontRenderer, x: Float, y: Float, shadow: Boolean, color: Int) {
val strLen = fr.getStringWidth(str)
val x2 = x - strLen / 2f
val y2 = y - fr.FONT_HEIGHT / 2f
Expand All @@ -46,45 +40,13 @@ object GuiRenderUtils {
Minecraft.getMinecraft().fontRendererObj.drawString(str, x.toFloat(), y.toFloat(), 0xffffff, true)
}

fun drawTwoLineString(str: String, x: Float, y: Float) {
val desiredSplitIndex = str.length / 2
var splitIndex = -1
var lastColorCode = ""

for (i in desiredSplitIndex downTo 0) {
if (str[i] == ' ') {
splitIndex = i
break
}
}

if (splitIndex == -1) {
splitIndex = desiredSplitIndex
}
for (i in 0 until desiredSplitIndex) {
if (str[i] == '§' && i + 1 < str.length) {
lastColorCode = str.substring(i, i + 2)
}
}

val firstString = str.substring(0, splitIndex).trim()
val secondString = lastColorCode + str.substring(splitIndex).trim()

Minecraft.getMinecraft().fontRendererObj.drawString(firstString, x, y - 5, 0xffffff, true)
Minecraft.getMinecraft().fontRendererObj.drawString(secondString, x, y + 5, 0xffffff, true)
}

fun drawStringCentered(str: String?, x: Int, y: Int) {
drawStringCentered(
str, Minecraft.getMinecraft().fontRendererObj, x.toFloat(), y.toFloat(), true, 0xffffff,
)
}

fun drawStringCentered(str: String?, x: Float, y: Float) {
drawStringCentered(str, x.toInt(), y.toInt())
}

fun renderItemStack(item: ItemStack, x: Int, y: Int) {
private fun renderItemStack(item: ItemStack, x: Int, y: Int) {
val itemRender = Minecraft.getMinecraft().renderItem
RenderHelper.enableGUIStandardItemLighting()
itemRender.zLevel = -145f
Expand All @@ -93,87 +55,6 @@ object GuiRenderUtils {
RenderHelper.disableStandardItemLighting()
}

// Code taken and edited from NEU
private fun drawTooltip(
textLines: List<String>,
mouseX: Int,
mouseY: Int,
screenHeight: Int,
fr: FontRenderer,
) {
if (textLines.isNotEmpty()) {
val borderColor = StringUtils.getColor(textLines[0], 0x505000FF)

GlStateManager.disableRescaleNormal()
RenderHelper.disableStandardItemLighting()
GlStateManager.disableLighting()
GlStateManager.enableDepth()
var tooltipTextWidth = 0

for (textLine in textLines) {
val textLineWidth: Int = fr.getStringWidth(textLine)
if (textLineWidth > tooltipTextWidth) {
tooltipTextWidth = textLineWidth
}
}

val tooltipX = mouseX + 12
var tooltipY = mouseY - 12
var tooltipHeight = 8

if (textLines.size > 1) tooltipHeight += (textLines.size - 1) * 10 + 2
GlStateManager.translate(0f, 0f, 100f)
if (tooltipY + tooltipHeight + 6 > screenHeight) tooltipY = screenHeight - tooltipHeight - 6
// main background
GuiScreen.drawRect(
tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, -0xfeffff0,
)

// borders
GuiScreen.drawRect(
tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, tooltipY + tooltipHeight + 3 - 1, borderColor,
)

GuiScreen.drawRect(
tooltipX + tooltipTextWidth + 2,
tooltipY - 3 + 1,
tooltipX + tooltipTextWidth + 3,
tooltipY + tooltipHeight + 3 - 1,
borderColor,
)

GuiScreen.drawRect(
tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, borderColor,
)

GuiScreen.drawRect(
tooltipX - 3,
tooltipY + tooltipHeight + 2,
tooltipX + tooltipTextWidth + 3,
tooltipY + tooltipHeight + 3,
borderColor,
)
GlStateManager.translate(0f, 0f, -100f)
GlStateManager.disableDepth()

for (line in textLines) {
fr.drawString(line, tooltipX.toFloat(), tooltipY.toFloat(), 0xffffff, true)

tooltipY += if (line == textLines[0]) 12 else 10
}

GlStateManager.enableDepth()
GlStateManager.enableLighting()
GlStateManager.enableRescaleNormal()
RenderHelper.enableStandardItemLighting()
}
GlStateManager.disableLighting()
}

fun drawTooltip(textLines: List<String>, mouseX: Int, mouseY: Int, screenHeight: Int) {
drawTooltip(textLines, mouseX, mouseY, screenHeight, Minecraft.getMinecraft().fontRendererObj)
}

fun isPointInRect(x: Int, y: Int, left: Int, top: Int, width: Int, height: Int) =
left <= x && x < left + width && top <= y && y < top + height

Expand Down Expand Up @@ -217,12 +98,6 @@ object GuiRenderUtils {
)
}

private fun barColorGradient(double: Double): Int {
var newDouble = (double - .5) * 2
if (newDouble < 0) newDouble = 0.0
return Color((255 * (1 - newDouble)).toInt(), (255 * newDouble).toInt(), 0).rgb
}

fun Int.darkenColor(): Int {
val color = Color(this)
return Color(color.red / 5, color.green / 5, color.blue / 5).rgb
Expand All @@ -243,91 +118,18 @@ object GuiRenderUtils {
GuiScreen.drawRect(x, y, x + 16, y + 16, color)
}

// Taken and edited from NEU <- it's broken
fun renderTexturedBar(
x: Float,
y: Float,
xSize: Float,
completed: Float,
color: Color,
useChroma: Boolean,
texture: SkillProgressBarConfig.TexturedBar.UsedTexture,
height: Float,
) {
GlStateManager.pushMatrix()
GlStateManager.translate(x, y, 0f)
val w = xSize.toInt()
val w_2 = w / 2
val k = min(w.toDouble(), ceil((completed * w).toDouble())).toInt()
val vanilla = texture == SkillProgressBarConfig.TexturedBar.UsedTexture.MATCH_PACK
val vMinEmpty = if (vanilla) 64 / 256f else 0f
val vMaxEmpty = if (vanilla) 69 / 256f else .5f
val vMinFilled = if (vanilla) 69 / 256f else .5f
val vMaxFilled = if (vanilla) 74 / 256f else 1f

if (useChroma) {
ChromaShaderManager.begin(ChromaType.TEXTURED)
GlStateManager.color(
Color.LIGHT_GRAY.darker().red / 255f,
Color.LIGHT_GRAY.darker().green / 255f,
Color.LIGHT_GRAY.darker().blue / 255f,
1f,
)
} else {
GlStateManager.color(color.darker().red / 255f, color.darker().green / 255f, color.darker().blue / 255f, 1f)
}

drawTexturedRect(x, y, w_2.toFloat(), height, 0f, w_2 / xSize, vMinEmpty, vMaxEmpty, GL11.GL_NEAREST)
drawTexturedRect(x + w_2, y, w_2.toFloat(), height, 1 - w_2 / xSize, 1f, vMinEmpty, vMaxEmpty, GL11.GL_NEAREST)

if (useChroma) {
GlStateManager.color(Color.WHITE.red / 255f, Color.WHITE.green / 255f, Color.WHITE.blue / 255f, 1f)
} else {
GlStateManager.color(color.red / 255f, color.green / 255f, color.blue / 255f, 1f)
}

if (k > 0) {
val uMax = w_2.toDouble().coerceAtMost(k.toDouble() / xSize).toFloat()
val width = w_2.coerceAtMost(k).toFloat()
drawTexturedRect(x, y, width, height, 0f, uMax, vMinFilled, vMaxFilled, GL11.GL_NEAREST)
if (completed > 0.5f) {
drawTexturedRect(
x + w_2,
y,
(k - w_2).toFloat(),
height,
1 - w_2 / xSize,
1 + (k - w) / xSize,
vMinFilled,
vMaxFilled,
GL11.GL_NEAREST,
)
}
}
if (useChroma) {
ChromaShaderManager.end()
}
GlStateManager.popMatrix()
}

/**@Mojang */
/** @Mojang */
fun drawGradientRect(
left: Int,
top: Int,
right: Int,
bottom: Int,
startColor: Int,
endColor: Int,
zLevel: Double,
startColor: Int = -0xfeffff0,
endColor: Int = -0xfeffff0,
zLevel: Double = 0.0,
) {
val f = (startColor shr 24 and 255).toFloat() / 255.0f
val g = (startColor shr 16 and 255).toFloat() / 255.0f
val h = (startColor shr 8 and 255).toFloat() / 255.0f
val i = (startColor and 255).toFloat() / 255.0f
val j = (endColor shr 24 and 255).toFloat() / 255.0f
val k = (endColor shr 16 and 255).toFloat() / 255.0f
val l = (endColor shr 8 and 255).toFloat() / 255.0f
val m = (endColor and 255).toFloat() / 255.0f
val (startAlpha, startRed, startGreen, startBlue) = ColorUtils.getQuad(startColor)
val (endAlpha, endRed, endGreen, endBlue) = ColorUtils.getQuad(endColor)
GlStateManager.disableTexture2D()
GlStateManager.enableBlend()
GlStateManager.disableAlpha()
Expand All @@ -336,10 +138,14 @@ object GuiRenderUtils {
val tessellator = Tessellator.getInstance()
val worldRenderer = tessellator.worldRenderer
worldRenderer.begin(7, DefaultVertexFormats.POSITION_COLOR)
worldRenderer.pos(right.toDouble(), top.toDouble(), zLevel).color(g, h, i, f).endVertex()
worldRenderer.pos(left.toDouble(), top.toDouble(), zLevel).color(g, h, i, f).endVertex()
worldRenderer.pos(left.toDouble(), bottom.toDouble(), zLevel).color(k, l, m, j).endVertex()
worldRenderer.pos(right.toDouble(), bottom.toDouble(), zLevel).color(k, l, m, j).endVertex()
worldRenderer.pos(right.toDouble(), top.toDouble(), zLevel)
.color(startRed, startGreen, startBlue, startAlpha).endVertex()
worldRenderer.pos(left.toDouble(), top.toDouble(), zLevel)
.color(startRed, startGreen, startBlue, startAlpha).endVertex()
worldRenderer.pos(left.toDouble(), bottom.toDouble(), zLevel)
.color(endRed, endGreen, endBlue, endAlpha).endVertex()
worldRenderer.pos(right.toDouble(), bottom.toDouble(), zLevel)
.color(endRed, endGreen, endBlue, endAlpha).endVertex()
tessellator.draw()
GlStateManager.shadeModel(7424)
GlStateManager.disableBlend()
Expand Down Expand Up @@ -368,7 +174,7 @@ object GuiRenderUtils {
}

// Taken from NEU
fun drawTexturedRect(
private fun drawTexturedRect(
x: Float,
y: Float,
width: Float,
Expand Down
42 changes: 1 addition & 41 deletions src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1912,7 +1912,7 @@ object RenderUtils {
GlStateManager.pushMatrix()
ShaderManager.enableShader(ShaderManager.Shaders.ROUNDED_RECT_OUTLINE)

drawGradientRect(
GuiRenderUtils.drawGradientRect(
x - borderAdjustment,
y - borderAdjustment,
x + width + borderAdjustment,
Expand All @@ -1925,46 +1925,6 @@ object RenderUtils {
GlStateManager.popMatrix()
}

// todo merge with the one in GuiRenderUtils
fun drawGradientRect(
left: Int,
top: Int,
right: Int,
bottom: Int,
startColor: Int = -0xfeffff0,
endColor: Int = -0xfeffff0,
) {
val startAlpha = (startColor shr 24 and 255).toFloat() / 255.0f
val startRed = (startColor shr 16 and 255).toFloat() / 255.0f
val startGreen = (startColor shr 8 and 255).toFloat() / 255.0f
val startBlue = (startColor and 255).toFloat() / 255.0f
val endAlpha = (endColor shr 24 and 255).toFloat() / 255.0f
val endRed = (endColor shr 16 and 255).toFloat() / 255.0f
val endGreen = (endColor shr 8 and 255).toFloat() / 255.0f
val endBlue = (endColor and 255).toFloat() / 255.0f
GlStateManager.disableTexture2D()
GlStateManager.enableBlend()
GlStateManager.disableAlpha()
GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0)
GlStateManager.shadeModel(7425)
val tessellator = Tessellator.getInstance()
val worldrenderer = tessellator.worldRenderer
worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR)
worldrenderer.pos(right.toDouble(), top.toDouble(), 0.0)
.color(startRed, startGreen, startBlue, startAlpha).endVertex()
worldrenderer.pos(left.toDouble(), top.toDouble(), 0.0)
.color(startRed, startGreen, startBlue, startAlpha).endVertex()
worldrenderer.pos(left.toDouble(), bottom.toDouble(), 0.0)
.color(endRed, endGreen, endBlue, endAlpha).endVertex()
worldrenderer.pos(right.toDouble(), bottom.toDouble(), 0.0)
.color(endRed, endGreen, endBlue, endAlpha).endVertex()
tessellator.draw()
GlStateManager.shadeModel(7424)
GlStateManager.disableBlend()
GlStateManager.enableAlpha()
GlStateManager.enableTexture2D()
}

fun getAlpha(): Float {
colorBuffer.clear()
GlStateManager.getFloat(GL11.GL_CURRENT_COLOR, colorBuffer)
Expand Down
Loading
Loading