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.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);

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.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;
}
}

View File

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

View File

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

View File

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