mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 20:05:02 -04:00
wip hud cache
This commit is contained in:
parent
a17106db8d
commit
efa9adfc97
@ -31,7 +31,9 @@ abstract class Element(val hudRenderer: HUDRenderer) {
|
|||||||
field = value
|
field = value
|
||||||
onParentChange()
|
onParentChange()
|
||||||
}
|
}
|
||||||
protected var cache = GUIMeshCache(hudRenderer.matrix)
|
protected var cache = GUIMeshCache(hudRenderer.matrix, 0)
|
||||||
|
open var cacheEnabled: Boolean = true
|
||||||
|
open var initialCacheSize: Int = 100
|
||||||
open var cacheUpToDate: Boolean = false
|
open var cacheUpToDate: Boolean = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,11 +88,33 @@ abstract class Element(val hudRenderer: HUDRenderer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the element to a vertex consumer
|
* Renders the element (eventually from a cache) to a vertex consumer
|
||||||
*
|
*
|
||||||
* @return The number of z layers used
|
* @return The number of z layers used
|
||||||
*/
|
*/
|
||||||
abstract fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int
|
fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
|
if (!cacheEnabled) {
|
||||||
|
return forceRender(offset, z, consumer)
|
||||||
|
}
|
||||||
|
if (!cacheUpToDate || cache.offset != offset || hudRenderer.matrixChange || cache.matrix != hudRenderer.matrix || z != cache.z) {
|
||||||
|
val cache = GUIMeshCache(hudRenderer.matrix)
|
||||||
|
cache.offset = offset
|
||||||
|
cache.z = z
|
||||||
|
val maxZ = forceRender(offset, z, cache)
|
||||||
|
cache.maxZ = maxZ
|
||||||
|
cacheUpToDate = true
|
||||||
|
}
|
||||||
|
|
||||||
|
consumer.addCache(cache)
|
||||||
|
return cache.maxZ
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Force renders the element to the cache/vertex consumer
|
||||||
|
*
|
||||||
|
* @return The number of z layers used
|
||||||
|
*/
|
||||||
|
abstract fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applied all changes made to any property, but does not notify the parent about the change
|
* Applied all changes made to any property, but does not notify the parent about the change
|
||||||
|
@ -31,7 +31,7 @@ class InfiniteSizeElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
get() = Vec2i.MAX
|
get() = Vec2i.MAX
|
||||||
set(value) {}
|
set(value) {}
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
error("Can not render InfiniteSizeElement")
|
error("Can not render InfiniteSizeElement")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,6 +42,8 @@ open class RowLayout(
|
|||||||
private var _prefSize = Vec2i.EMPTY
|
private var _prefSize = Vec2i.EMPTY
|
||||||
private val children: MutableList<Element> = synchronizedListOf()
|
private val children: MutableList<Element> = synchronizedListOf()
|
||||||
|
|
||||||
|
override var cacheEnabled: Boolean = false // ToDo: Cache
|
||||||
|
|
||||||
override var prefSize: Vec2i
|
override var prefSize: Vec2i
|
||||||
get() = _prefSize
|
get() = _prefSize
|
||||||
set(value) {}
|
set(value) {}
|
||||||
@ -56,7 +58,7 @@ open class RowLayout(
|
|||||||
children.clear()
|
children.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
var childYOffset = 0
|
var childYOffset = 0
|
||||||
var maxZ = 0
|
var maxZ = 0
|
||||||
|
|
||||||
|
@ -26,8 +26,9 @@ import glm_.vec2.Vec2i
|
|||||||
|
|
||||||
class ZLayout(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
class ZLayout(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
||||||
private val children: MutableList<Element> = synchronizedListOf()
|
private val children: MutableList<Element> = synchronizedListOf()
|
||||||
|
override var cacheEnabled: Boolean = false // ToDo: Cache
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
var zOffset = 0
|
var zOffset = 0
|
||||||
for (child in children.toSynchronizedList()) {
|
for (child in children.toSynchronizedList()) {
|
||||||
zOffset += child.render(margin.offset + offset, z + zOffset, consumer)
|
zOffset += child.render(margin.offset + offset, z + zOffset, consumer)
|
||||||
|
@ -27,6 +27,9 @@ class GridCell(
|
|||||||
override var parent: Element?,
|
override var parent: Element?,
|
||||||
) : Element(hudRenderer) {
|
) : Element(hudRenderer) {
|
||||||
override var cacheUpToDate: Boolean by child::cacheUpToDate
|
override var cacheUpToDate: Boolean by child::cacheUpToDate
|
||||||
|
override var cacheEnabled: Boolean by child::cacheEnabled
|
||||||
|
override var initialCacheSize: Int by child::initialCacheSize
|
||||||
|
override var prefMaxSize: Vec2i by child::prefMaxSize
|
||||||
override var size: Vec2i by child::size
|
override var size: Vec2i by child::size
|
||||||
override var margin: Vec4i by child::margin
|
override var margin: Vec4i by child::margin
|
||||||
override var prefSize: Vec2i by child::prefSize
|
override var prefSize: Vec2i by child::prefSize
|
||||||
@ -49,7 +52,7 @@ class GridCell(
|
|||||||
child.parent = this
|
child.parent = this
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
return child.render(offset, z, consumer)
|
return child.render(offset, z, consumer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@ class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Element(hudRendere
|
|||||||
private var columnStart = IntArray(grid.x)
|
private var columnStart = IntArray(grid.x)
|
||||||
private var rowStart = IntArray(grid.y)
|
private var rowStart = IntArray(grid.y)
|
||||||
|
|
||||||
|
override var cacheEnabled: Boolean = false // ToDo: Cache
|
||||||
|
|
||||||
operator fun set(position: Vec2i, element: Element) = add(position, element)
|
operator fun set(position: Vec2i, element: Element) = add(position, element)
|
||||||
|
|
||||||
fun add(position: Vec2i, element: Element) {
|
fun add(position: Vec2i, element: Element) {
|
||||||
@ -123,7 +125,7 @@ class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Element(hudRendere
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
var maxZ = 0
|
var maxZ = 0
|
||||||
for (x in 0 until grid.x) {
|
for (x in 0 until grid.x) {
|
||||||
for (y in 0 until grid.y) {
|
for (y in 0 until grid.y) {
|
||||||
|
@ -19,11 +19,9 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
|||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.TextureLike
|
import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.TextureLike
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMeshCache
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY
|
||||||
import glm_.mat4x4.Mat4
|
|
||||||
import glm_.vec2.Vec2
|
import glm_.vec2.Vec2
|
||||||
import glm_.vec2.Vec2i
|
import glm_.vec2.Vec2i
|
||||||
|
|
||||||
@ -35,6 +33,7 @@ open class ImageElement(
|
|||||||
size: Vec2i = texture.size,
|
size: Vec2i = texture.size,
|
||||||
tint: RGBColor = ChatColors.WHITE,
|
tint: RGBColor = ChatColors.WHITE,
|
||||||
) : Element(hudRenderer) {
|
) : Element(hudRenderer) {
|
||||||
|
override var initialCacheSize: Int = GUIMesh.GUIMeshStruct.FLOATS_PER_VERTEX * 6
|
||||||
var texture: AbstractTexture = texture
|
var texture: AbstractTexture = texture
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
@ -70,10 +69,6 @@ open class ImageElement(
|
|||||||
cacheUpToDate = false
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
|
|
||||||
private var matrix: Mat4 = hudRenderer.matrix
|
|
||||||
private var lastOffset: Vec2i = Vec2i(-1, -1)
|
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
this.size = size
|
this.size = size
|
||||||
}
|
}
|
||||||
@ -82,20 +77,8 @@ open class ImageElement(
|
|||||||
|
|
||||||
constructor(hudRenderer: HUDRenderer, texture: AbstractTexture, uvStart: Vec2i, uvEnd: Vec2i, size: Vec2i = texture.size, tint: RGBColor = ChatColors.WHITE) : this(hudRenderer, texture, Vec2(uvStart) * texture.singlePixelSize, Vec2(uvEnd) * texture.singlePixelSize, size, tint)
|
constructor(hudRenderer: HUDRenderer, texture: AbstractTexture, uvStart: Vec2i, uvEnd: Vec2i, size: Vec2i = texture.size, tint: RGBColor = ChatColors.WHITE) : this(hudRenderer, texture, Vec2(uvStart) * texture.singlePixelSize, Vec2(uvEnd) * texture.singlePixelSize, size, tint)
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
val matrix = hudRenderer.matrix
|
consumer.addQuad(offset, offset + size, z, texture, uvStart, uvEnd, tint)
|
||||||
if (offset == lastOffset && matrix == this.matrix && cacheUpToDate) {
|
|
||||||
consumer.addCache(cache)
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
val cache = GUIMeshCache(matrix, GUIMesh.GUIMeshStruct.FLOATS_PER_VERTEX * 6)
|
|
||||||
cache.addQuad(offset, offset + size, z, texture, uvStart, uvEnd, tint)
|
|
||||||
|
|
||||||
this.lastOffset = offset
|
|
||||||
this.matrix = matrix
|
|
||||||
this.cache = cache
|
|
||||||
this.cacheUpToDate = true
|
|
||||||
consumer.addCache(cache)
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import glm_.vec2.Vec2i
|
|||||||
|
|
||||||
open class SpacerElement(hudRenderer: HUDRenderer, override var size: Vec2i) : Element(hudRenderer) {
|
open class SpacerElement(hudRenderer: HUDRenderer, override var size: Vec2i) : Element(hudRenderer) {
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int = 0
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int = 0
|
||||||
|
|
||||||
override fun silentApply() = Unit
|
override fun silentApply() = Unit
|
||||||
override fun apply() = Unit
|
override fun apply() = Unit
|
||||||
|
@ -24,7 +24,6 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.ElementAlignments
|
|||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.ElementAlignments.Companion.getOffset
|
import de.bixilon.minosoft.gui.rendering.gui.elements.ElementAlignments.Companion.getOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.InfiniteSizeElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.InfiniteSizeElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMeshCache
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.offset
|
import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.offset
|
||||||
@ -38,9 +37,6 @@ open class TextElement(
|
|||||||
var backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR,
|
var backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR,
|
||||||
parent: Element? = null,
|
parent: Element? = null,
|
||||||
) : LabeledElement(hudRenderer) {
|
) : LabeledElement(hudRenderer) {
|
||||||
private var previousOffset = Vec2i.EMPTY
|
|
||||||
private var previousMatrix = hudRenderer.matrix
|
|
||||||
|
|
||||||
private var previousMaxSize = Vec2i.EMPTY
|
private var previousMaxSize = Vec2i.EMPTY
|
||||||
private var preparedSize = Vec2i.EMPTY
|
private var preparedSize = Vec2i.EMPTY
|
||||||
var renderInfo = TextRenderInfo()
|
var renderInfo = TextRenderInfo()
|
||||||
@ -109,18 +105,10 @@ open class TextElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
if (emptyMessage) {
|
if (emptyMessage) {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
if (previousOffset != offset || previousMatrix != hudRenderer.matrix) {
|
|
||||||
cacheUpToDate = false
|
|
||||||
}
|
|
||||||
if (cacheUpToDate) {
|
|
||||||
consumer.addCache(cache)
|
|
||||||
return LAYERS
|
|
||||||
}
|
|
||||||
val cache = GUIMeshCache(hudRenderer.matrix)
|
|
||||||
val initialOffset = offset + margin.offset
|
val initialOffset = offset + margin.offset
|
||||||
|
|
||||||
ChatComponentRenderer.render(initialOffset, Vec2i(initialOffset), Vec2i.EMPTY, z + 1, this, fontAlignment, renderWindow, cache, renderInfo, textComponent)
|
ChatComponentRenderer.render(initialOffset, Vec2i(initialOffset), Vec2i.EMPTY, z + 1, this, fontAlignment, renderWindow, cache, renderInfo, textComponent)
|
||||||
@ -133,12 +121,6 @@ open class TextElement(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
consumer.addCache(cache)
|
|
||||||
this.cache = cache
|
|
||||||
this.previousOffset = offset
|
|
||||||
this.previousMatrix = hudRenderer.matrix
|
|
||||||
this.cacheUpToDate = true
|
|
||||||
|
|
||||||
return LAYERS
|
return LAYERS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,9 +43,10 @@ class TextFlowElement(
|
|||||||
get() = maxSize
|
get() = maxSize
|
||||||
set(value) {}
|
set(value) {}
|
||||||
|
|
||||||
|
override var cacheEnabled: Boolean = false // ToDo: Cache
|
||||||
private var textSize = Vec2i.EMPTY
|
private var textSize = Vec2i.EMPTY
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
val visibleLines = visibleLines
|
val visibleLines = visibleLines
|
||||||
if (visibleLines.isEmpty()) {
|
if (visibleLines.isEmpty()) {
|
||||||
return 0
|
return 0
|
||||||
|
@ -49,6 +49,8 @@ class HUDRenderer(
|
|||||||
var scaledSize: Vec2i = renderWindow.window.size
|
var scaledSize: Vec2i = renderWindow.window.size
|
||||||
var matrix: Mat4 = Mat4()
|
var matrix: Mat4 = Mat4()
|
||||||
private var enabled = true
|
private var enabled = true
|
||||||
|
var matrixChange = true
|
||||||
|
private set
|
||||||
|
|
||||||
private val hudElements: MutableMap<ResourceLocation, HUDElement<*>> = synchronizedMapOf()
|
private val hudElements: MutableMap<ResourceLocation, HUDElement<*>> = synchronizedMapOf()
|
||||||
|
|
||||||
@ -88,6 +90,7 @@ class HUDRenderer(
|
|||||||
connection.registerEvent(CallbackEventInvoker.of<ResizeWindowEvent> {
|
connection.registerEvent(CallbackEventInvoker.of<ResizeWindowEvent> {
|
||||||
scaledSize = Vec2i(Vec2(it.size) / Minosoft.config.config.game.hud.scale)
|
scaledSize = Vec2i(Vec2(it.size) / Minosoft.config.config.game.hud.scale)
|
||||||
matrix = glm.ortho(0.0f, scaledSize.x.toFloat(), scaledSize.y.toFloat(), 0.0f)
|
matrix = glm.ortho(0.0f, scaledSize.x.toFloat(), scaledSize.y.toFloat(), 0.0f)
|
||||||
|
matrixChange = true
|
||||||
|
|
||||||
for (element in hudElements.toSynchronizedMap().values) {
|
for (element in hudElements.toSynchronizedMap().values) {
|
||||||
element.layout?.onParentChange()
|
element.layout?.onParentChange()
|
||||||
@ -159,6 +162,10 @@ class HUDRenderer(
|
|||||||
|
|
||||||
shader.use()
|
shader.use()
|
||||||
mesh.draw()
|
mesh.draw()
|
||||||
|
|
||||||
|
if (matrixChange) {
|
||||||
|
matrixChange = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun <T : HUDElement<*>> get(hudBuilder: HUDBuilder<*>): T? {
|
operator fun <T : HUDElement<*>> get(hudBuilder: HUDBuilder<*>): T? {
|
||||||
|
@ -25,7 +25,7 @@ class HotbarBaseElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
private val base = ImageElement(hudRenderer, baseAtlasElement)
|
private val base = ImageElement(hudRenderer, baseAtlasElement)
|
||||||
private val frame = ImageElement(hudRenderer, hudRenderer.atlasManager[FRAME]!!, size = Vec2i(FRAME_SIZE))
|
private val frame = ImageElement(hudRenderer, hudRenderer.atlasManager[FRAME]!!, size = Vec2i(FRAME_SIZE))
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
base.render(offset + HORIZONTAL_MARGIN, z, consumer)
|
base.render(offset + HORIZONTAL_MARGIN, z, consumer)
|
||||||
|
|
||||||
baseAtlasElement.slots[hudRenderer.connection.player.selectedHotbarSlot]?.let {
|
baseAtlasElement.slots[hudRenderer.connection.player.selectedHotbarSlot]?.let {
|
||||||
@ -37,6 +37,7 @@ class HotbarBaseElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
|
|
||||||
override fun silentApply() {
|
override fun silentApply() {
|
||||||
size = HOTBAR_BASE_SIZE + Vec2i(HORIZONTAL_MARGIN * 2, 1) // offset left and right; offset for the frame is just on top, not on the bottom
|
size = HOTBAR_BASE_SIZE + Vec2i(HORIZONTAL_MARGIN * 2, 1) // offset left and right; offset for the frame is just on top, not on the bottom
|
||||||
|
cacheUpToDate = false // ToDo: Check changes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,11 +33,13 @@ class HotbarElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
hunger,
|
hunger,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override var cacheEnabled: Boolean = false
|
||||||
|
|
||||||
init {
|
init {
|
||||||
silentApply()
|
silentApply()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
silentApply()
|
silentApply()
|
||||||
val initialOffset = Vec2i(offset)
|
val initialOffset = Vec2i(offset)
|
||||||
var maxZ = 0
|
var maxZ = 0
|
||||||
|
@ -127,8 +127,8 @@ class HotbarHealthElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
atlasManager["minecraft:hardcore_half_frozen_heart"],
|
atlasManager["minecraft:hardcore_half_frozen_heart"],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
private val whiteHeartContainer = atlasManager["minecraft:white_heart_container"]
|
private val whiteHeartContainer = atlasManager["minecraft:white_heart_container"]!!
|
||||||
private val blackHeartContainer = atlasManager["minecraft:black_heart_container"]
|
private val blackHeartContainer = atlasManager["minecraft:black_heart_container"]!!
|
||||||
|
|
||||||
private var hardcode = false
|
private var hardcode = false
|
||||||
private var poison = false
|
private var poison = false
|
||||||
@ -145,10 +145,7 @@ class HotbarHealthElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
private var totalMaxHearts = 0
|
private var totalMaxHearts = 0
|
||||||
private var rows = 0
|
private var rows = 0
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
blackHeartContainer ?: return 0
|
|
||||||
whiteHeartContainer ?: return 0
|
|
||||||
|
|
||||||
// ToDo: Damage animation, regeneration, caching
|
// ToDo: Damage animation, regeneration, caching
|
||||||
for (heart in 0 until totalMaxHearts) {
|
for (heart in 0 until totalMaxHearts) {
|
||||||
val row = heart / HEARTS_PER_ROW
|
val row = heart / HEARTS_PER_ROW
|
||||||
@ -213,8 +210,7 @@ class HotbarHealthElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun silentApply() {
|
override fun silentApply() {
|
||||||
blackHeartContainer ?: return
|
// ToDo: Check if something changed
|
||||||
whiteHeartContainer ?: return
|
|
||||||
|
|
||||||
val player = hudRenderer.connection.player
|
val player = hudRenderer.connection.player
|
||||||
|
|
||||||
@ -238,6 +234,7 @@ class HotbarHealthElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
size = Vec2i(HEARTS_PER_ROW, rows) * HEART_SIZE
|
size = Vec2i(HEARTS_PER_ROW, rows) * HEART_SIZE
|
||||||
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,6 +54,12 @@ class HotbarHungerElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override var cacheEnabled: Boolean
|
||||||
|
get() = super.cacheUpToDate && !animate
|
||||||
|
set(value) {
|
||||||
|
super.cacheEnabled = value
|
||||||
|
}
|
||||||
|
|
||||||
private var hungerEffect = false
|
private var hungerEffect = false
|
||||||
private var animate = true
|
private var animate = true
|
||||||
|
|
||||||
@ -65,9 +71,7 @@ class HotbarHungerElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
size = Vec2i(HUNGER_CONTAINERS, 1) * HUNGER_SIZE
|
size = Vec2i(HUNGER_CONTAINERS, 1) * HUNGER_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
// ToDo: Cache
|
|
||||||
|
|
||||||
var hungerLeft = hunger
|
var hungerLeft = hunger
|
||||||
var saturationLeft = saturation.toInt()
|
var saturationLeft = saturation.toInt()
|
||||||
|
|
||||||
@ -123,12 +127,14 @@ class HotbarHungerElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun silentApply() {
|
override fun silentApply() {
|
||||||
|
// ToDo: Check changes
|
||||||
val healthCondition = hudRenderer.connection.player.healthCondition
|
val healthCondition = hudRenderer.connection.player.healthCondition
|
||||||
|
|
||||||
hunger = healthCondition.hunger
|
hunger = healthCondition.hunger
|
||||||
saturation = healthCondition.saturation
|
saturation = healthCondition.saturation
|
||||||
|
|
||||||
hungerEffect = hudRenderer.connection.player.activeStatusEffects.contains(hungerStatusEffect)
|
hungerEffect = hudRenderer.connection.player.activeStatusEffects.contains(hungerStatusEffect)
|
||||||
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun tick() {
|
override fun tick() {
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* Minosoft
|
|
||||||
* Copyright (C) 2021 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.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.scoreboard
|
|
||||||
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
|
||||||
import glm_.vec2.Vec2i
|
|
||||||
|
|
||||||
class ScoreboardEntry(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun silentApply() {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
}
|
|
@ -50,7 +50,7 @@ class TabListElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
hudRenderer.atlasManager["minecraft:tab_list_ping_5".toResourceLocation()]!!,
|
hudRenderer.atlasManager["minecraft:tab_list_ping_5".toResourceLocation()]!!,
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
background.render(Vec2i(offset), z, consumer)
|
background.render(Vec2i(offset), z, consumer)
|
||||||
val size = size
|
val size = size
|
||||||
|
|
||||||
@ -158,6 +158,7 @@ class TabListElement(hudRenderer: HUDRenderer) : Element(hudRenderer) {
|
|||||||
this.size = size
|
this.size = size
|
||||||
|
|
||||||
background.size = size
|
background.size = size
|
||||||
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onParentChange() {
|
override fun onParentChange() {
|
||||||
|
@ -73,7 +73,7 @@ class TabListEntryElement(
|
|||||||
silentApply()
|
silentApply()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
background.render(Vec2i(offset), z, consumer)
|
background.render(Vec2i(offset), z, consumer)
|
||||||
nameElement.render(Vec2i(offset), z, consumer)
|
nameElement.render(Vec2i(offset), z, consumer)
|
||||||
pingElement.render(offset + Vec2i(ElementAlignments.RIGHT.getOffset(maxSize.x, pingElement.size.x + PADDING), PADDING), z + 1, consumer)
|
pingElement.render(offset + Vec2i(ElementAlignments.RIGHT.getOffset(maxSize.x, pingElement.size.x + PADDING), PADDING), z + 1, consumer)
|
||||||
@ -119,6 +119,7 @@ class TabListEntryElement(
|
|||||||
this.prefSize = Vec2i((PADDING * 2) + nameElement.prefSize.x + INNER_MARGIN + pingElement.prefSize.x, HEIGHT)
|
this.prefSize = Vec2i((PADDING * 2) + nameElement.prefSize.x + INNER_MARGIN + pingElement.prefSize.x, HEIGHT)
|
||||||
background.size = size
|
background.size = size
|
||||||
forcePrepare = false
|
forcePrepare = false
|
||||||
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onParentChange() {
|
override fun onParentChange() {
|
||||||
|
@ -16,9 +16,11 @@ package de.bixilon.minosoft.gui.rendering.gui.mesh
|
|||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY
|
||||||
import de.bixilon.minosoft.util.collections.ArrayFloatList
|
import de.bixilon.minosoft.util.collections.ArrayFloatList
|
||||||
import glm_.mat4x4.Mat4
|
import glm_.mat4x4.Mat4
|
||||||
import glm_.vec2.Vec2
|
import glm_.vec2.Vec2
|
||||||
|
import glm_.vec2.Vec2i
|
||||||
import glm_.vec2.Vec2t
|
import glm_.vec2.Vec2t
|
||||||
import glm_.vec4.Vec4
|
import glm_.vec4.Vec4
|
||||||
|
|
||||||
@ -27,6 +29,9 @@ class GUIMeshCache(
|
|||||||
initialCacheSize: Int = 1000,
|
initialCacheSize: Int = 1000,
|
||||||
) : GUIVertexConsumer {
|
) : GUIVertexConsumer {
|
||||||
val data: ArrayFloatList = ArrayFloatList(initialCacheSize)
|
val data: ArrayFloatList = ArrayFloatList(initialCacheSize)
|
||||||
|
var offset: Vec2i = Vec2i.EMPTY
|
||||||
|
var z: Int = 0
|
||||||
|
var maxZ: Int = 0
|
||||||
|
|
||||||
override fun addVertex(position: Vec2t<*>, z: Int, texture: AbstractTexture, uv: Vec2, tint: RGBColor) {
|
override fun addVertex(position: Vec2t<*>, z: Int, texture: AbstractTexture, uv: Vec2, tint: RGBColor) {
|
||||||
val outPosition = matrix * Vec4(position.x.toFloat(), position.y.toFloat(), 1.0f, 1.0f)
|
val outPosition = matrix * Vec4(position.x.toFloat(), position.y.toFloat(), 1.0f, 1.0f)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user