diff --git a/src/main/kotlin/net/shadowfacts/cacao/util/RenderHelper.kt b/src/main/kotlin/net/shadowfacts/cacao/util/RenderHelper.kt index acc457b..2d3a7fc 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/util/RenderHelper.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/util/RenderHelper.kt @@ -8,6 +8,7 @@ import net.minecraft.client.render.* import net.minecraft.client.sound.PositionedSoundInstance import net.minecraft.client.util.math.MatrixStack import net.minecraft.sound.SoundEvent +import net.minecraft.util.math.Matrix4f import net.shadowfacts.cacao.geometry.Point import net.shadowfacts.cacao.geometry.Rect import net.shadowfacts.cacao.util.texture.Texture @@ -40,11 +41,11 @@ object RenderHelper { /** * Binds and draws the given [texture] filling the [rect]. */ - fun draw(rect: Rect, texture: Texture) { + fun draw(matrixStack: MatrixStack, rect: Rect, texture: Texture) { if (disabled) return color(1f, 1f, 1f, 1f) MinecraftClient.getInstance().textureManager.bindTexture(texture.location) - draw(rect.left, rect.top, texture.u, texture.v, rect.width, rect.height, texture.width, texture.height) + draw(matrixStack, rect.left, rect.top, texture.u, texture.v, rect.width, rect.height, texture.width, texture.height) } fun drawLine(start: Point, end: Point, z: Double, width: Float, color: Color) { @@ -62,27 +63,29 @@ object RenderHelper { /** * Draws the bound texture with the given screen and texture position and size. */ - fun draw(x: Double, y: Double, u: Int, v: Int, width: Double, height: Double, textureWidth: Int, textureHeight: Int) { + fun draw(matrixStack: MatrixStack, x: Double, y: Double, u: Int, v: Int, width: Double, height: Double, textureWidth: Int, textureHeight: Int) { if (disabled) return val uStart = u.toFloat() / textureWidth val uEnd = (u + width).toFloat() / textureWidth val vStart = v.toFloat() / textureHeight val vEnd = (v + height).toFloat() / textureHeight - drawTexturedQuad(x, x + width, y, y + height, 0.0, uStart, uEnd, vStart, vEnd) + drawTexturedQuad(matrixStack.peek().model, x, x + width, y, y + height, 0.0, uStart, uEnd, vStart, vEnd) } // Copied from net.minecraft.client.gui.DrawableHelper - private fun drawTexturedQuad(xStart: Double, xEnd: Double, yStart: Double, yEnd: Double, z: Double, uStart: Float, uEnd: Float, vStart: Float, vEnd: Float) { - val tessellator = Tessellator.getInstance() - val buffer = tessellator.buffer - buffer.begin(GL11.GL_QUADS, VertexFormats.POSITION_TEXTURE) - buffer.vertex(xStart, yEnd, z).texture(uStart, vEnd).next() - buffer.vertex(xEnd, yEnd, z).texture(uEnd, vEnd).next() - buffer.vertex(xEnd, yStart, z).texture(uEnd, vStart).next() - buffer.vertex(xStart, yStart, z).texture(uStart, vStart).next() - tessellator.draw() + private fun drawTexturedQuad(matrix: Matrix4f, x0: Double, x1: Double, y0: Double, y1: Double, z: Double, u0: Float, u1: Float, v0: Float, v1: Float) { + val bufferBuilder = Tessellator.getInstance().buffer + bufferBuilder.begin(GL11.GL_QUADS, VertexFormats.POSITION_TEXTURE) + bufferBuilder.vertex(matrix, x0.toFloat(), y1.toFloat(), z.toFloat()).texture(u0, v1).next() + bufferBuilder.vertex(matrix, x1.toFloat(), y1.toFloat(), z.toFloat()).texture(u1, v1).next() + bufferBuilder.vertex(matrix, x1.toFloat(), y0.toFloat(), z.toFloat()).texture(u1, v0).next() + bufferBuilder.vertex(matrix, x0.toFloat(), y0.toFloat(), z.toFloat()).texture(u0, v0).next() + bufferBuilder.end() + RenderSystem.enableAlphaTest() + BufferRenderer.draw(bufferBuilder) } + /** * @see org.lwjgl.opengl.GL11.glPushMatrix */ @@ -127,4 +130,4 @@ object RenderHelper { return color(color.red, color.green, color.blue, color.alpha) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/Label.kt b/src/main/kotlin/net/shadowfacts/cacao/view/Label.kt index fa82032..35303f8 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/Label.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/Label.kt @@ -3,6 +3,7 @@ package net.shadowfacts.cacao.view import net.minecraft.client.MinecraftClient import net.minecraft.client.font.TextRenderer import net.minecraft.client.util.math.MatrixStack +import net.minecraft.text.LiteralText import net.minecraft.text.OrderedText import net.minecraft.text.Text import net.shadowfacts.cacao.geometry.Point @@ -44,6 +45,14 @@ class Label( LEFT, CENTER, RIGHT } + constructor( + text: String, + shadow: Boolean = true, + maxLines: Int = 0, + wrappingMode: WrappingMode = WrappingMode.WRAP, + textAlignment: TextAlignment = TextAlignment.LEFT, + ): this(LiteralText(text), shadow, maxLines, wrappingMode, textAlignment) + /** * The text of this label. Mutating this field will update the intrinsic content size and trigger a layout. */ diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/NinePatchView.kt b/src/main/kotlin/net/shadowfacts/cacao/view/NinePatchView.kt index 80c6b55..c188b64 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/NinePatchView.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/NinePatchView.kt @@ -77,60 +77,60 @@ open class NinePatchView(val ninePatch: NinePatchTexture): View() { } override fun drawContent(matrixStack: MatrixStack, mouse: Point, delta: Float) { - drawCorners() - drawEdges() - drawCenter() + drawCorners(matrixStack) + drawEdges(matrixStack) + drawCenter(matrixStack) } - private fun drawCorners() { - RenderHelper.draw(topLeft, ninePatch.topLeft) - RenderHelper.draw(topRight, ninePatch.topRight) - RenderHelper.draw(bottomLeft, ninePatch.bottomLeft) - RenderHelper.draw(bottomRight, ninePatch.bottomRight) + private fun drawCorners(matrixStack: MatrixStack) { + RenderHelper.draw(matrixStack, topLeft, ninePatch.topLeft) + RenderHelper.draw(matrixStack, topRight, ninePatch.topRight) + RenderHelper.draw(matrixStack, bottomLeft, ninePatch.bottomLeft) + RenderHelper.draw(matrixStack, bottomRight, ninePatch.bottomRight) } - private fun drawEdges() { + private fun drawEdges(matrixStack: MatrixStack) { // Horizontal for (i in 0 until (topMiddle.width.toInt() / ninePatch.centerWidth)) { - RenderHelper.draw(topMiddle.left + i * ninePatch.centerWidth, topMiddle.top, ninePatch.topMiddle.u, ninePatch.topMiddle.v, ninePatch.centerWidth.toDouble(), topMiddle.height, ninePatch.texture.width, ninePatch.texture.height) - RenderHelper.draw(bottomMiddle.left + i * ninePatch.centerWidth, bottomMiddle.top, ninePatch.bottomMiddle.u, ninePatch.bottomMiddle.v, ninePatch.centerWidth.toDouble(), bottomMiddle.height, ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, topMiddle.left + i * ninePatch.centerWidth, topMiddle.top, ninePatch.topMiddle.u, ninePatch.topMiddle.v, ninePatch.centerWidth.toDouble(), topMiddle.height, ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, bottomMiddle.left + i * ninePatch.centerWidth, bottomMiddle.top, ninePatch.bottomMiddle.u, ninePatch.bottomMiddle.v, ninePatch.centerWidth.toDouble(), bottomMiddle.height, ninePatch.texture.width, ninePatch.texture.height) } val remWidth = topMiddle.width.toInt() % ninePatch.centerWidth if (remWidth > 0) { - RenderHelper.draw(topMiddle.right - remWidth, topMiddle.top, ninePatch.topMiddle.u, ninePatch.topMiddle.v, remWidth.toDouble(), ninePatch.cornerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) - RenderHelper.draw(bottomMiddle.right - remWidth, bottomMiddle.top, ninePatch.bottomMiddle.u, ninePatch.bottomMiddle.v, remWidth.toDouble(), ninePatch.cornerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, topMiddle.right - remWidth, topMiddle.top, ninePatch.topMiddle.u, ninePatch.topMiddle.v, remWidth.toDouble(), ninePatch.cornerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, bottomMiddle.right - remWidth, bottomMiddle.top, ninePatch.bottomMiddle.u, ninePatch.bottomMiddle.v, remWidth.toDouble(), ninePatch.cornerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) } // Vertical for (i in 0 until (leftMiddle.height.toInt() / ninePatch.centerHeight)) { - RenderHelper.draw(leftMiddle.left, leftMiddle.top + i * ninePatch.centerHeight, ninePatch.leftMiddle.u, ninePatch.leftMiddle.v, ninePatch.cornerWidth.toDouble(), ninePatch.centerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) - RenderHelper.draw(rightMiddle.left, rightMiddle.top + i * ninePatch.centerHeight, ninePatch.rightMiddle.u, ninePatch.rightMiddle.v, ninePatch.cornerWidth.toDouble(), ninePatch.centerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, leftMiddle.left, leftMiddle.top + i * ninePatch.centerHeight, ninePatch.leftMiddle.u, ninePatch.leftMiddle.v, ninePatch.cornerWidth.toDouble(), ninePatch.centerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, rightMiddle.left, rightMiddle.top + i * ninePatch.centerHeight, ninePatch.rightMiddle.u, ninePatch.rightMiddle.v, ninePatch.cornerWidth.toDouble(), ninePatch.centerHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) } val remHeight = leftMiddle.height.toInt() % ninePatch.centerHeight if (remHeight > 0) { - RenderHelper.draw(leftMiddle.left, leftMiddle.bottom - remHeight, ninePatch.leftMiddle.u, ninePatch.leftMiddle.v, ninePatch.cornerWidth.toDouble(), remHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) - RenderHelper.draw(rightMiddle.left, rightMiddle.bottom - remHeight, ninePatch.rightMiddle.u, ninePatch.rightMiddle.v, ninePatch.cornerWidth.toDouble(), remHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, leftMiddle.left, leftMiddle.bottom - remHeight, ninePatch.leftMiddle.u, ninePatch.leftMiddle.v, ninePatch.cornerWidth.toDouble(), remHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, rightMiddle.left, rightMiddle.bottom - remHeight, ninePatch.rightMiddle.u, ninePatch.rightMiddle.v, ninePatch.cornerWidth.toDouble(), remHeight.toDouble(), ninePatch.texture.width, ninePatch.texture.height) } } - private fun drawCenter() { + private fun drawCenter(matrixStack: MatrixStack) { for (i in 0 until (center.height.toInt() / ninePatch.centerHeight)) { - drawCenterRow(center.top + i * ninePatch.centerHeight.toDouble(), ninePatch.centerHeight.toDouble()) + drawCenterRow(matrixStack, center.top + i * ninePatch.centerHeight.toDouble(), ninePatch.centerHeight.toDouble()) } val remHeight = center.height.toInt() % ninePatch.centerHeight if (remHeight > 0) { - drawCenterRow(center.bottom - remHeight, remHeight.toDouble()) + drawCenterRow(matrixStack, center.bottom - remHeight, remHeight.toDouble()) } } - private fun drawCenterRow(y: Double, height: Double) { + private fun drawCenterRow(matrixStack: MatrixStack, y: Double, height: Double) { for (i in 0 until (center.width.toInt() / ninePatch.centerWidth)) { - RenderHelper.draw(center.left + i * ninePatch.centerWidth, y, ninePatch.center.u, ninePatch.center.v, ninePatch.centerWidth.toDouble(), height, ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, center.left + i * ninePatch.centerWidth, y, ninePatch.center.u, ninePatch.center.v, ninePatch.centerWidth.toDouble(), height, ninePatch.texture.width, ninePatch.texture.height) } val remWidth = center.width.toInt() % ninePatch.centerWidth if (remWidth > 0) { - RenderHelper.draw(center.right - remWidth, y, ninePatch.center.u, ninePatch.center.v, remWidth.toDouble(), height, ninePatch.texture.width, ninePatch.texture.height) + RenderHelper.draw(matrixStack, center.right - remWidth, y, ninePatch.center.u, ninePatch.center.v, remWidth.toDouble(), height, ninePatch.texture.width, ninePatch.texture.height) } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/TextureView.kt b/src/main/kotlin/net/shadowfacts/cacao/view/TextureView.kt index e34533b..b261089 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/TextureView.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/TextureView.kt @@ -14,7 +14,7 @@ import net.shadowfacts.cacao.util.texture.Texture class TextureView(var texture: Texture): View() { override fun drawContent(matrixStack: MatrixStack, mouse: Point, delta: Float) { - RenderHelper.draw(bounds, texture) + RenderHelper.draw(matrixStack, bounds, texture) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/View.kt b/src/main/kotlin/net/shadowfacts/cacao/view/View.kt index e1f3d3a..f8d9e76 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/View.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/View.kt @@ -262,8 +262,8 @@ open class View() { } if (new != null) { solver.dsl { - this@View.intrinsicContentSizeWidthConstraint = (widthAnchor.equalTo(new.width, strength = WEAK)) - this@View.intrinsicContentSizeHeightConstraint = (heightAnchor.equalTo(new.height, strength = WEAK)) + this@View.intrinsicContentSizeWidthConstraint = (widthAnchor.equalTo(new.width, strength = MEDIUM)) + this@View.intrinsicContentSizeHeightConstraint = (heightAnchor.equalTo(new.height, strength = MEDIUM)) } } } @@ -388,4 +388,4 @@ open class View() { return Rect(convert(rect.origin, to), rect.size) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/button/AbstractButton.kt b/src/main/kotlin/net/shadowfacts/cacao/view/button/AbstractButton.kt index d4431b7..895d121 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/button/AbstractButton.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/button/AbstractButton.kt @@ -60,10 +60,13 @@ abstract class AbstractButton>(val content: View, val override fun wasAdded() { solver.dsl { addSubview(content) - content.leftAnchor equalTo (leftAnchor + padding) - content.rightAnchor equalTo (rightAnchor - padding) - content.topAnchor equalTo (topAnchor + padding) - content.bottomAnchor equalTo (bottomAnchor - padding) + content.centerXAnchor equalTo centerXAnchor + content.centerYAnchor equalTo centerYAnchor + + content.leftAnchor.lessThanOrEqualTo((leftAnchor + padding), WEAK) + content.rightAnchor.greaterThanOrEqualTo(rightAnchor - padding, WEAK) + content.topAnchor.lessThanOrEqualTo(topAnchor + padding, WEAK) + content.bottomAnchor.greaterThanOrEqualTo(bottomAnchor - padding, WEAK) listOfNotNull(background, hoveredBackground, disabledBackground).forEach { addSubview(it) @@ -114,4 +117,4 @@ abstract class AbstractButton>(val content: View, val return true } -} \ No newline at end of file +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/button/Button.kt b/src/main/kotlin/net/shadowfacts/cacao/view/button/Button.kt index f92044d..b9ddc2f 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/button/Button.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/button/Button.kt @@ -9,4 +9,8 @@ import net.shadowfacts.cacao.view.View * @param content The [View] that provides the content of this button. * @param padding The padding between the [content] and the edges of the button. */ -class Button(content: View, padding: Double = 4.0): AbstractButton