From 65c36e44faa8e6a02ae2ab094c8585e3c8a96d04 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Wed, 31 Aug 2022 12:46:33 +0700 Subject: [PATCH] StretchingRectangleElement --- .../mc/otm/client/render/SkinElement.kt | 49 ++++++++++++ .../otm/client/screen/panels/EditablePanel.kt | 10 ++- .../mc/otm/client/screen/panels/FramePanel.kt | 74 +++++++------------ 3 files changed, 84 insertions(+), 49 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SkinElement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SkinElement.kt index 1b74cd7ff..d19f37b97 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SkinElement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SkinElement.kt @@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.client.render import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.client.screen.panels.DockProperty class SkinGrid( val texture: ResourceLocation, @@ -63,6 +64,13 @@ fun ResourceLocation.element( textureHeight: Float = 256f ) = SkinElement(this, x, y, w, h, textureWidth, textureHeight) +fun ResourceLocation.pixel( + x: Float, + y: Float, + textureWidth: Float = 256f, + textureHeight: Float = 256f +) = SkinElement(this, x, y, 1f, 1f, textureWidth, textureHeight) + class SkinElement @JvmOverloads constructor( val texture: ResourceLocation, val x: Float, @@ -234,3 +242,44 @@ class SkinElement @JvmOverloads constructor( winding: UVWindingOrder = UVWindingOrder.U0_V0_U1_V1 ) = renderRawPartial(stack, x.toFloat(), y.toFloat(), width.toFloat(), height.toFloat(), winding) } + +class StretchingRectangleElement( + val topLeft: SkinElement, + val topRight: SkinElement, + val bottomLeft: SkinElement, + val bottomRight: SkinElement, + val left: SkinElement, + val right: SkinElement, + val top: SkinElement, + val bottom: SkinElement, + val middle: SkinElement, + val padding: DockProperty = DockProperty.EMPTY +) { + fun render( + stack: PoseStack, + x: Float = 0f, + y: Float = 0f, + width: Float, + height: Float, + ) { + val bgWidth = width - topLeft.w.coerceAtMost(bottomLeft.w) - topRight.w.coerceAtMost(bottomRight.w) - padding.left - padding.right + val bgHeight = height - topLeft.h.coerceAtMost(bottomLeft.h) - topRight.h.coerceAtMost(bottomRight.h) - padding.top - padding.bottom + + if (bgWidth > 0 && bgHeight > 0) { + middle.render(stack, x + topLeft.w + padding.left, y + topLeft.h + padding.top, bgWidth, bgHeight) + } + + top.render(stack, x + topLeft.w, y, width = width - topLeft.w - topRight.w) + bottom.render(stack, x + bottomLeft.w, y + height - bottom.h, width = width - bottomLeft.w - bottomRight.w) + + left.render(stack, x, y + topLeft.h, height = height - topLeft.h - bottomLeft.h) + right.render(stack, x + width - right.h, y + topRight.h, height = height - topRight.h - bottomRight.h) + + topLeft.render(stack, x, y) + topRight.render(stack, x + width - topRight.w, y) + + bottomLeft.render(stack, x, y + height - bottomLeft.h) + bottomRight.render(stack, x + width - bottomRight.w, y + height - bottomLeft.h) + } +} + diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt index 9d55210cd..e1e0a4597 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt @@ -16,7 +16,11 @@ import kotlin.math.max data class ScreenPos(val x: Float, val y: Float) @JvmRecord -data class DockProperty @JvmOverloads constructor(val left: Float = 0f, val top: Float = 0f, val right: Float = 0f, val bottom: Float = 0f) +data class DockProperty @JvmOverloads constructor(val left: Float = 0f, val top: Float = 0f, val right: Float = 0f, val bottom: Float = 0f) { + companion object { + val EMPTY = DockProperty() + } +} enum class Dock { NONE, LEFT, RIGHT, TOP, BOTTOM, FILL @@ -127,7 +131,7 @@ open class EditablePanel @JvmOverloads constructor( field = value parent?.needsInvalidation = true } - var dockMargin = DockProperty() + var dockMargin = DockProperty.EMPTY set(value) { if (field != value) { parent?.needsInvalidation = true @@ -135,7 +139,7 @@ open class EditablePanel @JvmOverloads constructor( field = value } - var dockPadding = DockProperty() + var dockPadding = DockProperty.EMPTY set(value) { if (field != value) { parent?.needsInvalidation = true diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt index 7f77dbb22..ec89b89c4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt @@ -79,30 +79,30 @@ open class FramePanel( if (isActive) { width = frameTabPosition.active_width height = frameTabPosition.active_height - window_background.render(stack, 2f, 2f, width - 4, height - 2) + RECTANGLE.middle.render(stack, 2f, 2f, width - 4, height - 2) } else { width = frameTabPosition.width height = frameTabPosition.height - tab_background.render(stack, 2f, 2f, width - 4, height - 2) + tabBackground.render(stack, 2f, 2f, width - 4, height - 2) } - top_window_border.renderW(stack, 3f, 0f, width - 6) - left_window_border.renderH(stack, 0f, 3f, (height - if (isActive) if (initial) 2 else 4 else 3)) + RECTANGLE.top.renderW(stack, 3f, 0f, width - 6) + RECTANGLE.left.renderH(stack, 0f, 3f, (height - if (isActive) if (initial) 2 else 4 else 3)) - right_window_border.renderH(stack, width - right_window_border.w, 3f, (height - if (isActive) 4 else 3)) + RECTANGLE.right.renderH(stack, width - RECTANGLE.right.w, 3f, (height - if (isActive) 4 else 3)) - top_left_window_corner.render(stack, 0f, 0f) - top_right_window_corner.render(stack, width - top_right_window_corner.w, 0f) + RECTANGLE.topLeft.render(stack, 0f, 0f) + RECTANGLE.topRight.render(stack, width - RECTANGLE.topRight.w, 0f) if (isActive) { if (!initial) { - tab_left_connection.render(stack, 0f, height - tab_left_connection.h - 1) + tabLeftConnection.render(stack, 0f, height - tabLeftConnection.h - 1) } - tab_right_connection.render( + tabRightConnection.render( stack, - width - tab_right_connection.w, - height - tab_left_connection.h - 1 + width - tabRightConnection.w, + height - tabLeftConnection.h - 1 ) } } @@ -238,29 +238,7 @@ open class FramePanel( } override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { - // background - // RenderSystem.disableDepthTest(); - val bgWidth = width - 4 - val bgHeight = height - 4 - - // background - if (bgWidth > 0 && bgHeight > 0) { - window_background.render(stack, 3f, 3f, bgWidth, bgHeight) - } - - // borders - left_window_border.render(stack, 0f, 4f, 3f, height - 8) - right_window_border.renderRaw(stack, width - 3, 4f, 3f, height - 6) - top_window_border.renderRaw(stack, 4f, 0f, width - 8, 3f) - bottom_window_border.renderRaw(stack, 4f, height - 3, width - 8, 3f) - - // corners - top_left_window_corner.renderRaw(stack) - top_right_window_corner.renderRaw(stack, x = width - 6) - bottom_left_window_corner.renderRaw(stack, y = height - 6) - bottom_right_window_corner.renderRaw(stack, x = width - 6, y = height - 6) - - // RenderSystem.enableDepthTest(); + RECTANGLE.render(stack, width = width, height = height) // title RenderSystem.depthFunc(GL30.GL_ALWAYS) @@ -282,17 +260,21 @@ open class FramePanel( const val PADDING = 8f const val PADDING_TOP = 14f - val top_left_window_corner = WidgetLocation.WIDGETS.element(x = 18f, y = 0f, w = 6f, h = 6f) - val top_right_window_corner = WidgetLocation.WIDGETS.element(x = 24f, y = 0f, w = 6f, h = 6f) - val left_window_border = WidgetLocation.WIDGETS.element(x = 18f, y = 4f, w = 3f, h = 5f) - val right_window_border = WidgetLocation.WIDGETS.element(x = 27f, y = 3f, w = 3f, h = 5f) - val top_window_border = WidgetLocation.WIDGETS.element(x = 22f, y = 0f, w = 5f, h = 3f) - val window_background = WidgetLocation.WIDGETS.element(x = 30f, y = 12f, w = 6f, h = 6f) - val tab_right_connection = WidgetLocation.WIDGETS.element(x = 30f, y = 0f, w = 3f, h = 5f) - val tab_left_connection = WidgetLocation.WIDGETS.element(x = 33f, y = 0f, w = 3f, h = 5f) - val tab_background = WidgetLocation.WIDGETS.element(x = 30f, y = 6f, w = 6f, h = 6f) - val bottom_left_window_corner = WidgetLocation.WIDGETS.element(x = 18f, y = 6f, w = 6f, h = 6f) - val bottom_right_window_corner = WidgetLocation.WIDGETS.element(x = 24f, y = 6f, w = 6f, h = 6f) - val bottom_window_border = WidgetLocation.WIDGETS.element(x = 21f, y = 9f, w = 5f, h = 3f) + val RECTANGLE = StretchingRectangleElement( + topLeft = WidgetLocation.WIDGETS.element(x = 18f, y = 0f, w = 6f, h = 6f), + topRight = WidgetLocation.WIDGETS.element(x = 24f, y = 0f, w = 6f, h = 6f), + left = WidgetLocation.WIDGETS.element(x = 18f, y = 4f, w = 3f, h = 5f), + right = WidgetLocation.WIDGETS.element(x = 25f, y = 3f, w = 5f, h = 5f), + top = WidgetLocation.WIDGETS.element(x = 22f, y = 0f, w = 5f, h = 3f), + bottomLeft = WidgetLocation.WIDGETS.element(x = 18f, y = 6f, w = 6f, h = 6f), + bottomRight = WidgetLocation.WIDGETS.element(x = 24f, y = 6f, w = 6f, h = 6f), + bottom = WidgetLocation.WIDGETS.element(x = 21f, y = 9f, w = 5f, h = 3f), + middle = WidgetLocation.WIDGETS.element(x = 30f, y = 12f, w = 6f, h = 6f), + padding = DockProperty(-3f, -3f, -3f, -3f) + ) + + val tabRightConnection = WidgetLocation.WIDGETS.element(x = 30f, y = 0f, w = 3f, h = 5f) + val tabLeftConnection = WidgetLocation.WIDGETS.element(x = 33f, y = 0f, w = 3f, h = 5f) + val tabBackground = WidgetLocation.WIDGETS.element(x = 30f, y = 6f, w = 6f, h = 6f) } }