outsource renderers to RendererManager

This commit is contained in:
Bixilon 2021-12-29 16:44:16 +01:00
parent 6e03910ddc
commit 79de462d77
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
28 changed files with 233 additions and 144 deletions

View File

@ -13,8 +13,6 @@
package de.bixilon.minosoft.gui.rendering package de.bixilon.minosoft.gui.rendering
import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf
import de.bixilon.kutil.concurrent.queue.Queue import de.bixilon.kutil.concurrent.queue.Queue
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.math.MMath.round10 import de.bixilon.kutil.math.MMath.round10
@ -29,41 +27,32 @@ import de.bixilon.minosoft.data.text.BaseComponent
import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.gui.rendering.camera.Camera import de.bixilon.minosoft.gui.rendering.camera.Camera
import de.bixilon.minosoft.gui.rendering.entity.EntityHitboxRenderer
import de.bixilon.minosoft.gui.rendering.font.Font import de.bixilon.minosoft.gui.rendering.font.Font
import de.bixilon.minosoft.gui.rendering.font.FontLoader import de.bixilon.minosoft.gui.rendering.font.FontLoader
import de.bixilon.minosoft.gui.rendering.framebuffer.FramebufferManager import de.bixilon.minosoft.gui.rendering.framebuffer.FramebufferManager
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.hud.atlas.TextureLikeTexture import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.TextureLikeTexture
import de.bixilon.minosoft.gui.rendering.input.key.RenderWindowInputHandler import de.bixilon.minosoft.gui.rendering.input.key.RenderWindowInputHandler
import de.bixilon.minosoft.gui.rendering.modding.events.* import de.bixilon.minosoft.gui.rendering.modding.events.*
import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.renderer.RendererManager
import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer import de.bixilon.minosoft.gui.rendering.renderer.RendererManager.Companion.registerDefault
import de.bixilon.minosoft.gui.rendering.stats.AbstractRenderStats import de.bixilon.minosoft.gui.rendering.stats.AbstractRenderStats
import de.bixilon.minosoft.gui.rendering.stats.ExperimentalRenderStats import de.bixilon.minosoft.gui.rendering.stats.ExperimentalRenderStats
import de.bixilon.minosoft.gui.rendering.stats.RenderStats import de.bixilon.minosoft.gui.rendering.stats.RenderStats
import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.PostDrawable
import de.bixilon.minosoft.gui.rendering.system.base.phases.RenderPhases
import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow
import de.bixilon.minosoft.gui.rendering.system.window.GLFWWindow import de.bixilon.minosoft.gui.rendering.system.window.GLFWWindow
import de.bixilon.minosoft.gui.rendering.tint.TintManager import de.bixilon.minosoft.gui.rendering.tint.TintManager
import de.bixilon.minosoft.gui.rendering.util.ScreenshotTaker import de.bixilon.minosoft.gui.rendering.util.ScreenshotTaker
import de.bixilon.minosoft.gui.rendering.world.WorldRenderer
import de.bixilon.minosoft.gui.rendering.world.chunk.ChunkBorderRenderer
import de.bixilon.minosoft.gui.rendering.world.outline.BlockOutlineRenderer
import de.bixilon.minosoft.modding.event.events.InternalMessageReceiveEvent import de.bixilon.minosoft.modding.event.events.InternalMessageReceiveEvent
import de.bixilon.minosoft.modding.event.events.PacketReceiveEvent import de.bixilon.minosoft.modding.event.events.PacketReceiveEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.PositionAndRotationS2CP import de.bixilon.minosoft.protocol.packets.s2c.play.PositionAndRotationS2CP
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.KUtil.format import de.bixilon.minosoft.util.KUtil.format
import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.KUtil.toResourceLocation
import de.bixilon.minosoft.util.Stopwatch import de.bixilon.minosoft.util.Stopwatch
@ -78,24 +67,44 @@ class RenderWindow(
val rendering: Rendering, val rendering: Rendering,
) { ) {
private val profile = connection.profiles.rendering private val profile = connection.profiles.rendering
val preferQuads = profile.advanced.preferQuads
val window: BaseWindow = GLFWWindow(this, connection) val window: BaseWindow = GLFWWindow(this, connection)
val renderSystem: RenderSystem = OpenGLRenderSystem(this) val renderSystem: RenderSystem = OpenGLRenderSystem(this)
val camera = Camera(this) val camera = Camera(this)
val inputHandler = RenderWindowInputHandler(this)
val screenshotTaker = ScreenshotTaker(this)
val tintManager = TintManager(connection)
val textureManager = renderSystem.createTextureManager()
val queue = Queue()
val shaderManager = ShaderManager(this)
val framebufferManager = FramebufferManager(this)
val renderer = RendererManager(this)
var initialized = false var initialized = false
private set private set
private lateinit var renderThread: Thread private lateinit var renderThread: Thread
lateinit var renderStats: AbstractRenderStats lateinit var renderStats: AbstractRenderStats
private set private set
val preferQuads = profile.advanced.preferQuads lateinit var font: Font
val inputHandler = RenderWindowInputHandler(this) lateinit var WHITE_TEXTURE: TextureLike
private var deltaFrameTime = 0.0 private var deltaFrameTime = 0.0
private var lastFrame = 0.0 private var lastFrame = 0.0
private val latch = CountUpAndDownLatch(1) private val latch = CountUpAndDownLatch(1)
var tickCount = 0L
var lastTickTimer = TimeUtil.time
private var initialPositionReceived = false
var renderingState = RenderingStates.RUNNING var renderingState = RenderingStates.RUNNING
private set(value) { private set(value) {
if (field == value) { if (field == value) {
@ -109,27 +118,6 @@ class RenderWindow(
connection.fireEvent(RenderingStateChangeEvent(connection, previousState, value)) connection.fireEvent(RenderingStateChangeEvent(connection, previousState, value))
} }
private val screenshotTaker = ScreenshotTaker(this)
val tintManager = TintManager(connection)
val textureManager = renderSystem.createTextureManager()
lateinit var font: Font
val rendererMap: MutableMap<ResourceLocation, Renderer> = synchronizedMapOf()
val queue = Queue()
val shaderManager = ShaderManager(this)
val framebufferManager = FramebufferManager(this)
lateinit var WHITE_TEXTURE: TextureLike
var tickCount = 0L
var lastTickTimer = TimeUtil.time
private var initialPositionReceived = false
init { init {
connection.registerEvent(CallbackEventInvoker.of<PacketReceiveEvent> { connection.registerEvent(CallbackEventInvoker.of<PacketReceiveEvent> {
val packet = it.packet val packet = it.packet
@ -148,17 +136,7 @@ class RenderWindow(
RenderStats() RenderStats()
} }
} }
renderer.registerDefault(connection.profiles)
// order dependent (from back to front)
registerRenderer(SkyRenderer)
registerRenderer(WorldRenderer)
registerRenderer(BlockOutlineRenderer)
if (!connection.profiles.particle.skipLoading) {
registerRenderer(ParticleRenderer)
}
registerRenderer(EntityHitboxRenderer)
registerRenderer(ChunkBorderRenderer)
registerRenderer(HUDRenderer)
} }
fun init(latch: CountUpAndDownLatch) { fun init(latch: CountUpAndDownLatch) {
@ -193,9 +171,7 @@ class RenderWindow(
Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Initializing renderer (${stopwatch.labTime()})..." } Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Initializing renderer (${stopwatch.labTime()})..." }
for (renderer in rendererMap.values) { renderer.init()
renderer.init()
}
Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Preloading textures (${stopwatch.labTime()})..." } Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Preloading textures (${stopwatch.labTime()})..." }
textureManager.staticTextures.preLoad() textureManager.staticTextures.preLoad()
@ -205,10 +181,7 @@ class RenderWindow(
font.postInit() font.postInit()
Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Post loading renderer (${stopwatch.labTime()})..." } Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Post loading renderer (${stopwatch.labTime()})..." }
for (renderer in rendererMap.values) { renderer.postInit()
renderer.postInit()
}
Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Registering callbacks (${stopwatch.labTime()})..." } Log.log(LogMessageType.RENDERING_LOADING, LogLevels.VERBOSE) { "Registering callbacks (${stopwatch.labTime()})..." }
@ -340,29 +313,7 @@ class RenderWindow(
textureManager.staticTextures.animator.draw() textureManager.staticTextures.animator.draw()
val rendererList = rendererMap.values renderer.render()
for (renderer in rendererList) {
renderSystem.framebuffer = renderer.framebuffer
renderer.prepareDraw()
}
renderAll(rendererList)
renderSystem.framebuffer = null
framebufferManager.draw()
for (renderer in rendererList) {
if (renderer is SkipAll && renderer.skipAll) {
continue
}
if (renderer !is PostDrawable) {
continue
}
if (renderer.skipPost) {
continue
}
renderSystem.framebuffer = renderer.framebuffer
renderer.drawPost()
}
renderSystem.reset() // Reset to enable depth mask, etc again renderSystem.reset() // Reset to enable depth mask, etc again
@ -398,15 +349,6 @@ class RenderWindow(
connection.disconnect() connection.disconnect()
} }
fun registerRenderer(rendererBuilder: RendererBuilder<*>) {
val resourceLocation = rendererBuilder.RESOURCE_LOCATION
if (resourceLocation in RunConfiguration.SKIP_RENDERERS) {
return
}
val renderer = rendererBuilder.build(connection, this)
rendererMap[resourceLocation] = renderer
}
fun sendDebugMessage(message: Any) { fun sendDebugMessage(message: Any) {
connection.fireEvent(InternalMessageReceiveEvent(connection, BaseComponent(RenderConstants.DEBUG_MESSAGES_PREFIX, ChatComponent.of(message).apply { applyDefaultColor(ChatColors.BLUE) }))) connection.fireEvent(InternalMessageReceiveEvent(connection, BaseComponent(RenderConstants.DEBUG_MESSAGES_PREFIX, ChatComponent.of(message).apply { applyDefaultColor(ChatColors.BLUE) })))
} }
@ -414,27 +356,4 @@ class RenderWindow(
fun assertOnRenderThread() { fun assertOnRenderThread() {
check(Thread.currentThread() === renderThread) { "Current thread (${Thread.currentThread().name} is not the render thread!" } check(Thread.currentThread() === renderThread) { "Current thread (${Thread.currentThread().name} is not the render thread!" }
} }
operator fun <T : Renderer> get(renderer: RendererBuilder<T>): T? {
return rendererMap[renderer.RESOURCE_LOCATION].unsafeCast()
}
private fun renderAll(rendererList: Collection<Renderer>) {
for (phase in RenderPhases.VALUES) {
for (renderer in rendererList) {
if (renderer is SkipAll && renderer.skipAll) {
continue
}
if (!phase.type.java.isAssignableFrom(renderer::class.java)) {
continue
}
if (phase.invokeSkip(renderer)) {
continue
}
renderSystem.framebuffer = renderer.framebuffer
phase.invokeSetup(renderer)
phase.invokeDraw(renderer)
}
}
}
} }

View File

@ -41,7 +41,7 @@ class FogManager(
fogStart = renderWindow.connection.world.view.viewDistance * 16.0f - 8.0f // ToDo fogStart = renderWindow.connection.world.view.viewDistance * 16.0f - 8.0f // ToDo
fogEnd = fogStart + 10.0f fogEnd = fogStart + 10.0f
} }
renderWindow[SkyRenderer]?.let { fogColor = it.baseColor } renderWindow.renderer[SkyRenderer]?.let { fogColor = it.baseColor }
} }

View File

@ -25,9 +25,9 @@ import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.player.LocalPlayerEntity import de.bixilon.minosoft.data.player.LocalPlayerEntity
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderWindow 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.modding.events.FrustumChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions 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.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable

View File

@ -1,10 +1,10 @@
package de.bixilon.minosoft.gui.rendering.framebuffer package de.bixilon.minosoft.gui.rendering.framebuffer
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.framebuffer.gui.GUIFramebuffer import de.bixilon.minosoft.gui.rendering.framebuffer.gui.GUIFramebuffer
import de.bixilon.minosoft.gui.rendering.framebuffer.world.WorldFramebuffer import de.bixilon.minosoft.gui.rendering.framebuffer.world.WorldFramebuffer
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
class FramebufferManager( class FramebufferManager(

View File

@ -1,7 +1,7 @@
package de.bixilon.minosoft.gui.rendering.framebuffer package de.bixilon.minosoft.gui.rendering.framebuffer
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader

View File

@ -22,10 +22,7 @@ import de.bixilon.minosoft.config.key.KeyBinding
import de.bixilon.minosoft.config.key.KeyCodes import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatchRendering import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatchRendering
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.RenderWindow 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.Pollable import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable
import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.HUDAtlasManager import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.HUDAtlasManager
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
@ -42,6 +39,9 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.elements.scoreboard.ScoreboardH
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab.TabListHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab.TabListHUDElement
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.title.TitleHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.title.TitleHUDElement
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer

View File

@ -13,10 +13,10 @@
package de.bixilon.minosoft.gui.rendering.gui.hud.elements package de.bixilon.minosoft.gui.rendering.gui.hud.elements
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDElement
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
abstract class CustomHUDElement(final override val hudRenderer: HUDRenderer) : HUDElement, Drawable { abstract class CustomHUDElement(final override val hudRenderer: HUDRenderer) : HUDElement, Drawable {
override val renderWindow: RenderWindow = hudRenderer.renderWindow override val renderWindow: RenderWindow = hudRenderer.renderWindow

View File

@ -16,11 +16,11 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement 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.gui.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.KUtil.toResourceLocation
import glm_.vec2.Vec2i import glm_.vec2.Vec2i

View File

@ -83,12 +83,12 @@ class DebugHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement<GridLayout>
layout.margin = Vec4i(2) layout.margin = Vec4i(2)
layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED)) layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED))
layout += AutoTextElement(hudRenderer, 1) { "FPS ${renderWindow.renderStats.smoothAvgFPS.round10}" } layout += AutoTextElement(hudRenderer, 1) { "FPS ${renderWindow.renderStats.smoothAvgFPS.round10}" }
renderWindow[WorldRenderer]?.apply { renderWindow.renderer[WorldRenderer]?.apply {
layout += AutoTextElement(hudRenderer, 1) { "C v=$visibleSize, m=$loadedMeshesSize, cQ=$culledQueuedSize, q=$queueSize, pT=$preparingTasksSize/$maxPreparingTasks, l=$meshesToLoadSize/$maxMeshesToLoad, w=${connection.world.chunks.size}" } layout += AutoTextElement(hudRenderer, 1) { "C v=$visibleSize, m=$loadedMeshesSize, cQ=$culledQueuedSize, q=$queueSize, pT=$preparingTasksSize/$maxPreparingTasks, l=$meshesToLoadSize/$maxMeshesToLoad, w=${connection.world.chunks.size}" }
} }
layout += AutoTextElement(hudRenderer, 1) { "E t=${connection.world.entities.size}" } layout += AutoTextElement(hudRenderer, 1) { "E t=${connection.world.entities.size}" }
renderWindow[ParticleRenderer]?.apply { renderWindow.renderer[ParticleRenderer]?.apply {
layout += AutoTextElement(hudRenderer, 1) { "P t=$size" } layout += AutoTextElement(hudRenderer, 1) { "P t=$size" }
} }
@ -98,7 +98,7 @@ class DebugHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement<GridLayout>
BaseComponent().apply { BaseComponent().apply {
this += "S " this += "S "
if (connection.profiles.audio.skipLoading || !audioProfile.enabled) { if (connection.profiles.audio.skipLoading || !audioProfile.enabled) {
this += "$§cdisabled" this += "§cdisabled"
} else { } else {
val audioPlayer = renderWindow.rendering.audioPlayer val audioPlayer = renderWindow.rendering.audioPlayer

View File

@ -2,10 +2,10 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.scoreboard
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.scoreboard.ScoreboardPositions import de.bixilon.minosoft.data.scoreboard.ScoreboardPositions
import de.bixilon.minosoft.gui.rendering.Drawable
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.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.modding.event.events.scoreboard.* import de.bixilon.minosoft.modding.event.events.scoreboard.*
import de.bixilon.minosoft.modding.event.events.scoreboard.team.TeamUpdateEvent import de.bixilon.minosoft.modding.event.events.scoreboard.team.TeamUpdateEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker

View File

@ -17,10 +17,10 @@ import de.bixilon.minosoft.config.key.KeyAction
import de.bixilon.minosoft.config.key.KeyBinding import de.bixilon.minosoft.config.key.KeyBinding
import de.bixilon.minosoft.config.key.KeyCodes import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.Drawable
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.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement
import de.bixilon.minosoft.gui.rendering.renderer.Drawable
import de.bixilon.minosoft.modding.event.events.TabListEntryChangeEvent import de.bixilon.minosoft.modding.event.events.TabListEntryChangeEvent
import de.bixilon.minosoft.modding.event.events.TabListInfoChangeEvent import de.bixilon.minosoft.modding.event.events.TabListInfoChangeEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker

View File

@ -19,9 +19,13 @@ import de.bixilon.kutil.concurrent.time.TimeWorkerTask
import de.bixilon.kutil.time.TimeUtil import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.* import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.RenderingStates
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.gui.rendering.particle.types.Particle
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem 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.SkipAll
import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable

View File

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

View File

@ -1,6 +1,6 @@
/* /*
* Minosoft * Minosoft
* Copyright (C) 2020 Moritz Zwerger * 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 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,8 +11,9 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/ */
package de.bixilon.minosoft.gui.rendering package de.bixilon.minosoft.gui.rendering.renderer
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer

View File

@ -11,9 +11,10 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/ */
package de.bixilon.minosoft.gui.rendering package de.bixilon.minosoft.gui.rendering.renderer
import de.bixilon.minosoft.data.registries.CompanionResourceLocation import de.bixilon.minosoft.data.registries.CompanionResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
interface RendererBuilder<T : Renderer> : CompanionResourceLocation { interface RendererBuilder<T : Renderer> : CompanionResourceLocation {

View File

@ -0,0 +1,154 @@
/*
* 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.renderer
import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf
import de.bixilon.minosoft.config.profile.ConnectionProfiles
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.entity.EntityHitboxRenderer
import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer
import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer
import de.bixilon.minosoft.gui.rendering.system.base.phases.PostDrawable
import de.bixilon.minosoft.gui.rendering.system.base.phases.PreDrawable
import de.bixilon.minosoft.gui.rendering.system.base.phases.RenderPhases
import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll
import de.bixilon.minosoft.gui.rendering.world.WorldRenderer
import de.bixilon.minosoft.gui.rendering.world.chunk.ChunkBorderRenderer
import de.bixilon.minosoft.gui.rendering.world.outline.BlockOutlineRenderer
import de.bixilon.minosoft.terminal.RunConfiguration
class RendererManager(
private val renderWindow: RenderWindow,
) {
private val renderers: MutableMap<ResourceLocation, Renderer> = synchronizedMapOf()
private val connection = renderWindow.connection
private val renderSystem = renderWindow.renderSystem
private val framebufferManager = renderWindow.framebufferManager
fun register(builder: RendererBuilder<*>) {
val resourceLocation = builder.RESOURCE_LOCATION
if (resourceLocation in RunConfiguration.SKIP_RENDERERS) {
return
}
renderers[resourceLocation] = builder.build(connection, renderWindow)
}
operator fun plusAssign(builder: RendererBuilder<*>) = register(builder)
operator fun <T : Renderer> get(renderer: RendererBuilder<T>): T? {
return this[renderer.RESOURCE_LOCATION].unsafeCast()
}
operator fun get(resourceLocation: ResourceLocation): Renderer? {
return renderers[resourceLocation]
}
fun init() {
for (renderer in renderers.values) {
renderer.init()
}
}
fun postInit() {
for (renderer in renderers.values) {
renderer.postInit()
}
}
private fun renderAll(rendererList: Collection<Renderer>) {
for (phase in RenderPhases.VALUES) {
for (renderer in rendererList) {
if (renderer is SkipAll && renderer.skipAll) {
continue
}
if (!phase.type.java.isAssignableFrom(renderer::class.java)) {
continue
}
if (phase.invokeSkip(renderer)) {
continue
}
renderSystem.framebuffer = renderer.framebuffer
phase.invokeSetup(renderer)
phase.invokeDraw(renderer)
}
}
}
fun render() {
val renderers = renderers.values
for (renderer in renderers) {
renderSystem.framebuffer = renderer.framebuffer
renderer.prepareDraw()
}
renderAll(renderers)
renderSystem.framebuffer = null
renderPre(renderers)
framebufferManager.draw()
renderPost(renderers)
}
private fun renderPre(renderers: Collection<Renderer>) {
for (renderer in renderers) {
if (renderer is SkipAll && renderer.skipAll) {
continue
}
if (renderer !is PreDrawable) {
continue
}
if (renderer.skipPre) {
continue
}
renderSystem.framebuffer = renderer.framebuffer
renderer.drawPre()
}
}
private fun renderPost(renderers: Collection<Renderer>) {
for (renderer in renderers) {
if (renderer is SkipAll && renderer.skipAll) {
continue
}
if (renderer !is PostDrawable) {
continue
}
if (renderer.skipPost) {
continue
}
renderSystem.framebuffer = renderer.framebuffer
renderer.drawPost()
}
}
companion object {
fun RendererManager.registerDefault(profiles: ConnectionProfiles) {
// order dependent (from back to front)
register(SkyRenderer)
register(WorldRenderer)
register(BlockOutlineRenderer)
if (!profiles.particle.skipLoading) {
register(ParticleRenderer)
}
register(EntityHitboxRenderer)
register(ChunkBorderRenderer)
register(HUDRenderer)
}
}
}

View File

@ -18,9 +18,9 @@ import de.bixilon.minosoft.data.text.ChatColors
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.RenderWindow 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.modding.events.CameraMatrixChangeEvent 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.system.base.BlendingFunctions import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions 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.RenderSystem

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,10 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
interface PreDrawable : Renderer {
val skipPre: Boolean
get() = false
fun drawPre()
}

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import kotlin.reflect.KClass import kotlin.reflect.KClass
class RenderPhases<T : Renderer>( class RenderPhases<T : Renderer>(

View File

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

View File

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

View File

@ -34,12 +34,12 @@ import de.bixilon.minosoft.data.world.ChunkSection
import de.bixilon.minosoft.data.world.World import de.bixilon.minosoft.data.world.World
import de.bixilon.minosoft.data.world.view.ViewDistanceChangeEvent import de.bixilon.minosoft.data.world.view.ViewDistanceChangeEvent
import de.bixilon.minosoft.gui.rendering.RenderWindow 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.RenderingStates import de.bixilon.minosoft.gui.rendering.RenderingStates
import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent
import de.bixilon.minosoft.gui.rendering.modding.events.RenderingStateChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.RenderingStateChangeEvent
import de.bixilon.minosoft.gui.rendering.models.ModelLoader import de.bixilon.minosoft.gui.rendering.models.ModelLoader
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem 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.system.base.phases.OpaqueDrawable
import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable

View File

@ -20,8 +20,8 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.RendererBuilder import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem 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.system.base.phases.OpaqueDrawable
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh

View File

@ -20,9 +20,9 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.BlockState
import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow 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.camera.target.targets.BlockTarget import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions 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.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.OtherDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.OtherDrawable