hud: don't rely on atlas

This commit is contained in:
Moritz Zwerger 2023-09-27 23:14:47 +02:00
parent 89343bec0f
commit 73b9d4c541
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
14 changed files with 30 additions and 29 deletions

View File

@ -30,7 +30,7 @@ object RenderUtil {
}
}
fun RenderContext.runAsync(runnable: () -> Unit) {
inline fun RenderContext.runAsync(crossinline runnable: () -> Unit) {
DefaultThreadPool += SimplePoolRunnable(ThreadPool.HIGHER) {
try {
runnable()

View File

@ -64,7 +64,6 @@ class GUIRenderer(
gui.init()
hud.init()
popper.init()
dragged.init()
}
override fun postInit(latch: AbstractLatch) {
@ -77,7 +76,6 @@ class GUIRenderer(
gui.postInit()
hud.postInit()
popper.postInit()
dragged.postInit()
}
private fun updateResolution(windowSize: Vec2 = Vec2(context.window.size), scale: Float = profile.scale, systemScale: Vec2 = context.window.systemScale) {

View File

@ -33,6 +33,7 @@ class AtlasManager(val context: RenderContext) {
}
operator fun get(atlas: ResourceLocation): Atlas? {
if (loader != null) throw IllegalStateException("Atlas is still in loading phase!")
return this.atlas[atlas]
}
}

View File

@ -26,11 +26,10 @@ import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.gui.rendering.system.window.CursorModes
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.Initializable
class DraggedManager(
private val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, AsyncDrawable, Drawable {
) : InputHandler, AsyncDrawable, Drawable {
private val clickCounter = MouseClickCounter()
var element: DraggedGUIElement<*>? = null
set(value) {
@ -52,12 +51,6 @@ class DraggedManager(
}
private var lastTickTime: Long = -1L
override fun init() {
}
override fun postInit() {
}
fun onScreenChange() {
element?.element?.forceSilentApply()
}

View File

@ -54,7 +54,7 @@ class HUDManager(
private var values: Collection<HUDElement> = emptyList()
fun registerElement(hudBuilder: HUDBuilder<*>) {
fun register(hudBuilder: HUDBuilder<*>) {
val hudElement = hudBuilder.build(guiRenderer)
hudElements[hudBuilder.identifier] = hudElement
@ -64,13 +64,18 @@ class HUDManager(
context.input.bindings.register(toggleKeyBindingName, toggleKeyBinding, pressed = hudBuilder.DEFAULT_ENABLED) { hudElement.enabled = it }
}
private fun registerDefaultElements() {
val latch = SimpleLatch(DEFAULT_ELEMENTS.size + 1)
private fun registerDefaults() {
for (builder in DEFAULT_ELEMENTS) {
builder.register(guiRenderer)
}
}
private fun buildDefaults() {
val latch = SimpleLatch(DEFAULT_ELEMENTS.size)
for (builder in DEFAULT_ELEMENTS) {
context.runAsync { registerElement(builder); latch.dec() }
context.runAsync { register(builder); latch.dec() }
}
latch.dec()
latch.await()
}
@ -86,7 +91,7 @@ class HUDManager(
}
override fun init() {
registerDefaultElements()
registerDefaults()
for (element in this.hudElements.toSynchronizedMap().values) {
element.init()
@ -100,6 +105,8 @@ class HUDManager(
}
override fun postInit() {
buildDefaults()
for (element in this.hudElements.toSynchronizedMap().values) {
element.postInit()
if (element is LayoutedGUIElement<*>) {

View File

@ -81,7 +81,7 @@ class ChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRenderer),
}
override fun init() {
override fun postInit() {
connection.events.listen<ChatMessageEvent> {
if (it.message.type.position == ChatTextPositions.HOTBAR) {
return@listen
@ -108,7 +108,7 @@ class ChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRenderer),
this.input.value = "/"
}
internal.init()
internal.postInit()
}
override fun forceRender(offset: Vec2, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {

View File

@ -47,7 +47,7 @@ class InternalChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRen
}
override fun init() {
override fun postInit() {
connection.events.listen<ChatMessageEvent> {
if (it.message !is InternalChatMessage || profile.chat.internal.hidden) {
return@listen

View File

@ -31,7 +31,7 @@ class HotbarBaseElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Pollab
private val atlas = guiRenderer.atlas[ATLAS]
private val baseAtlasElement = atlas["base"]
private val base = AtlasImageElement(guiRenderer, baseAtlasElement)
private val frame = AtlasImageElement(guiRenderer, atlas["frame"]!!, size = Vec2i(FRAME_SIZE))
private val frame = AtlasImageElement(guiRenderer, atlas["frame"], size = Vec2i(FRAME_SIZE))
private val containerElement = ContainerItemsElement(guiRenderer, guiRenderer.context.connection.player.items.inventory, baseAtlasElement?.slots ?: Int2ObjectOpenHashMap())

View File

@ -14,6 +14,7 @@
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar
import de.bixilon.kotlinglm.vec2.Vec2
import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.minosoft.data.entities.entities.player.Arms
import de.bixilon.minosoft.data.entities.entities.player.Arms.Companion.opposite
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
@ -23,6 +24,7 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.items.ContainerItemsElemen
import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.AtlasImageElement
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
import de.bixilon.minosoft.gui.rendering.util.vec.vec4.Vec4Util.marginOf
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
@ -34,13 +36,13 @@ class HotbarOffhandElement(guiRenderer: GUIRenderer) : Element(guiRenderer) {
)
val offArm = guiRenderer.context.connection.player.mainArm.opposite // ToDo: Support arm change
private val frame = frames[offArm.ordinal]!!
private val frame = frames[offArm.ordinal]
private var frameImage = AtlasImageElement(guiRenderer, frame)
private val containerElement = ContainerItemsElement(guiRenderer, guiRenderer.context.connection.player.items.inventory, frame.slots ?: Int2ObjectOpenHashMap())
private val containerElement = ContainerItemsElement(guiRenderer, guiRenderer.context.connection.player.items.inventory, frame?.slots ?: Int2ObjectOpenHashMap())
init {
_size = Vec2(frame.size)
_size = Vec2(frame?.size ?: Vec2i.EMPTY)
val margin = if (offArm == Arms.LEFT) {
marginOf(right = 5.0f)
} else {

View File

@ -39,7 +39,7 @@ class CrosshairHUDElement(guiRenderer: GUIRenderer) : CustomHUDElement(guiRender
private var reapply = true
private var previousNeedsDraw = needsDraw
override fun init() {
override fun postInit() {
crosshairAtlasElement = guiRenderer.atlas[ATLAS]?.get("crosshair")
crosshairProfile::color.observe(this) { reapply = true }
}

View File

@ -82,7 +82,7 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted
}
override fun init() {
override fun postInit() {
layout[Vec2i(0, 0)] = initLeft()
layout[Vec2i(2, 0)] = initRight()

View File

@ -161,7 +161,7 @@ class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), La
queueSizeRecalculation()
}
override fun init() {
override fun postInit() {
val connection = context.connection
connection.events.listen<ObjectivePositionSetEvent> {
if (it.position != ScoreboardPositions.SIDEBAR) {

View File

@ -216,7 +216,7 @@ class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedE
}
override fun init() {
override fun postInit() {
val connection = context.connection
connection.tabList::header.observe(this) { header.text = it }
connection.tabList::footer.observe(this) { footer.text = it }

View File

@ -106,7 +106,7 @@ class TitleElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedEle
times = DEFAULT_TIMES
}
override fun init() {
override fun postInit() {
val connection = context.connection
connection.events.listen<TitleResetEvent> {