diff --git a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt index 6c47c5ab7..7e7e7d821 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt @@ -23,6 +23,7 @@ import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.ScreenResizeEvent +import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition @@ -232,18 +233,19 @@ class Camera( sectionHeight = blockPosition.sectionHeight inChunkSectionPosition = blockPosition.inChunkSectionPosition // recalculate sky color for current biome - renderWindow.setSkyColor(connection.world.getBiome(blockPosition)?.skyColor ?: RenderConstants.DEFAULT_SKY_COLOR) + val skyRenderer = renderWindow[SkyRenderer] ?: return + skyRenderer.setSkyColor(connection.world.getBiome(blockPosition)?.skyColor ?: RenderConstants.DEFAULT_SKY_COLOR) frustum.recalculate() connection.fireEvent(FrustumChangeEvent(renderWindow, frustum)) connection.world.dimension?.hasSkyLight?.let { if (it) { - renderWindow.setSkyColor(currentBiome?.skyColor ?: RenderConstants.DEFAULT_SKY_COLOR) + skyRenderer.setSkyColor(currentBiome?.skyColor ?: RenderConstants.DEFAULT_SKY_COLOR) } else { - renderWindow.setSkyColor(RenderConstants.BLACK_COLOR) + skyRenderer.setSkyColor(RenderConstants.BLACK_COLOR) } - } ?: renderWindow.setSkyColor(RenderConstants.DEFAULT_SKY_COLOR) + } ?: skyRenderer.setSkyColor(RenderConstants.DEFAULT_SKY_COLOR) } private fun calculateProjectionMatrix(screenDimensions: Vec2): Mat4 { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index 913599160..aee21e175 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -16,8 +16,6 @@ package de.bixilon.minosoft.gui.rendering import de.bixilon.minosoft.config.StaticConfiguration import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.data.text.RGBColor -import de.bixilon.minosoft.data.text.RGBColor.Companion.asColor import de.bixilon.minosoft.gui.input.key.RenderWindowInputHandler import de.bixilon.minosoft.gui.rendering.chunk.WorldRenderer import de.bixilon.minosoft.gui.rendering.font.Font @@ -179,7 +177,7 @@ class RenderWindow( // Make the window visible GL.createCapabilities() - setSkyColor("#fffe7a".asColor()) + glClearColor(1.0f, 1.0f, 0.0f, 1.0f) Log.log(LogMessageType.RENDERING_LOADING) { "Enabling all open gl features (${stopwatch.labTime()})..." } glEnable(GL_DEPTH_TEST) @@ -382,14 +380,9 @@ class RenderWindow( connection.fireEvent(RenderingStateChangeEvent(connection, previousState, renderingState)) } - fun registerRenderer(renderBuilder: RenderBuilder) { - val renderer = renderBuilder.build(connection, this) - rendererMap[renderBuilder.RESOURCE_LOCATION] = renderer - } - - @Deprecated(message = "Will be replaced with SkyRenderer") - fun setSkyColor(color: RGBColor) { - glClearColor(color.floatRed, color.floatGreen, color.floatBlue, 1.0f) + fun registerRenderer(rendererBuilder: RendererBuilder<*>) { + val renderer = rendererBuilder.build(connection, this) + rendererMap[rendererBuilder.RESOURCE_LOCATION] = renderer } fun sendDebugMessage(message: String) { @@ -403,4 +396,8 @@ class RenderWindow( fun assertOnRenderThread() { check(Thread.currentThread() == renderThread) { "Current thread (${Thread.currentThread().name} is not the render thread!" } } + + operator fun get(renderer: RendererBuilder): T? { + return rendererMap[renderer.RESOURCE_LOCATION] as T + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderBuilder.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RendererBuilder.kt similarity index 92% rename from src/main/java/de/bixilon/minosoft/gui/rendering/RenderBuilder.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/RendererBuilder.kt index 45f29e5fd..24ab825a7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderBuilder.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RendererBuilder.kt @@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering import de.bixilon.minosoft.data.mappings.CompanionResourceLocation import de.bixilon.minosoft.protocol.network.connection.PlayConnection -interface RenderBuilder : CompanionResourceLocation { +interface RendererBuilder : CompanionResourceLocation { - fun build(connection: PlayConnection, renderWindow: RenderWindow): Renderer + fun build(connection: PlayConnection, renderWindow: RenderWindow): T } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt index 7a27046a3..c54d24599 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt @@ -419,7 +419,7 @@ class WorldRenderer( return this + upOrDown.directionVector.y } - companion object : RenderBuilder { + companion object : RendererBuilder { override val RESOURCE_LOCATION = ResourceLocation("minosoft:world_renderer") override fun build(connection: PlayConnection, renderWindow: RenderWindow): WorldRenderer { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt index 3201986fc..0d3979ffd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt @@ -16,10 +16,10 @@ package de.bixilon.minosoft.gui.rendering.hud import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.gui.rendering.RenderBuilder 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.hud.atlas.HUDAtlasElement import de.bixilon.minosoft.gui.rendering.hud.elements.other.CrosshairHUDElement import de.bixilon.minosoft.gui.rendering.hud.nodes.HUDElement @@ -214,7 +214,7 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow return Vec2i(x, y) } - companion object : RenderBuilder { + companion object : RendererBuilder { override val RESOURCE_LOCATION = ResourceLocation("minosoft:hud_renderer") override fun build(connection: PlayConnection, renderWindow: RenderWindow): HUDRenderer { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt index f3a099940..40531d4e5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt @@ -17,6 +17,7 @@ import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.assets.AssetsManager import de.bixilon.minosoft.data.commands.CommandStringReader import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.Rendering import de.bixilon.minosoft.gui.rendering.exceptions.ShaderLoadingException import de.bixilon.minosoft.gui.rendering.util.OpenGLUtil @@ -125,6 +126,10 @@ class Shader( } } + fun setRGBColor(uniformName: String, color: RGBColor) { + setVec4(uniformName, Vec4(color.floatRed, color.floatGreen, color.floatBlue, color.alpha)) + } + fun setUniform(uniformName: String, data: Any?) { if (data == null) { return diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt index 18094d9ca..fb7464b22 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt @@ -14,10 +14,12 @@ package de.bixilon.minosoft.gui.rendering.sky import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.RGBColor -import de.bixilon.minosoft.gui.rendering.RenderBuilder +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.shader.Shader import de.bixilon.minosoft.gui.rendering.textures.Texture @@ -43,12 +45,11 @@ class SkyRenderer( resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/sun"), ) private val skyboxMesh = SkyboxMesh() - private var skySunMesh = SkySunMesh() - private var sunTexture = Texture(SUN_TEXTURE_RESOURCE_LOCATION) - private var recalculateSunNextFrame: Boolean = true + private var bottomColor = ChatColors.BLACK + private var topColor = RenderConstants.DEFAULT_SKY_COLOR override fun init() { @@ -110,6 +111,21 @@ class SkyRenderer( skySunMesh.draw() } + fun setSkyColor(color: RGBColor) { + topColor = color + bottomColor = RGBColor(color.red * 8 / 9, color.green * 8 / 9, color.blue * 8 / 9) + renderWindow.renderQueue.add { + updateSkyColor() + } + } + + private fun updateSkyColor() { + skyboxShader.use() + + skyboxShader.setRGBColor("bottomColor", bottomColor) + skyboxShader.setRGBColor("topColor", topColor) + } + private fun drawSkybox() { skyboxShader.use() skyboxMesh.draw() @@ -124,7 +140,7 @@ class SkyRenderer( glDepthFunc(GL_LESS) } - companion object : RenderBuilder { + companion object : RendererBuilder { override val RESOURCE_LOCATION = ResourceLocation("minosoft:sky") private val SUN_TEXTURE_RESOURCE_LOCATION = ResourceLocation("minecraft:textures/environment/sun.png") diff --git a/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/sky_skybox.vsh b/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/sky_skybox.vsh index e98a87022..d2e986fdf 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/sky_skybox.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/sky_skybox.vsh @@ -18,12 +18,15 @@ out vec4 color; uniform mat4 skyViewProjectionMatrix; +uniform vec4 bottomColor; +uniform vec4 topColor; + void main() { gl_Position = (skyViewProjectionMatrix * vec4(inPosition, 1.0)).xyww; if (inPosition.y < 0.5f) { - color = vec4(0.0f, 1.0f, 1.0f, 1.0f); + color = bottomColor; } else { - color = vec4(1.0f, 0.0f, 1.0f, 1.0f); + color = topColor; } }