implement atlases, fixes

This commit is contained in:
Moritz Zwerger 2023-10-07 23:34:18 +02:00
parent 6b3d29ed88
commit a5770dc789
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
9 changed files with 58 additions and 29 deletions

View File

@ -1,6 +1,6 @@
/*
* Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
@ -56,9 +56,11 @@ open class ProgressElement(
}
override fun forceSilentApply() {
val emptyAtlasElement = emptyAtlasElement ?: return
val fullAtlasElement = fullAtlasElement ?: return
progressImage = ImageElement(guiRenderer, fullAtlasElement.texture, uvStart = fullAtlasElement.uvStart, uvEnd = Vec2(interpolateLinear(progress, fullAtlasElement.uvStart.x, fullAtlasElement.uvEnd.x), fullAtlasElement.uvEnd.y), size = Vec2((fullAtlasElement.size.x * progress), emptyAtlasElement.size.y))
val full = fullAtlasElement ?: return
val uvEnd = Vec2(interpolateLinear(progress, full.uvStart.x, full.uvEnd.x), full.uvEnd.y)
val size = this.size
progressImage = ImageElement(guiRenderer, full.texture, uvStart = full.uvStart, uvEnd = uvEnd, size = Vec2((size.x * progress), size.y))
cacheUpToDate = false
}

View File

@ -208,6 +208,7 @@ class HotbarElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedEl
gui.atlas.load(HotbarBaseElement.ATLAS)
gui.atlas.load(HotbarProtectionElement.ATLAS)
gui.atlas.load(HotbarHungerElement.ATLAS)
gui.atlas.load(HotbarExperienceBarElement.ATLAS)
}
override fun build(guiRenderer: GUIRenderer): LayoutedGUIElement<HotbarElement> {

View File

@ -61,6 +61,7 @@ class HotbarExperienceBarElement(guiRenderer: GUIRenderer) : Element(guiRenderer
val bars = atlasElements[barIndex]
val progress = ProgressElement(guiRenderer, bars, progress)
progress.prefMaxSize = SIZE
progress.render(offset, consumer, options)
if (level > 0) {
@ -91,7 +92,7 @@ class HotbarExperienceBarElement(guiRenderer: GUIRenderer) : Element(guiRenderer
}
companion object {
private val ATLAS = minecraft("hud/hotbar/experience")
val ATLAS = minecraft("hud/hotbar/experience")
private val TEXT_PROPERTIES = TextRenderProperties(HorizontalAlignments.CENTER, shadow = false)
private val SIZE = Vec2(182, 5)
}

View File

@ -68,7 +68,7 @@ class HotbarHungerElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Poll
if (hungerProfile.saturationBar) {
val container = when {
hungerEffect -> atlas.hungerContainer
hungerEffect -> atlas.getContainer(true)
saturationLeft == 1 -> {
saturationLeft -= 1
atlas.getSaturationContainer(true)
@ -79,7 +79,7 @@ class HotbarHungerElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Poll
atlas.getSaturationContainer(false)
}
else -> atlas.container
else -> atlas.getContainer(false)
}
AtlasImageElement(guiRenderer, container).render(hungerOffset, consumer, options)
}
@ -134,11 +134,13 @@ class HotbarHungerElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Poll
}
private class HungerAtlas(val atlas: Atlas?) {
val container = atlas["container"]
val hungerContainer = atlas["container_hunger"]
private val container = arrayOf(atlas["container"], atlas["container_hunger"])
private val saturation = arrayOf(atlas["container_saturation_half"], atlas["container_saturation_full"])
private val hunger = arrayOf(arrayOf(atlas["full"], atlas["half"]), arrayOf(atlas["full_hunger"], atlas["half_hunger"]))
fun getHunger(half: Boolean, hunger: Boolean): AtlasElement = TODO()
fun getSaturationContainer(half: Boolean): AtlasElement = TODO()
fun getHunger(half: Boolean, hunger: Boolean): AtlasElement? = this.hunger[if (hunger) 1 else 0][if (half) 1 else 0]
fun getContainer(hunger: Boolean): AtlasElement? = container[if (hunger) 1 else 0]
fun getSaturationContainer(half: Boolean): AtlasElement? = saturation[if (half) 0 else 1]
}
companion object {

View File

@ -13,20 +13,41 @@
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.health
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas
import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas.Companion.get
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement
class HeartAtlas(val atlas: Atlas?) {
val normal = HartType()
val poisoned = HartType()
val withered = HartType()
val absorption = HartType()
val frozen = HartType()
class HeartAtlas(private val atlas: Atlas?) {
val normal = HartType("")
val poisoned = HartType("poisoned")
val withered = HartType("withered")
val absorption = HartType("absorption")
val frozen = HartType("frozen")
class HartType {
fun get(full: Boolean, hardcore: Boolean, blinking: Boolean): AtlasElement = TODO()
val container = atlas["container"] // TODO: There are multiple containers
inner class HartType(type: String) {
val hearts = Array(2) { full ->
Array(2) { hardcore ->
Array(2) { blinking ->
val name = StringBuilder()
if (type.isNotEmpty()) {
name.append(type)
name.append('_')
}
name.append(if (full > 0) "full" else "half")
if (hardcore > 0) name.append("_hardcore")
if (blinking > 0) name.append("_blinking")
atlas?.get(name.toString())
}
}
} // frozen_full_hardcore_blinking
fun get(full: Boolean, hardcore: Boolean, blinking: Boolean): AtlasElement? = this.hearts[full.toInt()][hardcore.toInt()][blinking.toInt()]
}

View File

@ -24,7 +24,6 @@ import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.asColor
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas.Companion.get
import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable
import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.AtlasImageElement
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.AbstractHotbarHealthElement
@ -36,7 +35,6 @@ import java.lang.Float.min
class HotbarHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealthElement(guiRenderer), Pollable {
private val atlas = HeartAtlas(guiRenderer.atlas[HeartAtlas.ATLAS])
private val blackHeartContainer = atlas.atlas["container"] // TODO: There are multiple containers
private var hardcode = false
private var poison = false
@ -55,7 +53,7 @@ class HotbarHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealthElemen
return super.forceRender(offset, consumer, options)
}
// ToDo: Damage animation, regeneration, caching, stacking
drawCanisters(offset, consumer, options, blackHeartContainer)
drawCanisters(offset, consumer, options, atlas.container)
var healthLeft = totalHealth

View File

@ -32,7 +32,7 @@ import java.lang.Float.max
class HotbarVehicleHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealthElement(guiRenderer), Pollable {
private val atlasManager = guiRenderer.atlas
private val atlas = VehicleHeartAtlas(guiRenderer.atlas[HeartAtlas.ATLAS])
private val atlas = guiRenderer.atlas[HeartAtlas.ATLAS]?.let { VehicleHeartAtlas(it) }
private var shown = false
override var totalHealth = 0.0f
@ -45,7 +45,7 @@ class HotbarVehicleHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealt
if (text) {
return super.forceRender(offset, consumer, options)
}
drawCanisters(offset, consumer, options, atlas.getContainer(false))
drawCanisters(offset, consumer, options, atlas?.getContainer(false))
var healthLeft = totalHealth
var heart = 0
@ -56,7 +56,7 @@ class HotbarVehicleHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealt
val halfHeart = healthLeft < 1.5f
val image = atlas.getHeart(halfHeart)?.let { AtlasImageElement(guiRenderer, it) }
val image = atlas?.getHeart(halfHeart)?.let { AtlasImageElement(guiRenderer, it) }
image?.render(offset + Vec2(column, (rows - 1) - row) * HEART_SIZE, consumer, options)

View File

@ -16,9 +16,12 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.health
import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement
class VehicleHeartAtlas(val atlas: Atlas?) {
class VehicleHeartAtlas(atlas: Atlas) {
private val half = atlas["half_vehicle"]
private val full = atlas["full_vehicle"]
private val container = atlas["container_vehicle"]
fun getContainer(half: Boolean): AtlasElement = TODO()
fun getContainer(half: Boolean): AtlasElement? = container
fun getHeart(half: Boolean): AtlasElement = TODO()
fun getHeart(half: Boolean): AtlasElement? = if (half) this.half else this.full
}

View File

@ -2,7 +2,8 @@
"empty": {
"0": {
"texture": "gui/icons",
"start": [0, 64]
"start": [0, 64],
"end": [182, 69]
},
"18": {
"texture": "gui/sprites/hud/experience_bar_background",