do gui rendering more async, major gui changes, minor performance improvements

This commit is contained in:
Bixilon 2022-09-03 20:28:09 +02:00
parent f126de8ca3
commit 3665c1c615
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
48 changed files with 237 additions and 103 deletions

View File

@ -30,8 +30,8 @@ import de.bixilon.minosoft.gui.rendering.input.key.DefaultKeyCombinations
import de.bixilon.minosoft.gui.rendering.input.key.RenderWindowInputHandler
import de.bixilon.minosoft.gui.rendering.modding.events.*
import de.bixilon.minosoft.gui.rendering.models.ModelLoader
import de.bixilon.minosoft.gui.rendering.renderer.RendererManager
import de.bixilon.minosoft.gui.rendering.renderer.RendererManager.Companion.registerDefault
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererManager
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererManager.Companion.registerDefault
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalManager
import de.bixilon.minosoft.gui.rendering.stats.AbstractRenderStats
import de.bixilon.minosoft.gui.rendering.stats.ExperimentalRenderStats

View File

@ -29,8 +29,8 @@ import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.entity.models.EntityModel
import de.bixilon.minosoft.gui.rendering.entity.models.minecraft.player.LocalPlayerModel
import de.bixilon.minosoft.gui.rendering.modding.events.VisibilityGraphChangeEvent
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable
import de.bixilon.minosoft.modding.event.events.EntityDestroyEvent

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.entity
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
interface ModelUpdater : Drawable {

View File

@ -17,7 +17,7 @@ import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.framebuffer.gui.GUIFramebuffer
import de.bixilon.minosoft.gui.rendering.framebuffer.world.WorldFramebuffer
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.gui.rendering.framebuffer
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
interface Overlay : Drawable {
val render: Boolean

View File

@ -15,7 +15,7 @@ package de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.overlays.DefaultOverlays
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
class OverlayManager(
private val renderWindow: RenderWindow,

View File

@ -14,42 +14,71 @@
package de.bixilon.minosoft.gui.rendering.gui
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable
import de.bixilon.minosoft.gui.rendering.gui.gui.LayoutedGUIElement
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
interface GUIElementDrawer {
val guiRenderer: GUIRenderer
var lastTickTime: Long
fun drawElements(elements: Collection<GUIElement>) {
fun tickElements(elements: Collection<GUIElement>) {
val time = TimeUtil.millis
val tickLatch = CountUpAndDownLatch(1)
val latch = CountUpAndDownLatch(1)
if (time - lastTickTime > ProtocolDefinition.TICK_TIME) {
for (element in elements) {
if (!element.enabled) {
continue
}
tickLatch.inc()
DefaultThreadPool += {
latch.inc()
DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.HIGH) {
element.tick()
if (element is Pollable) {
if (element.poll()) {
element.apply()
}
}
tickLatch.dec()
latch.dec()
}
}
lastTickTime = time
}
tickLatch.dec()
tickLatch.await()
latch.dec()
latch.await()
}
fun prepareElements(elements: Collection<GUIElement>) {
val latch = CountUpAndDownLatch(1)
for (element in elements) {
if (!element.enabled) {
continue
}
if (element !is AsyncDrawable) {
continue
}
if (element.skipDraw) {
continue
}
element.drawAsync()
if (element is LayoutedGUIElement<*>) {
latch.inc()
element.prepare()
DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.HIGH) { element.prepareAsync(); latch.dec() }
}
}
latch.dec()
latch.await()
}
fun drawElements(elements: Collection<GUIElement>) {
val latch = CountUpAndDownLatch(1)
for (element in elements) {
if (!element.enabled) {
@ -62,12 +91,6 @@ interface GUIElementDrawer {
continue
}
element.draw()
if (element is LayoutedGUIElement<*>) {
latch.inc()
element.prepare()
DefaultThreadPool += { element.prepareAsync(); latch.dec() }
}
}
latch.dec()
latch.await()

View File

@ -30,8 +30,8 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.HUDManager
import de.bixilon.minosoft.gui.rendering.gui.input.ModifierKeys
import de.bixilon.minosoft.gui.rendering.input.InputHandler
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
@ -45,7 +45,7 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation
class GUIRenderer(
val connection: PlayConnection,
override val renderWindow: RenderWindow,
) : Renderer, InputHandler, OtherDrawable {
) : AsyncRenderer, InputHandler, OtherDrawable {
private val profile = connection.profiles.gui
override val renderSystem = renderWindow.renderSystem
var scaledSize: Vec2i by watched(renderWindow.window.size)
@ -131,6 +131,13 @@ class GUIRenderer(
return popper.onScroll(scrollOffset) || dragged.onScroll(scrollOffset) || gui.onScroll(scrollOffset)
}
override fun prepareDrawAsync() {
hud.drawAsync()
gui.drawAsync()
popper.drawAsync()
dragged.drawAsync()
}
override fun drawOther() {
hud.draw()
gui.draw()

View File

@ -24,7 +24,6 @@ import de.bixilon.minosoft.config.key.KeyActions
import de.bixilon.minosoft.config.key.KeyBinding
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.gui.rendering.gui.GUIElement
import de.bixilon.minosoft.gui.rendering.gui.GUIElementDrawer
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
import de.bixilon.minosoft.gui.rendering.gui.elements.LayoutedElement
@ -39,20 +38,23 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.input.DraggableHandler
import de.bixilon.minosoft.gui.rendering.input.InputHandler
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.toResourceLocation
class GUIManager(
override val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, GUIElementDrawer, DraggableHandler {
private val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, DraggableHandler, Drawable, AsyncDrawable {
private val elementCache: MutableMap<GUIBuilder<*>, GUIElement> = mutableMapOf()
private var orderLock = SimpleLock()
var elementOrder: MutableList<GUIElement> = mutableListOf()
private val renderWindow = guiRenderer.renderWindow
internal var paused = false
override var lastTickTime: Long = -1L
private var lastTickTime: Long = -1L
private var order: Collection<GUIElement> = emptyList()
override fun init() {
for (element in elementCache.values) {
@ -104,10 +106,11 @@ class GUIManager(
orderLock.release()
}
fun draw() {
override fun drawAsync() {
orderLock.acquire()
val order = elementOrder.reversed()
this.order = elementOrder.reversed()
orderLock.release()
val time = TimeUtil.millis
val tick = time - lastTickTime > ProtocolDefinition.TICK_TIME
if (tick) {
@ -132,8 +135,8 @@ class GUIManager(
lastTickTime = time
}
if (element is Drawable && !element.skipDraw) {
element.draw()
if (element is AsyncDrawable && !element.skipDraw) {
element.drawAsync()
}
if (element is LayoutedGUIElement<*>) {
element.prepare()
@ -143,7 +146,9 @@ class GUIManager(
}
latch.dec()
latch.await()
}
override fun draw() {
for ((index, element) in order.withIndex()) {
if (!element.enabled) {
continue
@ -151,6 +156,9 @@ class GUIManager(
if (index != order.size - 1 && !element.activeWhenHidden) {
continue
}
if (element is Drawable && !element.skipDraw) {
element.draw()
}
if (element is LayoutedGUIElement<*>) {
element.postPrepare()
}

View File

@ -27,7 +27,9 @@ import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseActions
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseButtons
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh
import de.bixilon.minosoft.gui.rendering.input.count.MouseClickCounter
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.BaseDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
@ -35,13 +37,13 @@ import de.bixilon.minosoft.util.collections.floats.DirectArrayFloatList
open class GUIMeshElement<T : Element>(
val element: T,
) : HUDElement, Drawable {
) : HUDElement, AsyncDrawable, Drawable {
override val guiRenderer: GUIRenderer = element.guiRenderer
override val renderWindow: RenderWindow = guiRenderer.renderWindow
private val clickCounter = MouseClickCounter()
var mesh: GUIMesh = GUIMesh(renderWindow, guiRenderer.matrix, DirectArrayFloatList(1000))
override val skipDraw: Boolean
get() = if (element is Drawable) element.skipDraw else false
get() = if (element is BaseDrawable) element.skipDraw else false
protected var lastRevision = 0L
protected var lastPosition: Vec2i? = null
protected var lastDragPosition: Vec2i? = null
@ -114,6 +116,12 @@ open class GUIMeshElement<T : Element>(
}
}
override fun drawAsync() {
if (element is AsyncDrawable) {
element.drawAsync()
}
}
fun initMesh() {
mesh.load()
}

View File

@ -17,20 +17,21 @@ import de.bixilon.kotlinglm.vec2.Vec2d
import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.gui.rendering.gui.GUIElementDrawer
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseActions
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseButtons
import de.bixilon.minosoft.gui.rendering.input.InputHandler
import de.bixilon.minosoft.gui.rendering.input.count.MouseClickCounter
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
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
class DraggedManager(
override val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, GUIElementDrawer {
private val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, AsyncDrawable, Drawable {
private val clickCounter = MouseClickCounter()
var element: DraggedGUIElement<*>? = null
set(value) {
@ -50,7 +51,7 @@ class DraggedManager(
}
applyCursor()
}
override var lastTickTime: Long = -1L
private var lastTickTime: Long = -1L
override fun init() {
}
@ -70,7 +71,7 @@ class DraggedManager(
window.cursorMode = if (element == null) CursorModes.NORMAL else CursorModes.HIDDEN
}
fun draw() {
override fun drawAsync() {
val element = element ?: return
val time = TimeUtil.millis
val tick = time - lastTickTime > ProtocolDefinition.TICK_TIME
@ -91,10 +92,17 @@ class DraggedManager(
}
element.prepare()
element.prepareAsync()
}
override fun draw() {
val element = element ?: return
if (!element.enabled) {
return
}
element.postPrepare()
guiRenderer.setup()
if (!element.enabled || element.mesh.data.isEmpty) {
if (element.mesh.data.isEmpty) {
return
}
element.mesh.draw()

View File

@ -19,18 +19,19 @@ import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.gui.rendering.gui.GUIElementDrawer
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable
import de.bixilon.minosoft.gui.rendering.input.InputHandler
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
class PopperManager(
override val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, GUIElementDrawer {
private val guiRenderer: GUIRenderer,
) : Initializable, InputHandler, AsyncDrawable, Drawable {
private val poppers: MutableList<PopperGUIElement> = mutableListOf()
override var lastTickTime: Long = -1L
private var lastTickTime: Long = -1L
fun onMatrixChange() {
@ -39,7 +40,7 @@ class PopperManager(
}
}
fun draw() {
override fun drawAsync() {
val toRemove: MutableSet<PopperGUIElement> = mutableSetOf()
val time = TimeUtil.millis
val tick = time - lastTickTime > ProtocolDefinition.TICK_TIME
@ -59,7 +60,7 @@ class PopperManager(
}
if (!popper.skipDraw) {
popper.draw()
popper.drawAsync()
}
latch.inc()
popper.prepare()
@ -69,8 +70,13 @@ class PopperManager(
latch.await()
poppers -= toRemove
}
override fun draw() {
for (popper in poppers) {
if (!popper.skipDraw) {
popper.draw()
}
popper.postPrepare()
guiRenderer.setup()

View File

@ -37,19 +37,22 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.elements.other.PerformanceHUDEl
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.scoreboard.ScoreboardSideElement
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab.TabListElement
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.title.TitleElement
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
import de.bixilon.minosoft.util.KUtil.toResourceLocation
class HUDManager(
override val guiRenderer: GUIRenderer,
) : GUIElementDrawer, Initializable {
) : GUIElementDrawer, Initializable, AsyncDrawable, Drawable {
val renderWindow = guiRenderer.renderWindow
private val hudElements: LockMap<ResourceLocation, HUDElement> = lockMapOf()
override var lastTickTime = 0L
var enabled: Boolean = true
private var values: Collection<HUDElement> = emptyList()
fun registerElement(hudBuilder: HUDBuilder<*>) {
val hudElement = hudBuilder.build(guiRenderer)
hudElements[hudBuilder.RESOURCE_LOCATION] = hudElement
@ -105,10 +108,16 @@ class HUDManager(
}
}
fun draw() {
override fun drawAsync() {
hudElements.lock.acquire()
drawElements(hudElements.values)
this.values = hudElements.values
hudElements.lock.release()
tickElements(values)
prepareElements(values)
}
override fun draw() {
drawElements(values)
}
operator fun <T : HUDElement> get(hudBuilder: HUDBuilder<T>): T? {

View File

@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDElement
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
abstract class CustomHUDElement(final override val guiRenderer: GUIRenderer) : HUDElement, Drawable {
override val renderWindow: RenderWindow = guiRenderer.renderWindow

View File

@ -22,7 +22,7 @@ import de.bixilon.minosoft.gui.rendering.gui.gui.AbstractLayout
import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
abstract class AbstractChatElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Initializable, Drawable, AbstractLayout<Element> {
protected val connection = renderWindow.connection

View File

@ -54,7 +54,7 @@ class ChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRenderer),
}
override var skipDraw: Boolean
// skips hud draw and draws it in gui stage
get() = chatProfile.hidden || active
get() = active || chatProfile.hidden
set(value) {
chatProfile.hidden = !value
}

View File

@ -26,10 +26,10 @@ import de.bixilon.minosoft.gui.rendering.gui.gui.LayoutedGUIElement
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.util.KUtil.toResourceLocation
class BreakProgressHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Drawable {
class BreakProgressHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, AsyncDrawable {
private val textElement = TextElement(guiRenderer, "").apply { parent = this@BreakProgressHUDElement }
private val breakInteractionHandler = guiRenderer.renderWindow.inputHandler.interactionManager.`break`
private var previousProgress = -1.0
@ -40,7 +40,7 @@ class BreakProgressHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer),
private var percent = -1
override fun draw() {
override fun drawAsync() {
val breakProgress = breakInteractionHandler.breakProgress
if (this.previousProgress == breakProgress) {
return

View File

@ -35,14 +35,14 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
import de.bixilon.minosoft.modding.event.events.scoreboard.*
import de.bixilon.minosoft.modding.event.events.scoreboard.team.TeamUpdateEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.util.KUtil.toResourceLocation
class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, Drawable {
class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, AsyncDrawable {
private val backgroundElement = ColorElement(guiRenderer, size = Vec2i.EMPTY, color = RenderConstants.TEXT_BACKGROUND_COLOR)
private val nameBackgroundElement = ColorElement(guiRenderer, size = Vec2i.EMPTY, color = RenderConstants.TEXT_BACKGROUND_COLOR)
private val nameElement = TextElement(guiRenderer, "", background = false, parent = this)
@ -205,7 +205,7 @@ class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), La
})
}
override fun draw() {
override fun drawAsync() {
// check if content was changed, and we need to re-prepare before drawing
if (!cacheUpToDate) {
recalculateSize()

View File

@ -35,7 +35,7 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
import de.bixilon.minosoft.modding.event.events.TabListEntryChangeEvent
import de.bixilon.minosoft.modding.event.events.TabListInfoChangeEvent
@ -44,7 +44,7 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation
import java.util.*
import java.util.concurrent.locks.ReentrantLock
class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, Drawable {
class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, AsyncDrawable {
val header = TextElement(guiRenderer, "", background = false, fontAlignment = HorizontalAlignments.CENTER, parent = this)
val footer = TextElement(guiRenderer, "", background = false, fontAlignment = HorizontalAlignments.CENTER, parent = this)
@ -239,7 +239,7 @@ class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedE
}
override fun draw() {
override fun drawAsync() {
// check if content was changed, and we need to re-prepare before drawing
if (needsApply) {
forceApply()

View File

@ -28,8 +28,8 @@ import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
import de.bixilon.minosoft.gui.rendering.particle.types.Particle
import de.bixilon.minosoft.gui.rendering.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll
import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.gui.rendering.renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh

View File

@ -0,0 +1,26 @@
/*
* Minosoft
* Copyright (C) 2020-2022 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.renderer.drawable
interface AsyncDrawable : DeltaAsyncDrawable {
/**
* Functions gets called every frame
*/
fun drawAsync() {}
override fun drawAsync(millis: Long) {
drawAsync()
}
}

View File

@ -0,0 +1,19 @@
/*
* Minosoft
* Copyright (C) 2020-2022 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.renderer.drawable
interface BaseDrawable {
val skipDraw: Boolean
get() = false
}

View File

@ -0,0 +1,22 @@
/*
* Minosoft
* Copyright (C) 2020-2022 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.renderer.drawable
interface DeltaAsyncDrawable : BaseDrawable {
/**
* Functions gets called every frame
*/
fun drawAsync(millis: Long) = Unit
}

View File

@ -11,12 +11,9 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
interface DeltaDrawable {
val skipDraw: Boolean
get() = false
package de.bixilon.minosoft.gui.rendering.renderer.drawable
interface DeltaDrawable : BaseDrawable {
/**
* Functions gets called every frame
*/

View File

@ -11,7 +11,7 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
package de.bixilon.minosoft.gui.rendering.renderer.drawable
interface Drawable : DeltaDrawable {

View File

@ -11,9 +11,9 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
package de.bixilon.minosoft.gui.rendering.renderer.renderer
interface AsyncRenderer : Renderer {
fun prepareDrawAsync() = Unit
fun prepareDrawAsync()
}

View File

@ -11,7 +11,7 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
package de.bixilon.minosoft.gui.rendering.renderer.renderer
import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.minosoft.gui.rendering.RenderWindow

View File

@ -1,6 +1,6 @@
/*
* Minosoft
* Copyright (C) 2021 Moritz Zwerger
* Copyright (C) 2020-2022 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.
*
@ -11,7 +11,7 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
package de.bixilon.minosoft.gui.rendering.renderer.renderer
import de.bixilon.minosoft.data.registries.CompanionResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderWindow

View File

@ -11,7 +11,7 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
package de.bixilon.minosoft.gui.rendering.renderer.renderer
import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf

View File

@ -19,7 +19,7 @@ import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.renderer.DeltaDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.DeltaDrawable
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation
import de.bixilon.minosoft.gui.rendering.skeletal.model.outliner.SkeletalOutliner

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.skeletal.model.animations
import de.bixilon.minosoft.gui.rendering.renderer.DeltaDrawable
import de.bixilon.minosoft.gui.rendering.renderer.drawable.DeltaDrawable
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
abstract class CustomSkeletalAnimation(override val name: String) : SkeletalAnimation, DeltaDrawable {

View File

@ -24,8 +24,8 @@ import de.bixilon.minosoft.data.text.formatting.color.RGBColor
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.*
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
import de.bixilon.minosoft.gui.rendering.system.base.phases.PreDrawable

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
interface CustomDrawable : Renderer {
val skipCustom: Boolean

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
interface OpaqueDrawable : Renderer {
val skipOpaque: Boolean

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
interface OtherDrawable : Renderer {
val skipOther: Boolean

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
interface PostDrawable : Renderer {
val skipPost: Boolean

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
interface PreDrawable : Renderer {
val skipPre: Boolean

View File

@ -1,6 +1,6 @@
/*
* Minosoft
* Copyright (C) 2021 Moritz Zwerger
* Copyright (C) 2020-2022 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.
*
@ -14,7 +14,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import kotlin.reflect.KClass
class RenderPhases<T : Renderer>(

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
interface TranslucentDrawable : Renderer {

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
interface TransparentDrawable : Renderer {
val skipTransparent: Boolean

View File

@ -28,7 +28,7 @@ import kotlin.math.max
interface Shader {
val loaded: Boolean
val renderWindow: RenderWindow
val uniforms: List<String>
val uniforms: Set<String>
val defines: MutableMap<String, Any>
val log: String

View File

@ -41,7 +41,7 @@ class OpenGLShader(
private set
override val defines: MutableMap<String, Any> = mutableMapOf()
private var shader = -1
override var uniforms: MutableList<String> = mutableListOf()
override var uniforms: MutableSet<String> = mutableSetOf()
private set
private val uniformLocations: Object2IntOpenHashMap<String> = Object2IntOpenHashMap()

View File

@ -38,8 +38,8 @@ import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.RenderingStates
import de.bixilon.minosoft.gui.rendering.modding.events.RenderingStateChangeEvent
import de.bixilon.minosoft.gui.rendering.modding.events.VisibilityGraphChangeEvent
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities

View File

@ -21,8 +21,8 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.asColor
import de.bixilon.minosoft.data.world.border.WorldBorderState
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable

View File

@ -25,9 +25,9 @@ import de.bixilon.minosoft.data.registries.dimension.DimensionProperties
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.MeshSwapper
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh

View File

@ -24,9 +24,9 @@ import de.bixilon.minosoft.data.registries.blocks.types.entity.BlockWithEntity
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget
import de.bixilon.minosoft.gui.rendering.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.MeshSwapper
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.renderer.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.OtherDrawable