diff --git a/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java b/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java index 3916713..9bfc41a 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java @@ -15,6 +15,7 @@ import de.extio.game_engine.event.EventService; import de.extio.game_engine.event.EventService; import de.extio.game_engine.keyboard.KeycodeRegistry; import de.extio.game_engine.renderer.model.RenderingBo; +import de.extio.game_engine.storage.StorageService; @AutoConfiguration @ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true) @@ -41,9 +42,10 @@ public class RendererAutoConfiguration { final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, - final EventService eventService) { + final EventService eventService, + final StorageService storageService) { - final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, keycodeRegistry, eventService); + final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, keycodeRegistry, eventService, storageService); renderer.setRendererData(rendererData); rendererControl.setRendererData(rendererData); renderingBoPool.setRendererData(rendererData); diff --git a/src/main/java/de/extio/game_engine/renderer/RendererData.java b/src/main/java/de/extio/game_engine/renderer/RendererData.java index 0912933..b90e34c 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererData.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererData.java @@ -9,6 +9,7 @@ import de.extio.game_engine.event.EventService; import de.extio.game_engine.keyboard.KeycodeRegistry; import de.extio.game_engine.renderer.model.options.UiOptions; import de.extio.game_engine.renderer.model.options.VideoOptions; +import de.extio.game_engine.storage.StorageService; public class RendererData { @@ -29,16 +30,19 @@ public class RendererData { private final KeycodeRegistry keycodeRegistry; private final EventService eventService; + + private final StorageService storageService; private RendererLoop rendererLoop; - public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService) { + public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService) { this.applicationContext = applicationContext; this.renderer = renderer; this.rendererControl = rendererControl; this.renderingBoPool = renderingBoPool; this.keycodeRegistry = keycodeRegistry; this.eventService = eventService; + this.storageService = storageService; } public ApplicationContext getApplicationContext() { @@ -88,4 +92,8 @@ public class RendererData { public EventService getEventService() { return this.eventService; } + + public StorageService getStorageService() { + return storageService; + } } diff --git a/src/main/java/de/extio/game_engine/renderer/RendererLoop.java b/src/main/java/de/extio/game_engine/renderer/RendererLoop.java index 41d4a26..fd0af0b 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererLoop.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererLoop.java @@ -2,12 +2,14 @@ package de.extio.game_engine.renderer; import java.awt.event.KeyEvent; import java.util.ArrayList; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.extio.game_engine.keyboard.KeyModifiers; import de.extio.game_engine.keyboard.KeycodeRegistration; +import de.extio.game_engine.renderer.model.options.VideoOptions; public class RendererLoop implements Runnable { @@ -28,8 +30,10 @@ public class RendererLoop implements Runnable { try { this.rendererData.getKeycodeRegistry().registerDefault(new KeycodeRegistration("toggleFullScreen", "675", KeyEvent.VK_ENTER, KeyModifiers.MODIFIER_ALT, "ALT ENTER")); - // TODO: Load video options from user preferences - + this.rendererData.getStorageService() + .loadByPath(VideoOptions.class, List.of("gameEngine"), "videoOptions") + .ifPresent(options -> this.rendererData.getVideoOptions().apply(options)); + this.rendererData.getRenderer().show(); LOGGER.info("Renderer loop started"); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java index dd9c008..4459530 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java @@ -3,6 +3,7 @@ package de.extio.game_engine.renderer.g2d; import java.awt.EventQueue; import java.awt.Toolkit; import java.lang.reflect.InvocationTargetException; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +30,7 @@ public class G2DRendererControl implements RendererControl { private double scaleFactor = 1.0; - private double scaleFactorModifier = 1.0; + private volatile G2DRendererControlOptions options = new G2DRendererControlOptions(1.0); private boolean forceAutoScaling; @@ -51,6 +52,12 @@ public class G2DRendererControl implements RendererControl { final Runnable run = () -> { this.renderer.getWriteLock().lock(); try { + if (this.videoOptionsAppliedAt == 0) { + this.rendererData.getStorageService() + .loadByPath(G2DRendererControlOptions.class, List.of("gameEngine"), "g2dRendererControlOptions") + .ifPresent(options -> this.options = options); + } + if (this.renderer.getMainFrame() != null) { this.renderer.getMainFrame().unregisterFullScreenWindow(); this.renderer.reset(); @@ -89,7 +96,8 @@ public class G2DRendererControl implements RendererControl { this.updateViewPort(false, false); - // TODO: Save video options to user preferences + this.rendererData.getStorageService() + .store(List.of("gameEngine"), "videoOptions", this.rendererData.getVideoOptions()); } finally { @@ -133,12 +141,25 @@ public class G2DRendererControl implements RendererControl { @Override public double getScaleFactorModifier() { - return this.scaleFactorModifier; + return this.options.scaleFactorModifier(); } @Override public void setScaleFactorModifier(final double scaleFactorModifier) { - this.scaleFactorModifier = scaleFactorModifier; + if (scaleFactorModifier <= 0.1) { + throw new IllegalArgumentException("Scale factor modifier must be greater than 0.1"); + } + if (scaleFactorModifier > 5.0) { + throw new IllegalArgumentException("Scale factor modifier must be less than 5.0"); + } + if (scaleFactorModifier == this.options.scaleFactorModifier()) { + return; + } + + this.options = new G2DRendererControlOptions(scaleFactorModifier); + this.rendererData.getStorageService() + .store(List.of("gameEngine"), "g2dRendererControlOptions", this.options); + this.recalculate(); } @@ -225,13 +246,13 @@ public class G2DRendererControl implements RendererControl { } else { if (fLow < 1.0 && fHigh < 1.0) { - factor = fLow * this.scaleFactorModifier; + factor = fLow * this.options.scaleFactorModifier(); } else if (fLow > 1.0 && fHigh > 1.0) { - factor = fHigh * this.scaleFactorModifier; + factor = fHigh * this.options.scaleFactorModifier(); } else { - factor = this.scaleFactorModifier; + factor = this.options.scaleFactorModifier(); } } this.scaleFactor = Math.min(SCALE_FACTOR_MAX, Math.max(SCALE_FACTOR_MIN, factor)); @@ -260,4 +281,7 @@ public class G2DRendererControl implements RendererControl { public void setRendererData(final RendererData rendererData) { this.rendererData = rendererData; } + + private static record G2DRendererControlOptions(double scaleFactorModifier) { + } } diff --git a/src/main/java/de/extio/game_engine/renderer/model/options/VideoOptions.java b/src/main/java/de/extio/game_engine/renderer/model/options/VideoOptions.java index 923ea54..ff348d2 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/options/VideoOptions.java +++ b/src/main/java/de/extio/game_engine/renderer/model/options/VideoOptions.java @@ -10,6 +10,13 @@ public final class VideoOptions { private int frameRateTarget = 60; + public void apply(final VideoOptions other) { + this.setVideoMode(other.getVideoMode()); + this.setFullScreenNumber(other.getFullScreenNumber()); + this.setScaleFactorModifier(other.getScaleFactorModifier()); + this.setFrameRateTarget(other.getFrameRateTarget()); + } + public double getScaleFactorModifier() { return this.scaleFactorModifier; }