From b9109b350e87c817ba538a0362cb146a5e7eb894 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 23 Nov 2023 19:21:19 +0100 Subject: [PATCH] option to set custom window factory --- .../kotlin/de/bixilon/minosoft/MinosoftSIT.kt | 4 ++++ .../system/window/dummy/DummyWindow.kt | 6 +++++ .../minosoft/gui/rendering/RenderContext.kt | 4 ++-- .../system/window/BaseWindowFactory.kt | 24 ------------------- .../rendering/system/window/WindowFactory.kt} | 12 ++++++---- .../system/window/glfw/GLFWWindow.kt | 9 ++++--- .../minosoft/terminal/CommandLineArguments.kt | 16 ++++++++++++- 7 files changed, 38 insertions(+), 37 deletions(-) delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt rename src/{integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt => main/java/de/bixilon/minosoft/gui/rendering/system/window/WindowFactory.kt} (79%) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt b/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt index 3ab733811..45950671d 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt @@ -17,6 +17,8 @@ import de.bixilon.kutil.concurrent.worker.task.TaskWorker import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.assets.IntegratedAssets import de.bixilon.minosoft.data.registries.fallback.tags.FallbackTags +import de.bixilon.minosoft.gui.rendering.system.window.WindowFactory +import de.bixilon.minosoft.gui.rendering.system.window.dummy.DummyWindow import de.bixilon.minosoft.main.BootTasks import de.bixilon.minosoft.main.MinosoftBoot import de.bixilon.minosoft.terminal.RunConfiguration @@ -44,6 +46,8 @@ internal object MinosoftSIT { } RunConfiguration::CONFIG_DIRECTORY.forceSet(Path.of(System.getProperty("java.io.tmpdir"), "minosoft").resolve("conf")) RunConfiguration.PROFILES_HOT_RELOADING = false + + WindowFactory.factory = DummyWindow } @BeforeSuite diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/dummy/DummyWindow.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/dummy/DummyWindow.kt index bc398ae5d..3716f2246 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/dummy/DummyWindow.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/dummy/DummyWindow.kt @@ -17,9 +17,11 @@ import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kutil.observer.DataObserver.Companion.observed import de.bixilon.kutil.time.TimeUtil +import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow import de.bixilon.minosoft.gui.rendering.system.window.CursorModes import de.bixilon.minosoft.gui.rendering.system.window.CursorShapes +import de.bixilon.minosoft.gui.rendering.system.window.WindowFactory import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY import java.nio.ByteBuffer @@ -57,4 +59,8 @@ class DummyWindow : BaseWindow { override fun setIcon(size: Vec2i, buffer: ByteBuffer) = Unit override fun postInit() = Unit + + companion object : WindowFactory { + override fun create(context: RenderContext) = DummyWindow() + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderContext.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderContext.kt index 33dba8e92..71cc83076 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderContext.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderContext.kt @@ -30,7 +30,7 @@ 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.RenderSystemFactory -import de.bixilon.minosoft.gui.rendering.system.window.BaseWindowFactory +import de.bixilon.minosoft.gui.rendering.system.window.WindowFactory import de.bixilon.minosoft.gui.rendering.tint.TintManager import de.bixilon.minosoft.gui.rendering.util.ScreenshotTaker import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection @@ -42,7 +42,7 @@ class RenderContext( val profile = connection.profiles.rendering val preferQuads = profile.advanced.preferQuads - val window = BaseWindowFactory.create(this) + val window = WindowFactory.factory?.create(this) ?: throw IllegalStateException("Expected a window factory, but none is set.") val system = RenderSystemFactory.create(this) val camera = Camera(this) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt deleted file mode 100644 index 170c21037..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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 . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.system.window - -import de.bixilon.minosoft.gui.rendering.RenderContext -import de.bixilon.minosoft.gui.rendering.system.window.glfw.GLFWWindow - -object BaseWindowFactory { - - fun create(context: RenderContext): BaseWindow { - return GLFWWindow(context) - } -} diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/WindowFactory.kt similarity index 79% rename from src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/system/window/WindowFactory.kt index 0241086fc..3f87ed1ce 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/window/BaseWindowFactory.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/WindowFactory.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2023 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,11 +14,13 @@ package de.bixilon.minosoft.gui.rendering.system.window import de.bixilon.minosoft.gui.rendering.RenderContext -import de.bixilon.minosoft.gui.rendering.system.window.dummy.DummyWindow -object BaseWindowFactory { +interface WindowFactory { - fun create(context: RenderContext): BaseWindow { - return DummyWindow() + fun create(context: RenderContext): BaseWindow + + + companion object { + var factory: WindowFactory? = null } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt index e33413a9b..799cba613 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt @@ -32,13 +32,10 @@ import de.bixilon.minosoft.gui.rendering.events.input.CharInputEvent import de.bixilon.minosoft.gui.rendering.events.input.KeyInputEvent import de.bixilon.minosoft.gui.rendering.events.input.MouseMoveEvent import de.bixilon.minosoft.gui.rendering.events.input.MouseScrollEvent -import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow +import de.bixilon.minosoft.gui.rendering.system.window.* import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow.Companion.DEFAULT_MAXIMUM_WINDOW_SIZE import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow.Companion.DEFAULT_MINIMUM_WINDOW_SIZE import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow.Companion.DEFAULT_WINDOW_SIZE -import de.bixilon.minosoft.gui.rendering.system.window.CursorModes -import de.bixilon.minosoft.gui.rendering.system.window.CursorShapes -import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2dUtil.EMPTY import de.bixilon.minosoft.modding.event.master.AbstractEventMaster import de.bixilon.minosoft.terminal.RunConfiguration @@ -433,7 +430,7 @@ class GLFWWindow( return eventMaster.fire(event) } - companion object { + companion object : WindowFactory { private val initLatch = SimpleLatch(1) init { @@ -447,6 +444,8 @@ class GLFWWindow( } } + override fun create(context: RenderContext) = GLFWWindow(context) + val KEY_CODE_MAPPING = mapOf( GLFW_KEY_UNKNOWN to KeyCodes.KEY_UNKNOWN, GLFW_KEY_SPACE to KeyCodes.KEY_SPACE, diff --git a/src/main/java/de/bixilon/minosoft/terminal/CommandLineArguments.kt b/src/main/java/de/bixilon/minosoft/terminal/CommandLineArguments.kt index 0c0feb95c..f23cc2032 100644 --- a/src/main/java/de/bixilon/minosoft/terminal/CommandLineArguments.kt +++ b/src/main/java/de/bixilon/minosoft/terminal/CommandLineArguments.kt @@ -16,6 +16,8 @@ package de.bixilon.minosoft.terminal import de.bixilon.kutil.shutdown.AbstractShutdownReason import de.bixilon.kutil.shutdown.ShutdownManager import de.bixilon.minosoft.assets.util.AssetsOptions +import de.bixilon.minosoft.gui.rendering.system.window.WindowFactory +import de.bixilon.minosoft.gui.rendering.system.window.glfw.GLFWWindow import de.bixilon.minosoft.modding.loader.parameters.ModParameters import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.json.Jackson @@ -99,11 +101,14 @@ object CommandLineArguments { addArgument("--config") .action(Arguments.store()) .help("Path where minosoft configuration files are stored") + + addArgument("--window") + .action(Arguments.store()) + .help("Window library to use") } fun parse(args: Array) { check(!this::ARGUMENTS.isInitialized) { "Already initialized!" } - if (args.isEmpty()) return this.ARGUMENTS = args.toList() val namespace: Namespace try { @@ -141,5 +146,14 @@ object CommandLineArguments { namespace.getString("home")?.let { RunConfiguration.setHome(Path.of(it)) } namespace.getString("assets")?.let { AssetsOptions.PATH = Path.of(it) } namespace.getString("config")?.let { RunConfiguration.setConfig(Path.of(it)) } + + setWindowFactory(namespace.getString("window")?.lowercase() ?: "glfw") + } + + private fun setWindowFactory(name: String) { + WindowFactory.factory = when (name) { + "glfw" -> GLFWWindow + else -> throw IllegalStateException("Unknown window library: $name") + } } }