wip debug hud

This commit is contained in:
Bixilon 2021-09-07 16:59:57 +02:00
parent 061f2e0f39
commit 1b25e8e19a
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
18 changed files with 220 additions and 104 deletions

View File

@ -27,6 +27,9 @@ class WorldEntities : Iterable<Entity> {
private val entityUUIDMap: MutableMap<Entity, UUID> = synchronizedMapOf()
private val uuidEntityMap: MutableMap<UUID, Entity> = synchronizedMapOf()
val size: Int
get() = idEntityMap.size
fun add(entityId: Int?, entityUUID: UUID?, entity: Entity) {
check(entityId != null || entityUUID != null) { "Entity id and UUID is null!" }

View File

@ -15,7 +15,6 @@ package de.bixilon.minosoft.gui.eros.main
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.ShutdownReasons
import de.bixilon.minosoft.config.StaticConfiguration
import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController
import de.bixilon.minosoft.gui.eros.controller.JavaFXWindowController
@ -26,8 +25,7 @@ import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.clickable
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.ctext
import de.bixilon.minosoft.modding.event.events.account.AccountSelectEvent
import de.bixilon.minosoft.modding.event.master.GlobalEventMaster
import de.bixilon.minosoft.util.GitInfo
import de.bixilon.minosoft.util.KUtil.decide
import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.KUtil.toResourceLocation
import de.bixilon.minosoft.util.ShutdownManager
import de.bixilon.minosoft.util.task.pool.DefaultThreadPool
@ -79,7 +77,7 @@ class MainErosController : JavaFXWindowController() {
override fun init() {
logoFX.image = JavaFXUtil.MINOSOFT_LOGO
versionTextFX.text = "Minosoft " + GitInfo.IS_INITIALIZED.decide(GitInfo.GIT_COMMIT_ID_ABBREV, StaticConfiguration.VERSION)
versionTextFX.text = RunConfiguration.VERSION_STRING
iconMap = mapOf(
ErosMainActivities.PlAY to playIconFX,
ErosMainActivities.SETTINGS to settingsIconFX,

View File

@ -65,6 +65,7 @@ class Rendering(private val connection: PlayConnection) {
CONTEXT_MAP.remove(Thread.currentThread())
exception.printStackTrace()
try {
renderWindow.window.close()
connection.fireEvent(WindowCloseEvent(window = renderWindow.window))
} catch (ignored: Throwable) {
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.gui.rendering.gui.elements
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
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.MAX
@ -20,12 +21,13 @@ import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.EMPTY
import glm_.vec2.Vec2i
import glm_.vec4.Vec4i
abstract class Element {
abstract class Element(val hudRenderer: HUDRenderer) {
val renderWindow = hudRenderer.renderWindow
open var parent: Element? = null
open var prepared: Boolean = false
open var minSize: Vec2i = Vec2i.EMPTY
open var prefMaxSize: Vec2i = Vec2i.MAX
open var prefMaxSize: Vec2i = Vec2i(-1, -1)
open var size: Vec2i = Vec2i()
open var margin: Vec4i = Vec4i.EMPTY
@ -43,6 +45,13 @@ abstract class Element {
val maxSize = Vec2i(prefMaxSize)
if (maxSize.x < 0) {
maxSize.x = hudRenderer.scaledSize.x.toInt()
}
if (maxSize.y < 0) {
maxSize.y = hudRenderer.scaledSize.y.toInt()
}
if (maxSize.x < ret.x) {
ret.x = maxSize.x
}
@ -59,5 +68,7 @@ abstract class Element {
abstract fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int
open fun childChange(child: Element) {}
open fun childChange(child: Element?) {}
open fun tick() {}
}

View File

@ -14,5 +14,6 @@
package de.bixilon.minosoft.gui.rendering.gui.elements.layout
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
abstract class Layout : Element()
abstract class Layout(hudRenderer: HUDRenderer) : Element(hudRenderer)

View File

@ -14,21 +14,29 @@
package de.bixilon.minosoft.gui.rendering.gui.elements.layout
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 de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.bottom
import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.horizontal
import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.left
import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.top
import de.bixilon.minosoft.util.KUtil.synchronizedListOf
import de.bixilon.minosoft.util.KUtil.toSynchronizedList
import glm_.vec2.Vec2i
/**
* A layout, that works from top to bottom, containing other elements, that get wrapped below each other
*/
class RowLayout : Layout() {
class RowLayout(hudRenderer: HUDRenderer) : Layout(hudRenderer) {
// ToDo: Spacing between elements
private val children: MutableList<Element> = synchronizedListOf()
fun clear() {
children.clear()
}
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
var childYOffset = 0
var totalZ = 0
@ -53,7 +61,7 @@ class RowLayout : Layout() {
parent?.childChange(this)
}
override fun childChange(child: Element) {
override fun childChange(child: Element?) {
super.childChange(child)
// ToDo: Check max size
@ -76,4 +84,12 @@ class RowLayout : Layout() {
this.size = size
}
override fun tick() {
super.tick()
for (child in children.toSynchronizedList()) {
child.tick()
}
}
}

View File

@ -0,0 +1,36 @@
/*
* 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.elements.text
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
open class AutoTextElement(
hudRenderer: HUDRenderer,
var interval: Int,
private val updater: () -> Any,
) : TextElement(hudRenderer, "TBD") {
private var remainingTicks = 0
override fun tick() {
super.tick()
if (remainingTicks-- > 0) {
return
}
text = updater()
remainingTicks = interval
}
}

View File

@ -14,5 +14,6 @@
package de.bixilon.minosoft.gui.rendering.gui.elements.text
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
abstract class LabeledElement : Element(), Labeled
abstract class LabeledElement(hudRenderer: HUDRenderer) : Element(hudRenderer), Labeled

View File

@ -14,16 +14,16 @@
package de.bixilon.minosoft.gui.rendering.gui.elements.text
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.font.renderer.ChatComponentRenderer
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import glm_.vec2.Vec2i
import glm_.vec4.Vec4i
class TextElement(
private val renderWindow: RenderWindow,
open class TextElement(
hudRenderer: HUDRenderer,
text: Any,
) : LabeledElement() {
) : LabeledElement(hudRenderer) {
override var text: Any = text
set(value) {
textComponent = ChatComponent.of(value)
@ -32,7 +32,7 @@ class TextElement(
}
override var textComponent: ChatComponent = ChatComponent.of("")
private set(value) {
protected set(value) {
field = value
prepare(value)
}

View File

@ -15,24 +15,23 @@ package de.bixilon.minosoft.gui.rendering.gui.hud
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.data.text.PreChatFormattingCodes
import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Renderer
import de.bixilon.minosoft.gui.rendering.RendererBuilder
import de.bixilon.minosoft.gui.rendering.gui.elements.layout.RowLayout
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
import de.bixilon.minosoft.gui.rendering.gui.hud.hud.DebugHUD
import de.bixilon.minosoft.gui.rendering.gui.hud.hud.HUD
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.synchronizedListOf
import de.bixilon.minosoft.util.KUtil.toResourceLocation
import glm_.glm
import glm_.mat4x4.Mat4
import glm_.vec2.Vec2
import glm_.vec2.Vec2i
import glm_.vec4.Vec4i
class HUDRenderer(
val connection: PlayConnection,
@ -43,16 +42,30 @@ class HUDRenderer(
var scaledSize: Vec2 = renderWindow.window.sizef
private var matrix: Mat4 = Mat4()
val hud: MutableList<HUD<*>> = synchronizedListOf(
DebugHUD(this),
)
private var lastTickTime = 0L
override fun init() {
connection.registerEvent(CallbackEventInvoker.of<ResizeWindowEvent> {
scaledSize = Vec2(it.size) / Minosoft.config.config.game.hud.scale
matrix = glm.ortho(0.0f, scaledSize.x, scaledSize.y, 0.0f)
})
for (hud in this.hud) {
hud.init()
}
}
override fun postInit() {
shader.load()
renderWindow.textureManager.staticTextures.use(shader)
for (hud in this.hud) {
hud.postInit()
}
}
override fun draw() {
@ -62,96 +75,29 @@ class HUDRenderer(
}
mesh = GUIMesh(renderWindow, matrix)
val text1 = TextElement(
renderWindow = renderWindow,
text = TextComponent(
message = "Moritz ist toll!!!",
color = ChatColors.RED,
formatting = mutableSetOf(
PreChatFormattingCodes.BOLD,
PreChatFormattingCodes.SHADOWED,
PreChatFormattingCodes.UNDERLINED,
PreChatFormattingCodes.ITALIC,
PreChatFormattingCodes.STRIKETHROUGH,
PreChatFormattingCodes.OBFUSCATED
),
),
)
val time = System.currentTimeMillis()
if (time - lastTickTime > ProtocolDefinition.TICK_TIME) {
for (hud in this.hud) {
hud.tick()
}
val text2 = TextElement(
renderWindow = renderWindow,
text = TextComponent(
message = "Moritz\nist toll!!!",
color = ChatColors.BLUE,
formatting = mutableSetOf(
PreChatFormattingCodes.BOLD,
PreChatFormattingCodes.SHADOWED,
PreChatFormattingCodes.UNDERLINED,
PreChatFormattingCodes.ITALIC,
PreChatFormattingCodes.STRIKETHROUGH,
PreChatFormattingCodes.OBFUSCATED
),
),
)
val text3 = TextElement(
renderWindow = renderWindow,
text = TextComponent(
message = "!T→E↓S←T~_OÄBÖMÜ",
color = ChatColors.YELLOW,
formatting = mutableSetOf(
PreChatFormattingCodes.UNDERLINED,
),
),
)
val text4 = TextElement(
renderWindow = renderWindow,
text = TextComponent(
message = "Noch viel längerer dummy normaler Text!",
color = ChatColors.GREEN,
formatting = mutableSetOf(
PreChatFormattingCodes.SHADOWED,
PreChatFormattingCodes.UNDERLINED,
),
),
)
val text5 = TextElement(
renderWindow = renderWindow,
text = TextComponent(
message = "AäB",
color = ChatColors.GREEN,
formatting = mutableSetOf(
PreChatFormattingCodes.SHADOWED,
PreChatFormattingCodes.UNDERLINED,
),
),
)
text3.prefMaxSize = Vec2i(50, Int.MAX_VALUE)
text4.prefMaxSize = Vec2i(50, Int.MAX_VALUE)
text4.margin = Vec4i(10, 0, 5, 10)
lastTickTime = time
}
// ToDo: size > maxSize
val layout = RowLayout()
layout.padding = Vec4i(4, 0, 0, 10)
for (hud in this.hud) {
val z = 0
val offset = Vec2i.EMPTY // ToDo
layout += text1
layout += text2
layout += text3
layout += text4
layout += text5
layout.render(Vec2i(0, 0), 0, mesh)
hud.layout?.render(offset, z, mesh)
hud.draw(offset, z, mesh)
}
mesh.load()
shader.use()
mesh.draw()
}

View File

@ -0,0 +1,54 @@
/*
* 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.hud
import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.block.WorldRenderer
import de.bixilon.minosoft.gui.rendering.gui.elements.layout.RowLayout
import de.bixilon.minosoft.gui.rendering.gui.elements.text.AutoTextElement
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer
import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.KUtil.format
import de.bixilon.minosoft.util.MMath.round10
class DebugHUD(val hudRenderer: HUDRenderer) : HUD<RowLayout> {
override val renderWindow: RenderWindow = hudRenderer.renderWindow
override val layout = RowLayout(hudRenderer)
override fun init() {
layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED))
layout += AutoTextElement(hudRenderer, 1) { "FPS ${renderWindow.renderStats.smoothAvgFPS.round10}" }
renderWindow[WorldRenderer]?.apply {
layout += AutoTextElement(hudRenderer, 1) { "C v=${visibleChunks.size}, p=${allChunkSections.size}, q=${queuedChunks.size}, t=${renderWindow.connection.world.chunks.size}" }
}
layout += AutoTextElement(hudRenderer, 1) { "E t=${renderWindow.connection.world.entities.size}" }
renderWindow[ParticleRenderer]?.apply {
layout += AutoTextElement(hudRenderer, 1) { "P t=$size" }
}
layout += TextElement(hudRenderer, "") // ToDo: Spacer element
renderWindow.connection.player.apply {
layout += AutoTextElement(hudRenderer, 1) { with(position) { "XYZ ${x.format()} / ${y.format()} / ${z.format()}" } }
layout += AutoTextElement(hudRenderer, 1) { with(positionInfo.blockPosition) { "Block $x $y $z" } }
}
}
}

View File

@ -0,0 +1,36 @@
/*
* 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.hud
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.gui.elements.layout.Layout
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import glm_.vec2.Vec2i
interface HUD<T : Layout> {
val renderWindow: RenderWindow
val layout: T?
get() = null
fun init() {}
fun postInit() {}
fun draw(offset: Vec2i, z: Int, consumer: GUIVertexConsumer) {}
fun tick() {
layout?.tick()
}
}

View File

@ -40,6 +40,9 @@ class ParticleRenderer(
private var particles: MutableSet<Particle> = synchronizedSetOf()
val size: Int
get() = particles.size
override fun init() {
connection.registerEvent(CallbackEventInvoker.of<CameraMatrixChangeEvent> {
renderWindow.queue += {

View File

@ -42,7 +42,7 @@ class BlockDustParticle(connection: PlayConnection, position: Vec3d, velocity: V
}
texture = when (renderer) {
is BlockRenderer -> renderer.textureMapping.iterator().next().value
is BlockRenderer -> renderer.textureMapping.iterator().next().value // ToDo: If this is empty the rendering crashes
is FluidRenderer -> renderer.stillTexture // ToDo
else -> TODO()
}

View File

@ -222,7 +222,7 @@ class PlayConnection(
Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.FATAL) { exception }
Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.FATAL) { "Could not load version $version. This version seems to be unsupported" }
version.unload()
error = RegistriesLoadingException("Mappings could not be loaded", exception)
error = RegistriesLoadingException("Registries could not be loaded", exception)
retry = false
}
latch.dec()

View File

@ -14,6 +14,7 @@
package de.bixilon.minosoft.terminal
import com.google.common.base.StandardSystemProperty
import de.bixilon.minosoft.config.StaticConfiguration
import de.bixilon.minosoft.util.OSUtil
import java.io.File
@ -49,5 +50,8 @@ object RunConfiguration {
}
folder.absolutePath + "/"
}
val TEMPORARY_FOLDER = System.getProperty("java.io.tmpdir", "$HOME_DIRECTORY/tmp/") + "/"
var VERSION_STRING = "Minosoft $StaticConfiguration.VERSION"
}

View File

@ -16,6 +16,7 @@ package de.bixilon.minosoft.util
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.KUtil.toBoolean
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
@ -105,6 +106,8 @@ object GitInfo {
}
GIT_TOTAL_COMMIT_COUNT = json["git.total.commit.count"].toInt()
RunConfiguration.VERSION_STRING = "Minosoft $GIT_COMMIT_ID_ABBREV"
IS_INITIALIZED = true
} catch (exception: Throwable) {
Log.log(LogMessageType.OTHER, level = LogLevels.WARN) { "Could not load git information." }

View File

@ -31,6 +31,9 @@ class LongAverage(override val nanos: Long) : Average<Long> {
}
cleanup()
val data = data.toSynchronizedList()
if (data.size == 0) {
return 0
}
var total = 0L
for ((_, value) in data) {