feat(renderer): Integrate StorageService into RendererData and G2DRendererControl for video options management
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -30,15 +31,18 @@ public class RendererData {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,7 +30,9 @@ 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();
|
||||
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user