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.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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|
||||||
@@ -29,16 +30,19 @@ public class RendererData {
|
|||||||
private final KeycodeRegistry keycodeRegistry;
|
private final KeycodeRegistry keycodeRegistry;
|
||||||
|
|
||||||
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,8 +30,10 @@ 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();
|
||||||
|
|
||||||
LOGGER.info("Renderer loop started");
|
LOGGER.info("Renderer loop started");
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user