StretchingRectangleElement

This commit is contained in:
DBotThePony 2022-08-31 12:46:33 +07:00
parent c28c66b56b
commit 65c36e44fa
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 84 additions and 49 deletions

View File

@ -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)
}
}

View File

@ -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

View File

@ -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)
}
}