From c19307e4f36165bb79e39da2252774f084774fe7 Mon Sep 17 00:00:00 2001 From: extio-de Date: Sat, 20 Dec 2025 19:20:54 +0100 Subject: [PATCH] Configuration for G2D rendering; Add RendererLoop; Bootstrapping --- .../extio/game_engine/renderer/Renderer.java | 2 + .../renderer/RendererConfiguration.java | 51 ++++++++++++++++ .../game_engine/renderer/RendererControl.java | 2 + .../game_engine/renderer/RendererData.java | 50 ++++++++-------- .../game_engine/renderer/RendererFactory.java | 21 ------- .../game_engine/renderer/RendererLoop.java | 60 +++++++++++++++++++ .../game_engine/renderer/RenderingBoPool.java | 2 + .../renderer/RenderingBoPoolImpl.java | 21 ++++--- .../renderer/g2d/G2DAutoConfiguration.java | 25 ++++++++ .../renderer/g2d/G2DMainFrame.java | 9 +-- .../game_engine/renderer/g2d/G2DRenderer.java | 37 ++++-------- .../renderer/g2d/G2DRendererControl.java | 14 +++-- .../g2d/bo/rendering/G2DDrawBackground.java | 3 + .../g2d/bo/rendering/G2DDrawEffect.java | 3 + .../g2d/bo/rendering/G2DDrawFont.java | 3 + .../g2d/bo/rendering/G2DDrawFpsHistory.java | 3 + .../g2d/bo/rendering/G2DDrawImage.java | 3 + .../g2d/bo/rendering/G2DDrawTest.java | 3 + .../g2d/bo/rendering/G2DDrawWindow.java | 3 + .../g2d/bo/rendering/G2DDrawWindow2.java | 3 + .../renderer/g2d/control/G2DDrawControl.java | 2 + .../g2d/control/G2DDrawControlTooltip.java | 3 + .../renderer/model/options/UiOptions.java | 2 +- .../renderer/model/options/VideoOptions.java | 2 +- .../de/extio/game_engine/BootstrapTest.java | 42 +++++++++++++ 25 files changed, 280 insertions(+), 89 deletions(-) create mode 100644 src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java delete mode 100644 src/main/java/de/extio/game_engine/renderer/RendererFactory.java create mode 100644 src/main/java/de/extio/game_engine/renderer/RendererLoop.java create mode 100644 src/main/java/de/extio/game_engine/renderer/g2d/G2DAutoConfiguration.java create mode 100644 src/test/java/de/extio/game_engine/BootstrapTest.java diff --git a/src/main/java/de/extio/game_engine/renderer/Renderer.java b/src/main/java/de/extio/game_engine/renderer/Renderer.java index 090f115..da03708 100644 --- a/src/main/java/de/extio/game_engine/renderer/Renderer.java +++ b/src/main/java/de/extio/game_engine/renderer/Renderer.java @@ -16,4 +16,6 @@ public interface Renderer { void setTitle(final String title); + void setRendererData(final RendererData rendererData); + } diff --git a/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java b/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java new file mode 100644 index 0000000..86d9e93 --- /dev/null +++ b/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java @@ -0,0 +1,51 @@ +package de.extio.game_engine.renderer; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; + +import de.extio.game_engine.renderer.model.RenderingBo; + +@AutoConfiguration +@ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true) +public class RendererConfiguration { + + @SuppressWarnings("unchecked") + @Bean + public RenderingBoPool renderingBoPool(final List renderingBoImplementations) { + final Map, Class> mapping = new HashMap<>(); + for (final var impl : renderingBoImplementations) { + for (final var interf : impl.getClass().getInterfaces()) { + if (RenderingBo.class.isAssignableFrom(interf)) { + mapping.put((Class) interf, impl.getClass()); + } + } + } + + return new RenderingBoPoolImpl(mapping); + } + + @Bean + public RendererData rendererData(final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, @Qualifier("gameEngineEventConsumer") final Consumer eventConsumer) { + final var rendererData = new RendererData(renderer, rendererControl, renderingBoPool, eventConsumer); + renderer.setRendererData(rendererData); + rendererControl.setRendererData(rendererData); + renderingBoPool.setRendererData(rendererData); + return rendererData; + } + + @Bean + public RendererLoop rendererLoop(final RendererData rendererData) { + final var rendererLoop = new RendererLoop(rendererData); + rendererData.setRendererLoop(rendererLoop); + rendererLoop.start(); + return rendererLoop; + } + +} diff --git a/src/main/java/de/extio/game_engine/renderer/RendererControl.java b/src/main/java/de/extio/game_engine/renderer/RendererControl.java index fb21f7e..9af48a7 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererControl.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererControl.java @@ -39,5 +39,7 @@ public interface RendererControl { void setFrameRate(int frameRate); long getFrame(); + + void setRendererData(final RendererData 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 51b2a2a..fec7e11 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererData.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererData.java @@ -1,5 +1,6 @@ package de.extio.game_engine.renderer; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import de.extio.game_engine.renderer.model.options.UiOptions; @@ -7,28 +8,33 @@ import de.extio.game_engine.renderer.model.options.VideoOptions; public class RendererData { - private Renderer renderer; + private final Renderer renderer; - private RendererControl rendererControl; + private final RendererControl rendererControl; - private RenderingBoPool renderingBoPool; + private final RenderingBoPool renderingBoPool; + + private final Consumer eventConsumer; private final UiOptions uiOptions = new UiOptions(); private final VideoOptions videoOptions = new VideoOptions(); - private long frame; + private final AtomicLong frame = new AtomicLong(); - private Consumer eventConsumer; + private RendererLoop rendererLoop; + public RendererData(final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final Consumer eventConsumer) { + this.renderer = renderer; + this.rendererControl = rendererControl; + this.renderingBoPool = renderingBoPool; + this.eventConsumer = eventConsumer; + } + public RendererControl getRendererControl() { return this.rendererControl; } - public void setRendererControl(final RendererControl rendererControl) { - this.rendererControl = rendererControl; - } - public UiOptions getUiOptions() { return this.uiOptions; } @@ -37,26 +43,18 @@ public class RendererData { return this.renderingBoPool; } - public void setRenderingBoPool(final RenderingBoPool renderingBoPool) { - this.renderingBoPool = renderingBoPool; - } - public long getFrame() { - return this.frame; + return this.frame.get(); } - - public void setFrame(final long frame) { - this.frame = frame; + + public long nextFrame() { + return this.frame.incrementAndGet(); } public Renderer getRenderer() { return this.renderer; } - public void setRenderer(final Renderer renderer) { - this.renderer = renderer; - } - public VideoOptions getVideoOptions() { return this.videoOptions; } @@ -64,9 +62,13 @@ public class RendererData { public Consumer getEventConsumer() { return this.eventConsumer; } - - public void setEventConsumer(final Consumer eventConsumer) { - this.eventConsumer = eventConsumer; + + public void setRendererLoop(final RendererLoop rendererLoop) { + this.rendererLoop = rendererLoop; + } + + public RendererLoop getRendererLoop() { + return this.rendererLoop; } } diff --git a/src/main/java/de/extio/game_engine/renderer/RendererFactory.java b/src/main/java/de/extio/game_engine/renderer/RendererFactory.java deleted file mode 100644 index 186e0df..0000000 --- a/src/main/java/de/extio/game_engine/renderer/RendererFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.extio.game_engine.renderer; - -import java.util.function.Consumer; - -import de.extio.game_engine.renderer.g2d.G2DRenderer; -import de.extio.game_engine.renderer.g2d.G2DRendererControl; - -public class RendererFactory { - - public static Renderer createG2DRenderer(final RenderingBoPool renderingBoPool, final Consumer eventConsumer) { - final var rendererData = new RendererData(); - final var renderer = new G2DRenderer(rendererData); - rendererData.setRendererControl(new G2DRendererControl(renderer, rendererData)); - rendererData.setRenderingBoPool(renderingBoPool); - rendererData.setRenderer(renderer); - rendererData.setEventConsumer(eventConsumer); - - return renderer; - } - -} diff --git a/src/main/java/de/extio/game_engine/renderer/RendererLoop.java b/src/main/java/de/extio/game_engine/renderer/RendererLoop.java new file mode 100644 index 0000000..2965c92 --- /dev/null +++ b/src/main/java/de/extio/game_engine/renderer/RendererLoop.java @@ -0,0 +1,60 @@ +package de.extio.game_engine.renderer; + +import java.util.ArrayList; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RendererLoop extends Thread { + + private static final Logger LOGGER = LoggerFactory.getLogger(RendererLoop.class); + + private final RendererData rendererData; + + private volatile boolean running = true; + + public RendererLoop(final RendererData rendererData) { + this.rendererData = rendererData; + this.setName("Renderer-Loop"); + this.setDaemon(false); + } + + @Override + public void run() { + try { + this.rendererData.getRenderer().show(); + + LOGGER.info("Renderer loop started"); + int exceptionCount = 0; + while (this.running) { + try { + this.rendererData.nextFrame(); + this.rendererData.getRenderer().run(new ArrayList<>()); // TODO: Pass actual renderables + exceptionCount = 0; + } + catch (final InterruptedException e) { + LOGGER.info("Renderer loop interrupted, shutting down"); + Thread.currentThread().interrupt(); + break; + } + catch (final Exception e) { + LOGGER.error("Renderer loop caught exception", e); + if (++exceptionCount >= 10) { + LOGGER.error("Renderer loop exceeded maximum exception count, shutting down"); + break; + } + } + } + + LOGGER.info("Renderer loop exited"); + } + catch (final Throwable t) { + LOGGER.error("Renderer loop crashed", t); + } + } + + public void shutdown() { + this.running = false; + } + +} diff --git a/src/main/java/de/extio/game_engine/renderer/RenderingBoPool.java b/src/main/java/de/extio/game_engine/renderer/RenderingBoPool.java index 9cbeb10..906e39a 100644 --- a/src/main/java/de/extio/game_engine/renderer/RenderingBoPool.java +++ b/src/main/java/de/extio/game_engine/renderer/RenderingBoPool.java @@ -21,4 +21,6 @@ public interface RenderingBoPool { */ void release(RenderingBo obj); + + void setRendererData(RendererData rendererData); } diff --git a/src/main/java/de/extio/game_engine/renderer/RenderingBoPoolImpl.java b/src/main/java/de/extio/game_engine/renderer/RenderingBoPoolImpl.java index 6e15975..288c92c 100644 --- a/src/main/java/de/extio/game_engine/renderer/RenderingBoPoolImpl.java +++ b/src/main/java/de/extio/game_engine/renderer/RenderingBoPoolImpl.java @@ -9,9 +9,7 @@ import de.extio.game_engine.renderer.model.RenderingBo; public class RenderingBoPoolImpl implements RenderingBoPool { - public final static Map, Class> INTERFACE_TO_BO_G2D = new HashMap<>(); - - private final RendererData rendererData; + public final Map, Class> mapping; private final Map, Stack> pool = new HashMap<>(); @@ -19,6 +17,8 @@ public class RenderingBoPoolImpl implements RenderingBoPool { private final LastReverseMapping lastReverseMapping = new LastReverseMapping(); + private RendererData rendererData; + private static class LastMapping { volatile Class clazz; @@ -34,11 +34,11 @@ public class RenderingBoPoolImpl implements RenderingBoPool { volatile Stack pooled; } - - public RenderingBoPoolImpl(final RendererData rendererData) { - this.rendererData = rendererData; + + public RenderingBoPoolImpl(final Map, Class> mapping) { + this.mapping = mapping; } - + @Override @SuppressWarnings("unchecked") public T acquire(final Class clazz) { @@ -54,7 +54,7 @@ public class RenderingBoPoolImpl implements RenderingBoPool { impl = clazz; } else { - impl = INTERFACE_TO_BO_G2D.get(clazz); + impl = mapping.get(clazz); if (impl == null) { throw new IllegalArgumentException(clazz.getSimpleName() + " not mapped"); } @@ -114,5 +114,10 @@ public class RenderingBoPoolImpl implements RenderingBoPool { throw new RuntimeException(e); } } + + @Override + public void setRendererData(final RendererData rendererData) { + this.rendererData = rendererData; + } } diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DAutoConfiguration.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DAutoConfiguration.java new file mode 100644 index 0000000..b7dbee5 --- /dev/null +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DAutoConfiguration.java @@ -0,0 +1,25 @@ +package de.extio.game_engine.renderer.g2d; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +@ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(name = "game-engine.renderer.strategy", havingValue = "g2d", matchIfMissing = true) +public class G2DAutoConfiguration { + + @Bean + public G2DRenderer g2dRenderer(@Value("${game-engine.renderer.title:}") final String title) { + final var renderer = new G2DRenderer(); + renderer.setTitle(title); + return renderer; + } + + @Bean + public G2DRendererControl g2dRendererControl(final G2DRenderer renderer) { + return new G2DRendererControl(renderer); + } + +} diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java index 902cc98..0a9d9e2 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java @@ -39,7 +39,6 @@ import de.extio.game_engine.renderer.model.event.MouseMoveEvent; import de.extio.game_engine.spatial2.model.CoordI2; import de.extio.game_engine.spatial2.model.ImmutableCoordI2; -@SuppressWarnings("serial") public class G2DMainFrame extends Frame { private static final Logger LOGGER = LoggerFactory.getLogger(G2DMainFrame.class); @@ -62,8 +61,10 @@ public class G2DMainFrame extends Frame { this.setBackground(Color.BLACK); try (var in = this.getClass().getClassLoader().getResourceAsStream("icon.png")) { - final var icon = ImageIO.read(in); - this.setIconImage(icon); + if (in != null) { + final var icon = ImageIO.read(in); + this.setIconImage(icon); + } } catch (final IOException e) { LOGGER.error(e.getMessage(), e); @@ -93,7 +94,7 @@ public class G2DMainFrame extends Frame { @Override public void windowClosing(final WindowEvent e) { - System.exit(0); + G2DMainFrame.this.rendererData.getRendererLoop().shutdown(); } @Override diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java index fe28335..e3d83e0 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java @@ -19,25 +19,15 @@ import org.slf4j.LoggerFactory; import de.extio.game_engine.renderer.Renderer; import de.extio.game_engine.renderer.RendererData; -import de.extio.game_engine.renderer.RenderingBoPoolImpl; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawBackground; -import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawEffect; -import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFpsHistory; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawImage; -import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawTest; -import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawWindow; import de.extio.game_engine.renderer.g2d.control.G2DDrawControl; import de.extio.game_engine.renderer.g2d.control.G2DDrawControlTooltip; import de.extio.game_engine.renderer.model.RenderingBo; import de.extio.game_engine.renderer.model.RenderingBoLayer; -import de.extio.game_engine.renderer.model.bo.ControlRenderingBo; -import de.extio.game_engine.renderer.model.bo.DrawEffectRenderingBo; import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBo; -import de.extio.game_engine.renderer.model.bo.DrawImageRenderingBo; -import de.extio.game_engine.renderer.model.bo.DrawTestRenderingBo; -import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo; import de.extio.game_engine.renderer.model.color.RgbaColor; import de.extio.game_engine.renderer.model.event.TakeScreenshotEvent; import de.extio.game_engine.util.RingBuffer; @@ -48,11 +38,11 @@ public class G2DRenderer implements Renderer { private static final long SLEEP_PRECISION = TimeUnit.MILLISECONDS.toNanos(3); + private final RingBuffer fpsHistory = new RingBuffer<>(90); + private volatile G2DMainFrame mainFrame; - private final RendererData rendererData; - - private final RingBuffer fpsHistory = new RingBuffer<>(90); + private RendererData rendererData; private long fpsMeasurement; @@ -70,28 +60,20 @@ public class G2DRenderer implements Renderer { private volatile boolean takeScreenshot; - public G2DRenderer(final RendererData rendererData) { + public G2DRenderer() { LOGGER.info("ctor"); System.setProperty("sun.java2d.uiScale", "1"); System.setProperty("awt.nativeDoubleBuffering", "true"); System.setProperty("awt.useSystemAAFontSettings", "on"); System.setProperty("swing.aatext", "true"); - - this.rendererData = rendererData; - - // TODO: Discover with spring dm - RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawFontRenderingBo.class, G2DDrawFont.class); - RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawImageRenderingBo.class, G2DDrawImage.class); - RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(ControlRenderingBo.class, G2DDrawControl.class); - RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawWindowRenderingBo.class, G2DDrawWindow.class); - RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawTestRenderingBo.class, G2DDrawTest.class); - RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawEffectRenderingBo.class, G2DDrawEffect.class); } @Override public void show() { try { + LOGGER.info("show()"); + EventQueue.invokeAndWait(() -> { this.rendererData.getRendererControl().applyVideoOptions(); }); @@ -316,7 +298,7 @@ public class G2DRenderer implements Renderer { @Override public void setTitle(final String title) { this.title = title; - if (this.mainFrame != null) { + if (this.mainFrame != null && title != null) { this.mainFrame.setTitle(title); } } @@ -324,4 +306,9 @@ public class G2DRenderer implements Renderer { public String getTitle() { return this.title; } + + @Override + public void setRendererData(final RendererData rendererData) { + this.rendererData = rendererData; + } } 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 9098ff2..d551926 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 @@ -19,10 +19,10 @@ public class G2DRendererControl implements RendererControl { private final static CoordI2 NO_SCALING_UPPER_LIMIT = ImmutableCoordI2.create(2560, 1440); - private final RendererData rendererData; - private final G2DRenderer renderer; + private RendererData rendererData; + private CoordI2 absoluteViewportDimension = REFERENCE_RESOLUTION; private CoordI2 effectiveViewportDimension = REFERENCE_RESOLUTION; @@ -37,9 +37,8 @@ public class G2DRendererControl implements RendererControl { private volatile long videoOptionsAppliedAt; - public G2DRendererControl(final G2DRenderer renderer, final RendererData rendererData) { + public G2DRendererControl(final G2DRenderer renderer) { this.renderer = renderer; - this.rendererData = rendererData; } @Override @@ -82,7 +81,7 @@ public class G2DRendererControl implements RendererControl { else { mainFrame.windowed(); } - mainFrame.setTitle(this.renderer.getTitle()); + mainFrame.setTitle(this.renderer.getTitle() == null ? "" : this.renderer.getTitle()); if (this.rendererData.getVideoOptions().getFrameRateTarget() == 0) { this.rendererData.getVideoOptions().setFrameRateTarget(this.frameRate); } @@ -252,4 +251,9 @@ public class G2DRendererControl implements RendererControl { public long getFrame() { return this.rendererData.getFrame(); } + + @Override + public void setRendererData(final RendererData rendererData) { + this.rendererData = rendererData; + } } diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawBackground.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawBackground.java index ecfaf32..f281be4 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawBackground.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawBackground.java @@ -14,6 +14,8 @@ import java.util.Objects; import javax.imageio.ImageIO; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.g2d.G2DRendererControl; import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor; @@ -23,6 +25,7 @@ import de.extio.game_engine.spatial2.model.ImmutableCoordI2; import de.extio.game_engine.spatial2.model.MutableCoordI2; import de.extio.game_engine.util.rng.ThreadLocalXorShift128Random; +@Component public class G2DDrawBackground extends G2DAbstractRenderingBo { private static VolatileImage BACKGROUND_IMAGE; diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawEffect.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawEffect.java index 5137fae..20c6cc2 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawEffect.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawEffect.java @@ -6,6 +6,8 @@ import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.g2d.G2DRenderer; import de.extio.game_engine.renderer.g2d.control.components.ComponentRenderingSupport; import de.extio.game_engine.renderer.model.RenderingBoLayer; @@ -17,6 +19,7 @@ import de.extio.game_engine.spatial2.model.CoordI2; import de.extio.game_engine.spatial2.model.ImmutableCoordI2; import de.extio.game_engine.spatial2.model.MutableCoordI2; +@Component public class G2DDrawEffect extends G2DAbstractRenderingBo implements DrawEffectRenderingBo { private DrawEffectRenderingBoEffects effect; diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFont.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFont.java index 1c196e1..64b3b06 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFont.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFont.java @@ -8,6 +8,8 @@ import java.awt.font.TextAttribute; import java.util.HashMap; import java.util.Map; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBo; import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBoTextAlignment; @@ -15,6 +17,7 @@ import de.extio.game_engine.spatial2.model.CoordI2; import de.extio.game_engine.spatial2.model.ImmutableCoordI2; import de.extio.game_engine.spatial2.model.MutableCoordI2; +@Component public class G2DDrawFont extends G2DAbstractRenderingBo implements DrawFontRenderingBo { private final static float FONT_SIZE_MIN = 12.0F; diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFpsHistory.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFpsHistory.java index 5ac4486..e48b6e2 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFpsHistory.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawFpsHistory.java @@ -4,8 +4,11 @@ import java.awt.Color; import java.awt.Graphics2D; import java.util.Collection; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.model.RenderingBoLayer; +@Component public class G2DDrawFpsHistory extends G2DAbstractRenderingBo { private Collection history; diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawImage.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawImage.java index 28792e2..ba75e3c 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawImage.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawImage.java @@ -12,10 +12,13 @@ import java.util.Map; import javax.imageio.ImageIO; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.g2d.G2DRenderer; import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.bo.DrawImageRenderingBo; +@Component public class G2DDrawImage extends G2DAbstractRenderingBo implements DrawImageRenderingBo { private static Map IMAGE_CACHE = new HashMap<>(); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawTest.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawTest.java index 35abb5a..1904834 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawTest.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawTest.java @@ -2,9 +2,12 @@ package de.extio.game_engine.renderer.g2d.bo.rendering; import java.awt.Graphics2D; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.bo.DrawTestRenderingBo; +@Component public class G2DDrawTest extends G2DAbstractRenderingBo implements DrawTestRenderingBo { // private static BufferedImage TILE; diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow.java index 2aa8815..82f808c 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow.java @@ -2,12 +2,15 @@ package de.extio.game_engine.renderer.g2d.bo.rendering; import java.awt.Graphics2D; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.g2d.control.components.ComponentRenderingSupport; import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo; import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor; import de.extio.game_engine.renderer.model.color.RgbaColor; +@Component public class G2DDrawWindow extends G2DAbstractRenderingBo implements DrawWindowRenderingBo { private static final RgbaColor COLOR_WINDOW = new ImmutableRgbaColor(ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getRed(), ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getGreen(), ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getBlue()); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow2.java b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow2.java index 70f8b8d..423df3f 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow2.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/bo/rendering/G2DDrawWindow2.java @@ -8,12 +8,15 @@ import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.g2d.G2DRenderer; import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo; import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor; import de.extio.game_engine.renderer.model.color.RgbaColor; +@Component public class G2DDrawWindow2 extends G2DAbstractRenderingBo implements DrawWindowRenderingBo { private static final Map CACHE = new HashMap<>(); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControl.java b/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControl.java index ddf2453..80caaf8 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControl.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControl.java @@ -8,6 +8,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo; import de.extio.game_engine.renderer.g2d.control.impl.G2DBaseControlImpl; @@ -26,6 +27,7 @@ import de.extio.game_engine.renderer.model.bo.ControlRenderingBo; import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBoTextAlignment; import de.extio.game_engine.renderer.model.color.RgbaColor; +@Component public class G2DDrawControl extends G2DAbstractRenderingBo implements ControlRenderingBo { private final static Logger LOGGER = LoggerFactory.getLogger(G2DDrawControl.class); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControlTooltip.java b/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControlTooltip.java index 2169625..1341e93 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControlTooltip.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/control/G2DDrawControlTooltip.java @@ -3,12 +3,15 @@ package de.extio.game_engine.renderer.g2d.control; import java.awt.Color; import java.awt.Graphics2D; +import org.springframework.stereotype.Component; + import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont; import de.extio.game_engine.renderer.model.RenderingBoLayer; import de.extio.game_engine.renderer.model.color.MutableRgbaColor; import de.extio.game_engine.spatial2.model.CoordI2; +@Component public class G2DDrawControlTooltip extends G2DAbstractRenderingBo { public static record TooltipRecord(CoordI2 position, String text) { diff --git a/src/main/java/de/extio/game_engine/renderer/model/options/UiOptions.java b/src/main/java/de/extio/game_engine/renderer/model/options/UiOptions.java index b7a482b..732fa9d 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/options/UiOptions.java +++ b/src/main/java/de/extio/game_engine/renderer/model/options/UiOptions.java @@ -15,7 +15,7 @@ public final class UiOptions { private boolean backgroundScrollingReverse1; - private boolean drawFps; + private boolean drawFps = true; private CoordI2 backgroundOffset0 = MutableCoordI2.create(); 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 51c577d..923ea54 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 @@ -2,7 +2,7 @@ package de.extio.game_engine.renderer.model.options; public final class VideoOptions { - private VideoOptionsVideoMode videoMode = VideoOptionsVideoMode.BORDERLESS; + private VideoOptionsVideoMode videoMode = VideoOptionsVideoMode.WINDOW; private int fullScreenNumber = -1; diff --git a/src/test/java/de/extio/game_engine/BootstrapTest.java b/src/test/java/de/extio/game_engine/BootstrapTest.java new file mode 100644 index 0000000..2ae9cdd --- /dev/null +++ b/src/test/java/de/extio/game_engine/BootstrapTest.java @@ -0,0 +1,42 @@ +package de.extio.game_engine; + +import java.util.function.Consumer; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.ContextConfiguration; + +@SpringBootTest +@ContextConfiguration(classes = BootstrapTest.TestConfig.class) +public class BootstrapTest { + + static { + System.setProperty("java.awt.headless", "false"); + } + + @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan(basePackages = "de.extio.game_engine") + static class TestConfig { + + @Bean(name = "gameEngineEventConsumer") + public Consumer eventConsumer() { + return event -> { + }; + } + } + + @Test + void contextLoads() { + try { + Thread.sleep(100000); + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + +}