From e3a550778f1e615496fd90045935281f520bf218 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 7 Oct 2022 19:41:55 +0700 Subject: [PATCH] Split widgets to separate files --- .../otm/client/render/AbstractSkinElement.kt | 8 +++++ .../mc/otm/client/render/AtlasSkinElement.kt | 1 + .../mc/otm/client/render/SubSkinElement.kt | 12 ++++++++ .../mc/otm/client/render/WidgetLocation.kt | 12 ++++++-- .../mc/otm/client/render/Widgets.kt | 18 +++++------ .../client/render/blockentity/BankRenderer.kt | 7 +++-- .../mc/otm/client/screen/MatterPanelScreen.kt | 9 +++--- .../client/screen/panels/AbstractSlotPanel.kt | 2 +- .../client/screen/panels/BackgroundPanel.kt | 19 ++++++------ .../otm/client/screen/panels/ButtonPanel.kt | 8 ++--- .../mc/otm/client/screen/panels/CheckBox.kt | 18 ++--------- .../mc/otm/client/screen/panels/FramePanel.kt | 28 +++++++++--------- .../client/screen/panels/HeightControls.kt | 9 +++--- .../widget/HorizontalPowerGaugePanel.kt | 9 +++--- .../client/screen/widget/MatterGaugePanel.kt | 17 ++++++----- .../client/screen/widget/PatternGaugePanel.kt | 7 +++-- .../client/screen/widget/PowerGaugePanel.kt | 8 ++--- .../screen/widget/ProgressGaugePanel.kt | 7 +++-- .../textures/gui/widgets.png | Bin 2120 -> 0 bytes .../textures/gui/widgets.xcf | Bin 55647 -> 0 bytes .../textures/gui/widgets/checkbox.png | Bin 0 -> 224 bytes .../gui/widgets/horizontal_gauges.png | Bin 0 -> 277 bytes .../textures/gui/widgets/misc.png | Bin 0 -> 468 bytes .../gui/widgets/pattern_panel_tabs.png | Bin 0 -> 366 bytes .../textures/gui/widgets/progress_arrows.png | Bin 0 -> 275 bytes .../textures/gui/widgets/vertical_gauges.png | Bin 0 -> 494 bytes 26 files changed, 111 insertions(+), 88 deletions(-) delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.png delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/checkbox.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/horizontal_gauges.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/pattern_panel_tabs.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/progress_arrows.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/vertical_gauges.png diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AbstractSkinElement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AbstractSkinElement.kt index e6c95855b..cd7251996 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AbstractSkinElement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AbstractSkinElement.kt @@ -39,6 +39,14 @@ sealed class AbstractSkinElement { abstract val u1: Float abstract val v1: Float + fun partialU(offset: Float): Float { + return u0 + (offset / width) * (u1 - u0) + } + + fun partialV(offset: Float): Float { + return v0 + (offset / height) * (v1 - v0) + } + abstract val type: SkinElementType open val winding: UVWindingOrder get() = UVWindingOrder.NORMAL diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AtlasSkinElement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AtlasSkinElement.kt index 9db8193a9..ad0a1c839 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AtlasSkinElement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/AtlasSkinElement.kt @@ -20,6 +20,7 @@ class AtlasSkinElement( override val height: Float, val spriteWidth: Float = Mth.smallestEncompassingPowerOfTwo(width.toInt()).toFloat(), val spriteHeight: Float = Mth.smallestEncompassingPowerOfTwo(height.toInt()).toFloat(), + override val winding: UVWindingOrder = UVWindingOrder.NORMAL, ) : AbstractSkinElement() { init { synchronized(keys) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SubSkinElement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SubSkinElement.kt index 9087419dc..02304f554 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SubSkinElement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/SubSkinElement.kt @@ -8,6 +8,7 @@ class SubSkinElement( val yOffset: Float = 0f, val subWidth: Float = parent.width, val subHeight: Float = parent.height, + private val overrideWinding: UVWindingOrder? = null ) : AbstractSkinElement() { override val width: Float get() = subWidth @@ -29,6 +30,17 @@ class SubSkinElement( override val type: SkinElementType get() = SkinElementType.SUBELEMENT + + override val winding: UVWindingOrder + get() = overrideWinding ?: parent.winding + + fun copy( + xOffset: Float = this.xOffset, + yOffset: Float = this.yOffset, + subWidth: Float = this.subWidth, + subHeight: Float = this.subHeight, + overrideWinding: UVWindingOrder? = this.overrideWinding + ) = SubSkinElement(parent, xOffset, yOffset, subWidth, subHeight, overrideWinding) } fun AbstractSkinElement.subElement( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt index d75511b3f..abd4f14e0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt @@ -4,8 +4,14 @@ import net.minecraft.resources.ResourceLocation import ru.dbotthepony.mc.otm.OverdriveThatMatters object WidgetLocation { - val WIDGETS = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets.png") val WIDGETS_18 = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_18.png") val WIDGETS_8 = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_8.png") - val SCROLL = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/scroll.png") -} \ No newline at end of file + + val MISC = AtlasSkinElement(ResourceLocation(OverdriveThatMatters.MOD_ID, "widgets/misc"), 64f, 64f) + val PATTERN_PANEL_TABS = AtlasSkinElement(ResourceLocation(OverdriveThatMatters.MOD_ID, "widgets/pattern_panel_tabs"), 64f, 32f) + + val CHECKBOX = AtlasSkinElement(ResourceLocation(OverdriveThatMatters.MOD_ID, "widgets/checkbox"), 32f, 16f) + val PROGRESS_ARROWS = AtlasSkinElement(ResourceLocation(OverdriveThatMatters.MOD_ID, "widgets/progress_arrows"), 32f, 32f) + val HORIZONTAL_GAUGES = AtlasSkinElement(ResourceLocation(OverdriveThatMatters.MOD_ID, "widgets/horizontal_gauges"), 128f, 64f) + val VERTICAL_GAUGES = AtlasSkinElement(ResourceLocation(OverdriveThatMatters.MOD_ID, "widgets/vertical_gauges"), 128f, 48f) +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt index ab9cbb6be..0921111a3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt @@ -1,15 +1,15 @@ package ru.dbotthepony.mc.otm.client.render object Widgets { - val SLOT = WidgetLocation.WIDGETS.element(0f, 0f, 18f, 18f) + val SLOT = WidgetLocation.MISC.subElement(0f, 0f, 18f, 18f) - val ARROW_UP_BUTTON_IDLE = WidgetLocation.WIDGETS.element(0f, 18f, 18f, 6f) - val ARROW_UP_BUTTON_HOVERED = WidgetLocation.WIDGETS.element(0f, 18f + 6f, 18f, 6f) - val ARROW_UP_BUTTON_PRESSED = WidgetLocation.WIDGETS.element(0f, 18f + 6f * 2f, 18f, 6f) - val ARROW_UP_BUTTON_DISABLED = WidgetLocation.WIDGETS.element(0f, 18f + 6f * 3f, 18f, 6f) + val ARROW_UP_BUTTON_IDLE = WidgetLocation.MISC.subElement(0f, 18f, 18f, 6f) + val ARROW_UP_BUTTON_HOVERED = WidgetLocation.MISC.subElement(0f, 18f + 6f, 18f, 6f) + val ARROW_UP_BUTTON_PRESSED = WidgetLocation.MISC.subElement(0f, 18f + 6f * 2f, 18f, 6f) + val ARROW_UP_BUTTON_DISABLED = WidgetLocation.MISC.subElement(0f, 18f + 6f * 3f, 18f, 6f) - val ARROW_DOWN_BUTTON_IDLE = ARROW_UP_BUTTON_IDLE.copy(winding = UVWindingOrder.FLIP) - val ARROW_DOWN_BUTTON_HOVERED = ARROW_UP_BUTTON_HOVERED.copy(winding = UVWindingOrder.FLIP) - val ARROW_DOWN_BUTTON_PRESSED = ARROW_UP_BUTTON_PRESSED.copy(winding = UVWindingOrder.FLIP) - val ARROW_DOWN_BUTTON_DISABLED = ARROW_UP_BUTTON_DISABLED.copy(winding = UVWindingOrder.FLIP) + val ARROW_DOWN_BUTTON_IDLE = ARROW_UP_BUTTON_IDLE.copy(overrideWinding = UVWindingOrder.FLIP) + val ARROW_DOWN_BUTTON_HOVERED = ARROW_UP_BUTTON_HOVERED.copy(overrideWinding = UVWindingOrder.FLIP) + val ARROW_DOWN_BUTTON_PRESSED = ARROW_UP_BUTTON_PRESSED.copy(overrideWinding = UVWindingOrder.FLIP) + val ARROW_DOWN_BUTTON_DISABLED = ARROW_UP_BUTTON_DISABLED.copy(overrideWinding = UVWindingOrder.FLIP) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BankRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BankRenderer.kt index 9b05e19dc..bc7961c43 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BankRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BankRenderer.kt @@ -12,6 +12,7 @@ import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.BatteryBankBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.block.entity.matter.MatterCapacitorBankBlockEntity +import ru.dbotthepony.mc.otm.client.render.AbstractSkinElement import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.client.render.is3DContext import ru.dbotthepony.mc.otm.client.screen.widget.MatterGaugePanel @@ -21,7 +22,7 @@ import kotlin.math.PI abstract class BankRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer { protected abstract fun gaugeLevel(entity: T): Float - protected abstract val texture: SkinElement + protected abstract val texture: AbstractSkinElement override fun render( blockEntity: T, @@ -81,7 +82,7 @@ class BatteryBankRenderer(context: BlockEntityRendererProvider.Context) : BankRe return entity.gaugeLevel } - override val texture: SkinElement + override val texture: AbstractSkinElement get() = PowerGaugePanel.GAUGE_FOREGROUND } @@ -90,7 +91,7 @@ class MatterBatteryBankRenderer(context: BlockEntityRendererProvider.Context) : return entity.gaugeLevel } - override val texture: SkinElement + override val texture: AbstractSkinElement get() = MatterGaugePanel.GAUGE_FOREGROUND } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt index be34dde9d..71b5d1e11 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt @@ -9,6 +9,7 @@ import ru.dbotthepony.mc.otm.capability.matter.IPatternState import ru.dbotthepony.mc.otm.capability.matter.IReplicationTask import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.maxScrollDivision @@ -303,9 +304,9 @@ class MatterPanelScreen( const val GRID_HEIGHT = 8 const val GRID_WIDTH = 9 - val PATTERN_LIST_ACTIVE = WidgetLocation.WIDGETS.element(36f, 0f, 14f, 23f) - val TASK_LIST_ACTIVE = WidgetLocation.WIDGETS.element(64f, 0f, 16f, 16f) - val PATTERN_LIST_INACTIVE = WidgetLocation.WIDGETS.element(50f, 0f, 14f, 23f) - val TASK_LIST_INACTIVE = WidgetLocation.WIDGETS.element(80f, 0f, 16f, 16f) + val PATTERN_LIST_ACTIVE = WidgetLocation.PATTERN_PANEL_TABS.subElement(0f, 0f, 14f, 23f) + val TASK_LIST_ACTIVE = WidgetLocation.PATTERN_PANEL_TABS.subElement(28f, 0f, 16f, 16f) + val PATTERN_LIST_INACTIVE = WidgetLocation.PATTERN_PANEL_TABS.subElement(14f, 0f, 14f, 23f) + val TASK_LIST_INACTIVE = WidgetLocation.PATTERN_PANEL_TABS.subElement(44f, 0f, 16f, 16f) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt index 29281604b..d7bcb2480 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt @@ -112,6 +112,6 @@ abstract class AbstractSlotPanel> @JvmOverloads constru val SLOT_HIGHLIGHT = RGBAColor(255, 255, 255, 100) val SLOT_HIGHLIGHT_DRAG = RGBAColor(200, 200, 200, 150) const val SIZE = 18f - val SLOT_BACKGROUND = WidgetLocation.WIDGETS.element(0f, 0f, SIZE, SIZE) + val SLOT_BACKGROUND = WidgetLocation.MISC.subElement(0f, 0f, SIZE, SIZE) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/BackgroundPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/BackgroundPanel.kt index b48c3606a..34cbe3a26 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/BackgroundPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/BackgroundPanel.kt @@ -6,6 +6,7 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen import ru.dbotthepony.mc.otm.client.render.StretchingRectangleElement import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.screen.MatteryScreen open class BackgroundPanel( @@ -44,15 +45,15 @@ open class BackgroundPanel( ) = BackgroundPanel(screen, parent, x - 3f, y - 3f, width + 6f, height + 6f) val RECTANGLE = StretchingRectangleElement( - topLeft = WidgetLocation.WIDGETS.element(18f, 24f, 3f, 3f), - topRight = WidgetLocation.WIDGETS.element(27f, 24f, 3f, 3f), - bottomLeft = WidgetLocation.WIDGETS.element(18f, 33f, 3f, 3f), - bottomRight = WidgetLocation.WIDGETS.element(27f, 33f, 3f, 3f), - top = WidgetLocation.WIDGETS.element(21f, 24f, 6f, 2f), - bottom = WidgetLocation.WIDGETS.element(21f, 34f, 6f, 2f), - left = WidgetLocation.WIDGETS.element(18f, 27f, 2f, 6f), - right = WidgetLocation.WIDGETS.element(28f, 27f, 2f, 6f), - middle = WidgetLocation.WIDGETS.element(30f, 12f, 6f, 6f), + topLeft = WidgetLocation.MISC.subElement(18f, 24f, 3f, 3f), + topRight = WidgetLocation.MISC.subElement(27f, 24f, 3f, 3f), + bottomLeft = WidgetLocation.MISC.subElement(18f, 33f, 3f, 3f), + bottomRight = WidgetLocation.MISC.subElement(27f, 33f, 3f, 3f), + top = WidgetLocation.MISC.subElement(21f, 24f, 6f, 2f), + bottom = WidgetLocation.MISC.subElement(21f, 34f, 6f, 2f), + left = WidgetLocation.MISC.subElement(18f, 27f, 2f, 6f), + right = WidgetLocation.MISC.subElement(28f, 27f, 2f, 6f), + middle = WidgetLocation.MISC.subElement(30f, 12f, 6f, 6f), padding = DockProperty(-1f, -1f, -1f, -1f) ) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt index 3ec7bc0db..89c4b7e7c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt @@ -135,10 +135,10 @@ abstract class RectangleButtonPanel( onPress?.invoke(clickButton) } - abstract val PRESSED: SkinElement - abstract val HOVERED: SkinElement - abstract val IDLE: SkinElement - abstract val DISABLED: SkinElement + abstract val PRESSED: AbstractSkinElement + abstract val HOVERED: AbstractSkinElement + abstract val IDLE: AbstractSkinElement + abstract val DISABLED: AbstractSkinElement var isDisabled = false set(value) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt index 704205919..a50e2f453 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt @@ -7,6 +7,7 @@ import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.playGuiClickSound import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.client.render.WidgetLocation +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.screen.panels.CheckBoxPanel.Companion.REGULAR_DIMENSIONS import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget @@ -41,21 +42,8 @@ open class CheckBoxPanel @JvmOverloads constructor( companion object { const val REGULAR_DIMENSIONS = 15f - val CHECKBOX_UNCHECKED = SkinElement( - WidgetLocation.WIDGETS, - x = 59f, - y = 241f, - width = REGULAR_DIMENSIONS, - height = REGULAR_DIMENSIONS, - ) - - val CHECKBOX_CHECKED = SkinElement( - WidgetLocation.WIDGETS, - x = 44f, - y = 241f, - width = REGULAR_DIMENSIONS, - height = REGULAR_DIMENSIONS, - ) + val CHECKBOX_UNCHECKED = WidgetLocation.CHECKBOX.subElement(width = REGULAR_DIMENSIONS, height = REGULAR_DIMENSIONS) + val CHECKBOX_CHECKED = WidgetLocation.CHECKBOX.subElement(x = REGULAR_DIMENSIONS, width = REGULAR_DIMENSIONS, height = REGULAR_DIMENSIONS) } } 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 6b8581f9b..48ffe2e3e 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 @@ -25,8 +25,8 @@ open class FramePanel( open inner class Tab( var onOpen: Runnable? = null, var onClose: Runnable? = null, - var activeIcon: SkinElement? = null, - var inactiveIcon: SkinElement? = null, + var activeIcon: AbstractSkinElement? = null, + var inactiveIcon: AbstractSkinElement? = null, ) : EditablePanel(this@FramePanel.screen, this@FramePanel, 0f, 0f, 28f, 28f) { var isActive = tabs.isEmpty() var initial = false @@ -216,21 +216,21 @@ open class FramePanel( const val PADDING_TOP = 14f val RECTANGLE = StretchingRectangleElement( - topLeft = WidgetLocation.WIDGETS.element(x = 18f, y = 0f, width = 6f, height = 6f), - topRight = WidgetLocation.WIDGETS.element(x = 24f, y = 0f, width = 6f, height = 6f), - left = WidgetLocation.WIDGETS.element(x = 18f, y = 4f, width = 3f, height = 5f), - right = WidgetLocation.WIDGETS.element(x = 25f, y = 3f, width = 5f, height = 5f), - top = WidgetLocation.WIDGETS.element(x = 22f, y = 0f, width = 5f, height = 3f), - bottomLeft = WidgetLocation.WIDGETS.element(x = 18f, y = 6f, width = 6f, height = 6f), - bottomRight = WidgetLocation.WIDGETS.element(x = 24f, y = 6f, width = 6f, height = 6f), - bottom = WidgetLocation.WIDGETS.element(x = 21f, y = 9f, width = 5f, height = 3f), - middle = WidgetLocation.WIDGETS.element(x = 30f, y = 12f, width = 6f, height = 6f), + topLeft = WidgetLocation.MISC.subElement(x = 18f, y = 0f, width = 6f, height = 6f), + topRight = WidgetLocation.MISC.subElement(x = 24f, y = 0f, width = 6f, height = 6f), + left = WidgetLocation.MISC.subElement(x = 18f, y = 4f, width = 3f, height = 5f), + right = WidgetLocation.MISC.subElement(x = 25f, y = 3f, width = 5f, height = 5f), + top = WidgetLocation.MISC.subElement(x = 22f, y = 0f, width = 5f, height = 3f), + bottomLeft = WidgetLocation.MISC.subElement(x = 18f, y = 6f, width = 6f, height = 6f), + bottomRight = WidgetLocation.MISC.subElement(x = 24f, y = 6f, width = 6f, height = 6f), + bottom = WidgetLocation.MISC.subElement(x = 21f, y = 9f, width = 5f, height = 3f), + middle = WidgetLocation.MISC.subElement(x = 30f, y = 12f, width = 6f, height = 6f), padding = DockProperty(-3f, -3f, -3f, -3f) ) - val TAB_RIGHT_CONNECTION = WidgetLocation.WIDGETS.element(x = 30f, y = 0f, width = 3f, height = 5f) - val TAB_LEFT_CONNECTION = WidgetLocation.WIDGETS.element(x = 33f, y = 0f, width = 3f, height = 5f) - val TAB_BACKGROUND = WidgetLocation.WIDGETS.element(x = 30f, y = 6f, width = 6f, height = 6f) + val TAB_RIGHT_CONNECTION = WidgetLocation.MISC.subElement(x = 30f, y = 0f, width = 3f, height = 5f) + val TAB_LEFT_CONNECTION = WidgetLocation.MISC.subElement(x = 33f, y = 0f, width = 3f, height = 5f) + val TAB_BACKGROUND = WidgetLocation.MISC.subElement(x = 30f, y = 6f, width = 6f, height = 6f) const val TAB_HEIGHT = 28f const val TAB_WIDTH = 28f diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/HeightControls.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/HeightControls.kt index 23e4c781b..8b9ad55b3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/HeightControls.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/HeightControls.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.client.screen.panels import com.mojang.blaze3d.platform.InputConstants import net.minecraft.client.gui.screens.Screen +import ru.dbotthepony.mc.otm.client.render.AbstractSkinElement import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.client.render.Widgets @@ -44,10 +45,10 @@ open class HeightControls( } open inner class Control(val isIncrease: Boolean) : RectangleButtonPanel(screen, this@HeightControls, width = BUTTON_WIDTH, height = BUTTON_HEIGHT) { - override val PRESSED: SkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_PRESSED else Widgets.ARROW_UP_BUTTON_PRESSED - override val HOVERED: SkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_HOVERED else Widgets.ARROW_UP_BUTTON_HOVERED - override val IDLE: SkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_IDLE else Widgets.ARROW_UP_BUTTON_IDLE - override val DISABLED: SkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_DISABLED else Widgets.ARROW_UP_BUTTON_DISABLED + override val PRESSED: AbstractSkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_PRESSED else Widgets.ARROW_UP_BUTTON_PRESSED + override val HOVERED: AbstractSkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_HOVERED else Widgets.ARROW_UP_BUTTON_HOVERED + override val IDLE: AbstractSkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_IDLE else Widgets.ARROW_UP_BUTTON_IDLE + override val DISABLED: AbstractSkinElement = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_DISABLED else Widgets.ARROW_UP_BUTTON_DISABLED init { dock = Dock.TOP diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt index d904067ef..2d27ff716 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt @@ -5,6 +5,7 @@ import net.minecraft.client.gui.screens.Screen import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget @@ -44,11 +45,11 @@ open class HorizontalPowerGaugePanel( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 160f, y = 238f, width = 96f, height = 9f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 160f, y = 247f, width = 96f, height = 9f) + val GAUGE_BACKGROUND_TALL = WidgetLocation.HORIZONTAL_GAUGES.subElement(width = 96f, height = 18f) + val GAUGE_FOREGROUND_TALL = WidgetLocation.HORIZONTAL_GAUGES.subElement(y = 18f, width = 96f, height = 18f) - val GAUGE_BACKGROUND_TALL = WidgetLocation.WIDGETS.element(x = 160f, y = 202f, width = 96f, height = 18f) - val GAUGE_FOREGROUND_TALL = WidgetLocation.WIDGETS.element(x = 160f, y = 220f, width = 96f, height = 18f) + val GAUGE_BACKGROUND = WidgetLocation.HORIZONTAL_GAUGES.subElement(y = 36f, width = 96f, height = 9f) + val GAUGE_FOREGROUND = WidgetLocation.HORIZONTAL_GAUGES.subElement(y = 45f, width = 96f, height = 9f) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt index 076705614..51004036c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component import org.lwjgl.opengl.GL11 import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.render.tesselator import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.core.TranslatableComponent @@ -77,9 +78,9 @@ open class MatterGaugePanel @JvmOverloads constructor( RenderSystem.setShaderColor(1f, 1f, 1f, 1f) - val u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth - val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth - val v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.height) / GAUGE_FOREGROUND.imageHeight + val u0 = GAUGE_FOREGROUND.u0 + val u1 = GAUGE_FOREGROUND.u1 + val v1 = GAUGE_FOREGROUND.v1 val matrix = stack.last().pose() val builder = tesselator.builder @@ -97,8 +98,8 @@ open class MatterGaugePanel @JvmOverloads constructor( val thisY = (height + sin + cos).coerceAtLeast(0f) builder.vertex(matrix, thisX, thisY, 0f).uv( - (GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth, - (GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight, + GAUGE_FOREGROUND.partialU((i / 4f) * GAUGE_FOREGROUND.width), + GAUGE_FOREGROUND.partialV(thisY), ).endVertex() } @@ -116,7 +117,7 @@ open class MatterGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 184f, y = 0f, width = 9f, height = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 193f, y = 0f, width = 9f, height = 48f) + val GAUGE_BACKGROUND = WidgetLocation.VERTICAL_GAUGES.subElement(x = 18f, width = 9f) + val GAUGE_FOREGROUND = WidgetLocation.VERTICAL_GAUGES.subElement(x = 27f, width = 9f) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt index 9ababe6aa..3fe2eb7f6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt @@ -6,6 +6,7 @@ import net.minecraft.network.chat.Component import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget @@ -47,7 +48,7 @@ open class PatternGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 166f, y = 0f, width = 9f, height = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 175f, y = 0f, width = 9f, height = 48f) + val GAUGE_BACKGROUND = WidgetLocation.VERTICAL_GAUGES.subElement(width = 9f) + val GAUGE_FOREGROUND = WidgetLocation.VERTICAL_GAUGES.subElement(x = 9f, width = 9f) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt index 01dc48458..ec2bab3ab 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt @@ -61,11 +61,11 @@ open class PowerGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 202f, y = 0f, width = 9f, height = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 211f, y = 0f, width = 9f, height = 48f) + val GAUGE_BACKGROUND = WidgetLocation.VERTICAL_GAUGES.subElement(x = 36f, width = 9f) + val GAUGE_FOREGROUND = WidgetLocation.VERTICAL_GAUGES.subElement(x = 45f, width = 9f) - val GAUGE_BACKGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 238f, y = 0f, width = 18f, height = 48f) - val GAUGE_FOREGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 220f, y = 0f, width = 18f, height = 48f) + val GAUGE_BACKGROUND_WIDE = WidgetLocation.VERTICAL_GAUGES.subElement(x = 54f, width = 18f) + val GAUGE_FOREGROUND_WIDE = WidgetLocation.VERTICAL_GAUGES.subElement(x = 72f, width = 18f) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt index ffb87bd2c..ab6acc045 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt @@ -8,6 +8,7 @@ import net.minecraft.network.chat.Component import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.subElement import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget @@ -78,7 +79,7 @@ open class ProgressGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 240f, width = 22f, height = 16f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 22f, y = 240f, width = 22f, height = 16f) + val GAUGE_BACKGROUND = WidgetLocation.PROGRESS_ARROWS.subElement(y = 0f, width = 22f, height = 15f) + val GAUGE_FOREGROUND = WidgetLocation.PROGRESS_ARROWS.subElement(y = 16f, width = 22f, height = 15f) } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.png deleted file mode 100644 index 1574d5f01d8aaf17faa9b274208bf091886024a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2120 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 OEMWE_Eknn6r1O7W1?{8& diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/checkbox.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..e91224c79232dfadafcf4fa990bb1b67ca1d6d0d GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3-oF?)7E^DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(ehe`~f~8uIA?E-QC^)|Nqz1(*ufeI<7JWQmiFGe!)P&{|vvk@dbm#3p^r= z85sBugD~Uq{1qucK~GN?#}JL+t$mJM3pd$XL{6|e3e1ffxY@A)5kaFXDon*GI+ZB KxvX!HhS)Y1>VJ%0b`&XG7pU#bsiXi~S?39p?W0tTjI-m>nX=aD!pPjveM7`#r=N z7}Ocue!lY4ReL^f)3*jIJ2wV~9EJ!PkitK*5B@P$D-^w|OnU@2*3;F`Wt~$(69B)s BTcH2| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc.png new file mode 100644 index 0000000000000000000000000000000000000000..8923a02d7129ba396ac5c898077776eab444eda6 GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1k1^9%xnwy(ArbCxr{0`)Sb@V~?WCC>{@dFq zco=coYQ@gmqpzwMb3JR^O4BA8GqCzEY~pSR2~u?SxbQ0RbfM$fz*5beRsQ}T zSSKYjUf-{DL+jIv%YrAgE5H0)vcQFPhWV3#P1J zfz#(dQ`*wgTK!SEg>~12k8%zZznHV+?&DKq-Ib(%uE|dGe_RI_g9!&$#Rs9i=^Pe{ zI~?C`uQhRawD14%f8I5QC7ug@AGdhNx=&))3Z z*I9qJu3*sV;N0E+y<6SH*yC2|e~G|@d5vjonN06? zyUmh(!t1BpaL!Pzh-~=5K4C$b(Jj+$mw+M3;OXk;vd$@?2>@7J ByZrzF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/pattern_panel_tabs.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/pattern_panel_tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..6988d0fc445d382e3172c8cdeb23b7e0a404031a GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`IRkt`T)VrwLqkJ>yv+_}JAo8)NswRg|NjivPw@iPGH@1nL>4nJ@ErzW z#^d=bQh`pRkqF%_VV) zTNNudTmLAKDC}T#PieI{%~Qzcu&hf*G=EpsWl@GmB@^Y@&(7xMGoDa8($V(jh2e!* zH=Y;2C4Sin8S!##XV|32a8u)AOlle9rs-}sI2zm-O4w(7U*24`U)tfPbj`APM;4SX zHrc|mKJ(+G!V`i{@r;pkcHBLld2V4&DbLQ(1#9>%i(`GuWEs|k{P)WXnzPZfFpjC` zf`HcR`3z#WSS!}~n(wfid~2&23)>bevyYCXXw)$ruWZ$7KmpZ5P9{l&#zJbd=InQ@x)b7p33orH&sT}mfh zMVBmE%jx0wDna|zg41kk)z3_yey3JcC7$JGHA6n5E%Rrd6B6pXS99Lvcp>HqbPI#0 LtDnm{r-UW|n*3hn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/vertical_gauges.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/vertical_gauges.png new file mode 100644 index 0000000000000000000000000000000000000000..8f94dd84e0dc350cc057960fe8194c5a494890e0 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3-pya`gKGDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheiUB?$uIA?E-QC@WhK39sV&=ytJbwX{U^sA)!Tta4lvEJA>3-pQAjMr0 z0UnUG3&{uuS9% zNN`nmcw*ykxtz&v?nH(qOd=5pW~{s{{;`)PUy1S5!~6% ztSjWA<e$1w9L$8&nUJDx7Dolq;y<%lQ7rG@;z(|GNX9g*I6l>|T*`msd{&eLb;1H+Vo N!PC{xWt~$(696^Nz3c!0 literal 0 HcmV?d00001