From 71a5eba3b3aa8b2cf12a6176b1c76bdd9cc9f838 Mon Sep 17 00:00:00 2001 From: PepperCode1 <44146161+PepperCode1@users.noreply.github.com> Date: Sun, 23 Feb 2025 17:56:48 -0800 Subject: [PATCH] The choice is ours - Allow "DEFAULT" to be used in place of a backend ID in commands and configs to dynamically and non-persistently select the best backend --- .../engine_room/flywheel/impl/FlwConfig.java | 2 ++ .../flywheel/impl/FabricFlwConfig.java | 27 ++++++++++++------- .../flywheel/impl/FlwCommands.java | 16 +++++++++++ .../flywheel/impl/FlwCommands.java | 13 +++++++++ .../flywheel/impl/ForgeFlwConfig.java | 18 ++++++++----- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwConfig.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwConfig.java index 760711c0f..7b632adcb 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwConfig.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwConfig.java @@ -4,6 +4,8 @@ import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.backend.BackendConfig; public interface FlwConfig { + String DEFAULT_BACKEND_STR = "DEFAULT"; + FlwConfig INSTANCE = FlwImplXplat.INSTANCE.getConfig(); Backend backend(); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java index a6f17f39a..9fb97c0d5 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java @@ -38,8 +38,8 @@ public class FabricFlwConfig implements FlwConfig { private final File file; - // Don't actually default to off, we'll find the true default in #load public Backend backend = BackendManager.offBackend(); + public boolean useDefaultBackend = true; public boolean limitUpdates = LIMIT_UPDATES_DEFAULT; public int workerThreads = WORKER_THREADS_DEFAULT; @@ -51,6 +51,10 @@ public class FabricFlwConfig implements FlwConfig { @Override public Backend backend() { + if (useDefaultBackend) { + return BackendManager.defaultBackend(); + } + return backend; } @@ -70,10 +74,6 @@ public class FabricFlwConfig implements FlwConfig { } public void load() { - // Grab the default backend here because this object is constructed - // very early in flywheel loading and not all backends may be registered - backend = BackendManager.defaultBackend(); - if (file.exists()) { try (FileReader reader = new FileReader(file)) { fromJson(JsonParser.parseReader(reader)); @@ -96,7 +96,8 @@ public class FabricFlwConfig implements FlwConfig { public void fromJson(JsonElement json) { if (!(json instanceof JsonObject object)) { FlwImpl.CONFIG_LOGGER.warn("Config JSON must be an object"); - backend = BackendManager.defaultBackend(); + backend = BackendManager.offBackend(); + useDefaultBackend = true; limitUpdates = LIMIT_UPDATES_DEFAULT; workerThreads = WORKER_THREADS_DEFAULT; return; @@ -114,8 +115,15 @@ public class FabricFlwConfig implements FlwConfig { if (backendJson instanceof JsonPrimitive primitive && primitive.isString()) { var value = primitive.getAsString(); + if (value.equals(DEFAULT_BACKEND_STR)) { + backend = BackendManager.offBackend(); + useDefaultBackend = true; + return; + } + try { - this.backend = Backend.REGISTRY.getOrThrow(new ResourceLocation(value)); + backend = Backend.REGISTRY.getOrThrow(new ResourceLocation(value)); + useDefaultBackend = false; return; } catch (ResourceLocationException e) { msg = "'backend' value '" + value + "' is not a valid resource location"; @@ -133,7 +141,8 @@ public class FabricFlwConfig implements FlwConfig { if (msg != null) { FlwImpl.CONFIG_LOGGER.warn(msg); } - backend = BackendManager.defaultBackend(); + backend = BackendManager.offBackend(); + useDefaultBackend = true; } private void readLimitUpdates(JsonObject object) { @@ -181,7 +190,7 @@ public class FabricFlwConfig implements FlwConfig { public JsonObject toJson() { JsonObject object = new JsonObject(); - object.addProperty("backend", Backend.REGISTRY.getIdOrThrow(backend).toString()); + object.addProperty("backend", useDefaultBackend ? DEFAULT_BACKEND_STR : Backend.REGISTRY.getIdOrThrow(backend).toString()); object.addProperty("limitUpdates", limitUpdates); object.addProperty("workerThreads", workerThreads); object.add("flw_backends", backendConfig.toJson()); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 1cee65f24..fa4a0ba1c 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -38,10 +38,26 @@ public final class FlwCommands { context.getSource().sendFeedback(Component.translatable("command.flywheel.backend.get", idStr)); return Command.SINGLE_SUCCESS; }) + .then(ClientCommandManager.literal("DEFAULT") + .executes(context -> { + FabricFlwConfig.INSTANCE.backend = BackendManager.offBackend(); + FabricFlwConfig.INSTANCE.useDefaultBackend = true; + FabricFlwConfig.INSTANCE.save(); + + // Reload renderers so we can report the actual backend. + Minecraft.getInstance().levelRenderer.allChanged(); + + Backend actualBackend = BackendManager.currentBackend(); + String actualIdStr = Backend.REGISTRY.getIdOrThrow(actualBackend) + .toString(); + context.getSource().sendFeedback(Component.translatable("command.flywheel.backend.set", actualIdStr)); + return Command.SINGLE_SUCCESS; + })) .then(ClientCommandManager.argument("id", BackendArgument.INSTANCE) .executes(context -> { Backend requestedBackend = context.getArgument("id", Backend.class); FabricFlwConfig.INSTANCE.backend = requestedBackend; + FabricFlwConfig.INSTANCE.useDefaultBackend = false; FabricFlwConfig.INSTANCE.save(); // Reload renderers so we can report the actual backend. diff --git a/forge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/forge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 4dd8cd5a5..2bc7cbb53 100644 --- a/forge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/forge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -38,6 +38,19 @@ public final class FlwCommands { sendMessage(context.getSource(), Component.translatable("command.flywheel.backend.get", idStr)); return Command.SINGLE_SUCCESS; }) + .then(Commands.literal("DEFAULT") + .executes(context -> { + backendValue.set(FlwConfig.DEFAULT_BACKEND_STR); + + // Reload renderers so we can report the actual backend. + Minecraft.getInstance().levelRenderer.allChanged(); + + Backend actualBackend = BackendManager.currentBackend(); + String actualIdStr = Backend.REGISTRY.getIdOrThrow(actualBackend) + .toString(); + sendMessage(context.getSource(), Component.translatable("command.flywheel.backend.set", actualIdStr)); + return Command.SINGLE_SUCCESS; + })) .then(Commands.argument("id", BackendArgument.INSTANCE) .executes(context -> { Backend requestedBackend = context.getArgument("id", Backend.class); diff --git a/forge/src/main/java/dev/engine_room/flywheel/impl/ForgeFlwConfig.java b/forge/src/main/java/dev/engine_room/flywheel/impl/ForgeFlwConfig.java index 9f0cc4760..1207c63ac 100644 --- a/forge/src/main/java/dev/engine_room/flywheel/impl/ForgeFlwConfig.java +++ b/forge/src/main/java/dev/engine_room/flywheel/impl/ForgeFlwConfig.java @@ -29,20 +29,24 @@ public class ForgeFlwConfig implements FlwConfig { public Backend backend() { Backend backend = parseBackend(client.backend.get()); if (backend == null) { + client.backend.set(DEFAULT_BACKEND_STR); backend = BackendManager.defaultBackend(); - client.backend.set(Backend.REGISTRY.getIdOrThrow(backend).toString()); } return backend; } @Nullable - private static Backend parseBackend(String idStr) { + private static Backend parseBackend(String value) { + if (value.equals(DEFAULT_BACKEND_STR)) { + return BackendManager.defaultBackend(); + } + ResourceLocation backendId; try { - backendId = new ResourceLocation(idStr); + backendId = new ResourceLocation(value); } catch (ResourceLocationException e) { - FlwImpl.CONFIG_LOGGER.warn("'backend' value '{}' is not a valid resource location", idStr); + FlwImpl.CONFIG_LOGGER.warn("'backend' value '{}' is not a valid resource location", value); return null; } @@ -82,8 +86,8 @@ public class ForgeFlwConfig implements FlwConfig { public final ForgeBackendConfig backendConfig; private ClientConfig(ForgeConfigSpec.Builder builder) { - backend = builder.comment("Select the backend to use.") - .define("backend", () -> Backend.REGISTRY.getIdOrThrow(BackendManager.defaultBackend()).toString(), o -> o != null && String.class.isAssignableFrom(o.getClass())); + backend = builder.comment("Select the backend to use. Set to \"DEFAULT\" to let Flywheel decide.") + .define("backend", DEFAULT_BACKEND_STR); limitUpdates = builder.comment("Enable or disable instance update limiting with distance.") .define("limitUpdates", true); @@ -103,7 +107,7 @@ public class ForgeFlwConfig implements FlwConfig { public final ForgeConfigSpec.EnumValue lightSmoothness; public ForgeBackendConfig(ForgeConfigSpec.Builder builder) { - lightSmoothness = builder.comment("How smooth flywheel's shader-based lighting should be. May have a large performance impact.") + lightSmoothness = builder.comment("How smooth Flywheel's shader-based lighting should be. May have a large performance impact.") .defineEnum("lightSmoothness", LightSmoothness.SMOOTH); }