mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 04:15:14 -04:00
outsource renderers to RendererManager
This commit is contained in:
parent
6e03910ddc
commit
79de462d77
@ -13,8 +13,6 @@
|
||||
|
||||
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.latch.CountUpAndDownLatch
|
||||
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.ChatComponent
|
||||
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.FontLoader
|
||||
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.TextureLikeTexture
|
||||
import de.bixilon.minosoft.gui.rendering.input.key.RenderWindowInputHandler
|
||||
import de.bixilon.minosoft.gui.rendering.modding.events.*
|
||||
import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer
|
||||
import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer
|
||||
import de.bixilon.minosoft.gui.rendering.renderer.RendererManager
|
||||
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.ExperimentalRenderStats
|
||||
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.PolygonModes
|
||||
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.window.BaseWindow
|
||||
import de.bixilon.minosoft.gui.rendering.system.window.GLFWWindow
|
||||
import de.bixilon.minosoft.gui.rendering.tint.TintManager
|
||||
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.PacketReceiveEvent
|
||||
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.play.PositionAndRotationS2CP
|
||||
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.toResourceLocation
|
||||
import de.bixilon.minosoft.util.Stopwatch
|
||||
@ -78,24 +67,44 @@ class RenderWindow(
|
||||
val rendering: Rendering,
|
||||
) {
|
||||
private val profile = connection.profiles.rendering
|
||||
val preferQuads = profile.advanced.preferQuads
|
||||
|
||||
val window: BaseWindow = GLFWWindow(this, connection)
|
||||
val renderSystem: RenderSystem = OpenGLRenderSystem(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
|
||||
private set
|
||||
private lateinit var renderThread: Thread
|
||||
lateinit var renderStats: AbstractRenderStats
|
||||
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 lastFrame = 0.0
|
||||
private val latch = CountUpAndDownLatch(1)
|
||||
|
||||
var tickCount = 0L
|
||||
var lastTickTimer = TimeUtil.time
|
||||
|
||||
private var initialPositionReceived = false
|
||||
|
||||
|
||||
var renderingState = RenderingStates.RUNNING
|
||||
private set(value) {
|
||||
if (field == value) {
|
||||
@ -109,27 +118,6 @@ class RenderWindow(
|
||||
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 {
|
||||
connection.registerEvent(CallbackEventInvoker.of<PacketReceiveEvent> {
|
||||
val packet = it.packet
|
||||
@ -148,17 +136,7 @@ class RenderWindow(
|
||||
RenderStats()
|
||||
}
|
||||
}
|
||||
|
||||
// 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)
|
||||
renderer.registerDefault(connection.profiles)
|
||||
}
|
||||
|
||||
fun init(latch: CountUpAndDownLatch) {
|
||||
@ -193,9 +171,7 @@ class RenderWindow(
|
||||
|
||||
|
||||
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()})..." }
|
||||
textureManager.staticTextures.preLoad()
|
||||
@ -205,10 +181,7 @@ class RenderWindow(
|
||||
font.postInit()
|
||||
|
||||
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()})..." }
|
||||
|
||||
@ -340,29 +313,7 @@ class RenderWindow(
|
||||
|
||||
textureManager.staticTextures.animator.draw()
|
||||
|
||||
val rendererList = rendererMap.values
|
||||
|
||||
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()
|
||||
}
|
||||
renderer.render()
|
||||
|
||||
renderSystem.reset() // Reset to enable depth mask, etc again
|
||||
|
||||
@ -398,15 +349,6 @@ class RenderWindow(
|
||||
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) {
|
||||
connection.fireEvent(InternalMessageReceiveEvent(connection, BaseComponent(RenderConstants.DEBUG_MESSAGES_PREFIX, ChatComponent.of(message).apply { applyDefaultColor(ChatColors.BLUE) })))
|
||||
}
|
||||
@ -414,27 +356,4 @@ class RenderWindow(
|
||||
fun assertOnRenderThread() {
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ class FogManager(
|
||||
fogStart = renderWindow.connection.world.view.viewDistance * 16.0f - 8.0f // ToDo
|
||||
fogEnd = fogStart + 10.0f
|
||||
}
|
||||
renderWindow[SkyRenderer]?.let { fogColor = it.baseColor }
|
||||
renderWindow.renderer[SkyRenderer]?.let { fogColor = it.baseColor }
|
||||
}
|
||||
|
||||
|
||||
|
@ -25,9 +25,9 @@ import de.bixilon.minosoft.data.entities.entities.Entity
|
||||
import de.bixilon.minosoft.data.player.LocalPlayerEntity
|
||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
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.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.RenderSystem
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable
|
||||
|
@ -1,10 +1,10 @@
|
||||
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.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.modding.event.invoker.CallbackEventInvoker
|
||||
|
||||
class FramebufferManager(
|
||||
|
@ -1,7 +1,7 @@
|
||||
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.renderer.Drawable
|
||||
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.shader.Shader
|
||||
|
@ -22,10 +22,7 @@ import de.bixilon.minosoft.config.key.KeyBinding
|
||||
import de.bixilon.minosoft.config.key.KeyCodes
|
||||
import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatchRendering
|
||||
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.Renderer
|
||||
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
||||
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.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.title.TitleHUDElement
|
||||
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.RenderSystem
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
|
||||
|
@ -13,10 +13,10 @@
|
||||
|
||||
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.gui.hud.HUDElement
|
||||
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 {
|
||||
override val renderWindow: RenderWindow = hudRenderer.renderWindow
|
||||
|
@ -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.text.ChatColors
|
||||
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.hud.HUDRenderer
|
||||
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.renderer.Drawable
|
||||
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
||||
import glm_.vec2.Vec2i
|
||||
|
||||
|
@ -83,12 +83,12 @@ class DebugHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement<GridLayout>
|
||||
layout.margin = Vec4i(2)
|
||||
layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED))
|
||||
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) { "E t=${connection.world.entities.size}" }
|
||||
|
||||
renderWindow[ParticleRenderer]?.apply {
|
||||
renderWindow.renderer[ParticleRenderer]?.apply {
|
||||
layout += AutoTextElement(hudRenderer, 1) { "P t=$size" }
|
||||
}
|
||||
|
||||
@ -98,7 +98,7 @@ class DebugHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement<GridLayout>
|
||||
BaseComponent().apply {
|
||||
this += "S "
|
||||
if (connection.profiles.audio.skipLoading || !audioProfile.enabled) {
|
||||
this += "$§cdisabled"
|
||||
this += "§cdisabled"
|
||||
} else {
|
||||
val audioPlayer = renderWindow.rendering.audioPlayer
|
||||
|
||||
|
@ -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.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.elements.HUDBuilder
|
||||
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.team.TeamUpdateEvent
|
||||
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
|
||||
|
@ -17,10 +17,10 @@ import de.bixilon.minosoft.config.key.KeyAction
|
||||
import de.bixilon.minosoft.config.key.KeyBinding
|
||||
import de.bixilon.minosoft.config.key.KeyCodes
|
||||
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.elements.HUDBuilder
|
||||
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.TabListInfoChangeEvent
|
||||
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
|
||||
|
@ -19,9 +19,13 @@ import de.bixilon.kutil.concurrent.time.TimeWorkerTask
|
||||
import de.bixilon.kutil.time.TimeUtil
|
||||
import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch
|
||||
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.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.phases.SkipAll
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable
|
||||
|
@ -11,7 +11,7 @@
|
||||
* 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 {
|
||||
val skipDraw: Boolean
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
@ -11,8 +11,9 @@
|
||||
* 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.buffer.frame.Framebuffer
|
||||
|
@ -11,9 +11,10 @@
|
||||
* 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.gui.rendering.RenderWindow
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
|
||||
interface RendererBuilder<T : Renderer> : CompanionResourceLocation {
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -18,9 +18,9 @@ import de.bixilon.minosoft.data.text.ChatColors
|
||||
import de.bixilon.minosoft.data.text.RGBColor
|
||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||
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.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.DepthFunctions
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 {
|
||||
val skipCustom: Boolean
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 {
|
||||
val skipOpaque: Boolean
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 {
|
||||
val skipOther: Boolean
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 {
|
||||
val skipPost: Boolean
|
||||
|
@ -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()
|
||||
}
|
@ -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
|
||||
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
class RenderPhases<T : Renderer>(
|
||||
|
@ -1,6 +1,6 @@
|
||||
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
|
||||
|
||||
interface TranslucentDrawable : Renderer {
|
||||
|
@ -1,6 +1,6 @@
|
||||
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 {
|
||||
val skipTransparent: Boolean
|
||||
|
@ -34,12 +34,12 @@ import de.bixilon.minosoft.data.world.ChunkSection
|
||||
import de.bixilon.minosoft.data.world.World
|
||||
import de.bixilon.minosoft.data.world.view.ViewDistanceChangeEvent
|
||||
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.modding.events.FrustumChangeEvent
|
||||
import de.bixilon.minosoft.gui.rendering.modding.events.RenderingStateChangeEvent
|
||||
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.phases.OpaqueDrawable
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable
|
||||
|
@ -20,8 +20,8 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
import de.bixilon.minosoft.data.text.ChatColors
|
||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||
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.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.phases.OpaqueDrawable
|
||||
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
|
||||
|
@ -20,9 +20,9 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||
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.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.RenderSystem
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.phases.OtherDrawable
|
||||
|
Loading…
x
Reference in New Issue
Block a user