feat(renderer): Integrate StorageService into RendererData and G2DRendererControl for video options management

This commit is contained in:
extio-de
2025-12-22 17:18:44 +01:00
parent 18e372bee5
commit 08a18ea734
5 changed files with 57 additions and 12 deletions

View File

@@ -15,6 +15,7 @@ import de.extio.game_engine.event.EventService;
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.keyboard.KeycodeRegistry;
import de.extio.game_engine.renderer.model.RenderingBo; import de.extio.game_engine.renderer.model.RenderingBo;
import de.extio.game_engine.storage.StorageService;
@AutoConfiguration @AutoConfiguration
@ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true)
@@ -41,9 +42,10 @@ public class RendererAutoConfiguration {
final RendererControl rendererControl, final RendererControl rendererControl,
final RenderingBoPool renderingBoPool, final RenderingBoPool renderingBoPool,
final KeycodeRegistry keycodeRegistry, 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); renderer.setRendererData(rendererData);
rendererControl.setRendererData(rendererData); rendererControl.setRendererData(rendererData);
renderingBoPool.setRendererData(rendererData); renderingBoPool.setRendererData(rendererData);

View File

@@ -9,6 +9,7 @@ import de.extio.game_engine.event.EventService;
import de.extio.game_engine.keyboard.KeycodeRegistry; import de.extio.game_engine.keyboard.KeycodeRegistry;
import de.extio.game_engine.renderer.model.options.UiOptions; import de.extio.game_engine.renderer.model.options.UiOptions;
import de.extio.game_engine.renderer.model.options.VideoOptions; import de.extio.game_engine.renderer.model.options.VideoOptions;
import de.extio.game_engine.storage.StorageService;
public class RendererData { public class RendererData {
@@ -30,15 +31,18 @@ public class RendererData {
private final EventService eventService; private final EventService eventService;
private final StorageService storageService;
private RendererLoop rendererLoop; 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.applicationContext = applicationContext;
this.renderer = renderer; this.renderer = renderer;
this.rendererControl = rendererControl; this.rendererControl = rendererControl;
this.renderingBoPool = renderingBoPool; this.renderingBoPool = renderingBoPool;
this.keycodeRegistry = keycodeRegistry; this.keycodeRegistry = keycodeRegistry;
this.eventService = eventService; this.eventService = eventService;
this.storageService = storageService;
} }
public ApplicationContext getApplicationContext() { public ApplicationContext getApplicationContext() {
@@ -88,4 +92,8 @@ public class RendererData {
public EventService getEventService() { public EventService getEventService() {
return this.eventService; return this.eventService;
} }
public StorageService getStorageService() {
return storageService;
}
} }

View File

@@ -2,12 +2,14 @@ package de.extio.game_engine.renderer;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import de.extio.game_engine.keyboard.KeyModifiers; import de.extio.game_engine.keyboard.KeyModifiers;
import de.extio.game_engine.keyboard.KeycodeRegistration; import de.extio.game_engine.keyboard.KeycodeRegistration;
import de.extio.game_engine.renderer.model.options.VideoOptions;
public class RendererLoop implements Runnable { public class RendererLoop implements Runnable {
@@ -28,7 +30,9 @@ public class RendererLoop implements Runnable {
try { try {
this.rendererData.getKeycodeRegistry().registerDefault(new KeycodeRegistration("toggleFullScreen", "675", KeyEvent.VK_ENTER, KeyModifiers.MODIFIER_ALT, "ALT ENTER")); 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(); this.rendererData.getRenderer().show();

View File

@@ -3,6 +3,7 @@ package de.extio.game_engine.renderer.g2d;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -29,7 +30,7 @@ public class G2DRendererControl implements RendererControl {
private double scaleFactor = 1.0; private double scaleFactor = 1.0;
private double scaleFactorModifier = 1.0; private volatile G2DRendererControlOptions options = new G2DRendererControlOptions(1.0);
private boolean forceAutoScaling; private boolean forceAutoScaling;
@@ -51,6 +52,12 @@ public class G2DRendererControl implements RendererControl {
final Runnable run = () -> { final Runnable run = () -> {
this.renderer.getWriteLock().lock(); this.renderer.getWriteLock().lock();
try { 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) { if (this.renderer.getMainFrame() != null) {
this.renderer.getMainFrame().unregisterFullScreenWindow(); this.renderer.getMainFrame().unregisterFullScreenWindow();
this.renderer.reset(); this.renderer.reset();
@@ -89,7 +96,8 @@ public class G2DRendererControl implements RendererControl {
this.updateViewPort(false, false); this.updateViewPort(false, false);
// TODO: Save video options to user preferences this.rendererData.getStorageService()
.store(List.of("gameEngine"), "videoOptions", this.rendererData.getVideoOptions());
} }
finally { finally {
@@ -133,12 +141,25 @@ public class G2DRendererControl implements RendererControl {
@Override @Override
public double getScaleFactorModifier() { public double getScaleFactorModifier() {
return this.scaleFactorModifier; return this.options.scaleFactorModifier();
} }
@Override @Override
public void setScaleFactorModifier(final double scaleFactorModifier) { 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(); this.recalculate();
} }
@@ -225,13 +246,13 @@ public class G2DRendererControl implements RendererControl {
} }
else { else {
if (fLow < 1.0 && fHigh < 1.0) { if (fLow < 1.0 && fHigh < 1.0) {
factor = fLow * this.scaleFactorModifier; factor = fLow * this.options.scaleFactorModifier();
} }
else if (fLow > 1.0 && fHigh > 1.0) { else if (fLow > 1.0 && fHigh > 1.0) {
factor = fHigh * this.scaleFactorModifier; factor = fHigh * this.options.scaleFactorModifier();
} }
else { else {
factor = this.scaleFactorModifier; factor = this.options.scaleFactorModifier();
} }
} }
this.scaleFactor = Math.min(SCALE_FACTOR_MAX, Math.max(SCALE_FACTOR_MIN, factor)); 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) { public void setRendererData(final RendererData rendererData) {
this.rendererData = rendererData; this.rendererData = rendererData;
} }
private static record G2DRendererControlOptions(double scaleFactorModifier) {
}
} }

View File

@@ -10,6 +10,13 @@ public final class VideoOptions {
private int frameRateTarget = 60; 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() { public double getScaleFactorModifier() {
return this.scaleFactorModifier; return this.scaleFactorModifier;
} }