option to set custom window factory

This commit is contained in:
Moritz Zwerger 2023-11-23 19:21:19 +01:00
parent 6e996f80e0
commit b9109b350e
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 38 additions and 37 deletions

View File

@ -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

View File

@ -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()
}
}

View File

@ -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)

View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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)
}
}

View File

@ -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
}
}

View File

@ -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,

View File

@ -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<String>) {
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")
}
}
}