Configuration for G2D rendering; Add RendererLoop; Bootstrapping
This commit is contained in:
@@ -16,4 +16,6 @@ public interface Renderer {
|
|||||||
|
|
||||||
void setTitle(final String title);
|
void setTitle(final String title);
|
||||||
|
|
||||||
|
void setRendererData(final RendererData rendererData);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<RenderingBo> renderingBoImplementations) {
|
||||||
|
final Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> mapping = new HashMap<>();
|
||||||
|
for (final var impl : renderingBoImplementations) {
|
||||||
|
for (final var interf : impl.getClass().getInterfaces()) {
|
||||||
|
if (RenderingBo.class.isAssignableFrom(interf)) {
|
||||||
|
mapping.put((Class<? extends RenderingBo>) interf, impl.getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new RenderingBoPoolImpl(mapping);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public RendererData rendererData(final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, @Qualifier("gameEngineEventConsumer") final Consumer<Object> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -39,5 +39,7 @@ public interface RendererControl {
|
|||||||
void setFrameRate(int frameRate);
|
void setFrameRate(int frameRate);
|
||||||
|
|
||||||
long getFrame();
|
long getFrame();
|
||||||
|
|
||||||
|
void setRendererData(final RendererData rendererData);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package de.extio.game_engine.renderer;
|
package de.extio.game_engine.renderer;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.model.options.UiOptions;
|
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 {
|
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<Object> eventConsumer;
|
||||||
|
|
||||||
private final UiOptions uiOptions = new UiOptions();
|
private final UiOptions uiOptions = new UiOptions();
|
||||||
|
|
||||||
private final VideoOptions videoOptions = new VideoOptions();
|
private final VideoOptions videoOptions = new VideoOptions();
|
||||||
|
|
||||||
private long frame;
|
private final AtomicLong frame = new AtomicLong();
|
||||||
|
|
||||||
private Consumer<Object> eventConsumer;
|
private RendererLoop rendererLoop;
|
||||||
|
|
||||||
|
public RendererData(final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final Consumer<Object> eventConsumer) {
|
||||||
|
this.renderer = renderer;
|
||||||
|
this.rendererControl = rendererControl;
|
||||||
|
this.renderingBoPool = renderingBoPool;
|
||||||
|
this.eventConsumer = eventConsumer;
|
||||||
|
}
|
||||||
|
|
||||||
public RendererControl getRendererControl() {
|
public RendererControl getRendererControl() {
|
||||||
return this.rendererControl;
|
return this.rendererControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRendererControl(final RendererControl rendererControl) {
|
|
||||||
this.rendererControl = rendererControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UiOptions getUiOptions() {
|
public UiOptions getUiOptions() {
|
||||||
return this.uiOptions;
|
return this.uiOptions;
|
||||||
}
|
}
|
||||||
@@ -37,26 +43,18 @@ public class RendererData {
|
|||||||
return this.renderingBoPool;
|
return this.renderingBoPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRenderingBoPool(final RenderingBoPool renderingBoPool) {
|
|
||||||
this.renderingBoPool = renderingBoPool;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getFrame() {
|
public long getFrame() {
|
||||||
return this.frame;
|
return this.frame.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFrame(final long frame) {
|
public long nextFrame() {
|
||||||
this.frame = frame;
|
return this.frame.incrementAndGet();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Renderer getRenderer() {
|
public Renderer getRenderer() {
|
||||||
return this.renderer;
|
return this.renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRenderer(final Renderer renderer) {
|
|
||||||
this.renderer = renderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public VideoOptions getVideoOptions() {
|
public VideoOptions getVideoOptions() {
|
||||||
return this.videoOptions;
|
return this.videoOptions;
|
||||||
}
|
}
|
||||||
@@ -64,9 +62,13 @@ public class RendererData {
|
|||||||
public Consumer<Object> getEventConsumer() {
|
public Consumer<Object> getEventConsumer() {
|
||||||
return this.eventConsumer;
|
return this.eventConsumer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEventConsumer(final Consumer<Object> eventConsumer) {
|
public void setRendererLoop(final RendererLoop rendererLoop) {
|
||||||
this.eventConsumer = eventConsumer;
|
this.rendererLoop = rendererLoop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RendererLoop getRendererLoop() {
|
||||||
|
return this.rendererLoop;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<Object> 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -21,4 +21,6 @@ public interface RenderingBoPool {
|
|||||||
*/
|
*/
|
||||||
void release(RenderingBo obj);
|
void release(RenderingBo obj);
|
||||||
|
|
||||||
|
|
||||||
|
void setRendererData(RendererData rendererData);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,7 @@ import de.extio.game_engine.renderer.model.RenderingBo;
|
|||||||
|
|
||||||
public class RenderingBoPoolImpl implements RenderingBoPool {
|
public class RenderingBoPoolImpl implements RenderingBoPool {
|
||||||
|
|
||||||
public final static Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> INTERFACE_TO_BO_G2D = new HashMap<>();
|
public final Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> mapping;
|
||||||
|
|
||||||
private final RendererData rendererData;
|
|
||||||
|
|
||||||
private final Map<Class<? extends RenderingBo>, Stack<RenderingBo>> pool = new HashMap<>();
|
private final Map<Class<? extends RenderingBo>, Stack<RenderingBo>> pool = new HashMap<>();
|
||||||
|
|
||||||
@@ -19,6 +17,8 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
|
|||||||
|
|
||||||
private final LastReverseMapping lastReverseMapping = new LastReverseMapping();
|
private final LastReverseMapping lastReverseMapping = new LastReverseMapping();
|
||||||
|
|
||||||
|
private RendererData rendererData;
|
||||||
|
|
||||||
private static class LastMapping {
|
private static class LastMapping {
|
||||||
|
|
||||||
volatile Class<? extends RenderingBo> clazz;
|
volatile Class<? extends RenderingBo> clazz;
|
||||||
@@ -34,11 +34,11 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
|
|||||||
|
|
||||||
volatile Stack<RenderingBo> pooled;
|
volatile Stack<RenderingBo> pooled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RenderingBoPoolImpl(final RendererData rendererData) {
|
public RenderingBoPoolImpl(final Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> mapping) {
|
||||||
this.rendererData = rendererData;
|
this.mapping = mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <T extends RenderingBo> T acquire(final Class<T> clazz) {
|
public <T extends RenderingBo> T acquire(final Class<T> clazz) {
|
||||||
@@ -54,7 +54,7 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
|
|||||||
impl = clazz;
|
impl = clazz;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
impl = INTERFACE_TO_BO_G2D.get(clazz);
|
impl = mapping.get(clazz);
|
||||||
if (impl == null) {
|
if (impl == null) {
|
||||||
throw new IllegalArgumentException(clazz.getSimpleName() + " not mapped");
|
throw new IllegalArgumentException(clazz.getSimpleName() + " not mapped");
|
||||||
}
|
}
|
||||||
@@ -114,5 +114,10 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRendererData(final RendererData rendererData) {
|
||||||
|
this.rendererData = rendererData;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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.CoordI2;
|
||||||
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
|
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public class G2DMainFrame extends Frame {
|
public class G2DMainFrame extends Frame {
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(G2DMainFrame.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(G2DMainFrame.class);
|
||||||
@@ -62,8 +61,10 @@ public class G2DMainFrame extends Frame {
|
|||||||
this.setBackground(Color.BLACK);
|
this.setBackground(Color.BLACK);
|
||||||
|
|
||||||
try (var in = this.getClass().getClassLoader().getResourceAsStream("icon.png")) {
|
try (var in = this.getClass().getClassLoader().getResourceAsStream("icon.png")) {
|
||||||
final var icon = ImageIO.read(in);
|
if (in != null) {
|
||||||
this.setIconImage(icon);
|
final var icon = ImageIO.read(in);
|
||||||
|
this.setIconImage(icon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (final IOException e) {
|
catch (final IOException e) {
|
||||||
LOGGER.error(e.getMessage(), e);
|
LOGGER.error(e.getMessage(), e);
|
||||||
@@ -93,7 +94,7 @@ public class G2DMainFrame extends Frame {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void windowClosing(final WindowEvent e) {
|
public void windowClosing(final WindowEvent e) {
|
||||||
System.exit(0);
|
G2DMainFrame.this.rendererData.getRendererLoop().shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,25 +19,15 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
import de.extio.game_engine.renderer.Renderer;
|
import de.extio.game_engine.renderer.Renderer;
|
||||||
import de.extio.game_engine.renderer.RendererData;
|
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.G2DAbstractRenderingBo;
|
||||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawBackground;
|
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.G2DDrawFpsHistory;
|
||||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawImage;
|
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.G2DDrawControl;
|
||||||
import de.extio.game_engine.renderer.g2d.control.G2DDrawControlTooltip;
|
import de.extio.game_engine.renderer.g2d.control.G2DDrawControlTooltip;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBo;
|
import de.extio.game_engine.renderer.model.RenderingBo;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
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.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.color.RgbaColor;
|
||||||
import de.extio.game_engine.renderer.model.event.TakeScreenshotEvent;
|
import de.extio.game_engine.renderer.model.event.TakeScreenshotEvent;
|
||||||
import de.extio.game_engine.util.RingBuffer;
|
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 static final long SLEEP_PRECISION = TimeUnit.MILLISECONDS.toNanos(3);
|
||||||
|
|
||||||
|
private final RingBuffer<Integer> fpsHistory = new RingBuffer<>(90);
|
||||||
|
|
||||||
private volatile G2DMainFrame mainFrame;
|
private volatile G2DMainFrame mainFrame;
|
||||||
|
|
||||||
private final RendererData rendererData;
|
private RendererData rendererData;
|
||||||
|
|
||||||
private final RingBuffer<Integer> fpsHistory = new RingBuffer<>(90);
|
|
||||||
|
|
||||||
private long fpsMeasurement;
|
private long fpsMeasurement;
|
||||||
|
|
||||||
@@ -70,28 +60,20 @@ public class G2DRenderer implements Renderer {
|
|||||||
|
|
||||||
private volatile boolean takeScreenshot;
|
private volatile boolean takeScreenshot;
|
||||||
|
|
||||||
public G2DRenderer(final RendererData rendererData) {
|
public G2DRenderer() {
|
||||||
LOGGER.info("ctor");
|
LOGGER.info("ctor");
|
||||||
|
|
||||||
System.setProperty("sun.java2d.uiScale", "1");
|
System.setProperty("sun.java2d.uiScale", "1");
|
||||||
System.setProperty("awt.nativeDoubleBuffering", "true");
|
System.setProperty("awt.nativeDoubleBuffering", "true");
|
||||||
System.setProperty("awt.useSystemAAFontSettings", "on");
|
System.setProperty("awt.useSystemAAFontSettings", "on");
|
||||||
System.setProperty("swing.aatext", "true");
|
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
|
@Override
|
||||||
public void show() {
|
public void show() {
|
||||||
try {
|
try {
|
||||||
|
LOGGER.info("show()");
|
||||||
|
|
||||||
EventQueue.invokeAndWait(() -> {
|
EventQueue.invokeAndWait(() -> {
|
||||||
this.rendererData.getRendererControl().applyVideoOptions();
|
this.rendererData.getRendererControl().applyVideoOptions();
|
||||||
});
|
});
|
||||||
@@ -316,7 +298,7 @@ public class G2DRenderer implements Renderer {
|
|||||||
@Override
|
@Override
|
||||||
public void setTitle(final String title) {
|
public void setTitle(final String title) {
|
||||||
this.title = title;
|
this.title = title;
|
||||||
if (this.mainFrame != null) {
|
if (this.mainFrame != null && title != null) {
|
||||||
this.mainFrame.setTitle(title);
|
this.mainFrame.setTitle(title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,4 +306,9 @@ public class G2DRenderer implements Renderer {
|
|||||||
public String getTitle() {
|
public String getTitle() {
|
||||||
return this.title;
|
return this.title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRendererData(final RendererData rendererData) {
|
||||||
|
this.rendererData = rendererData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ public class G2DRendererControl implements RendererControl {
|
|||||||
|
|
||||||
private final static CoordI2 NO_SCALING_UPPER_LIMIT = ImmutableCoordI2.create(2560, 1440);
|
private final static CoordI2 NO_SCALING_UPPER_LIMIT = ImmutableCoordI2.create(2560, 1440);
|
||||||
|
|
||||||
private final RendererData rendererData;
|
|
||||||
|
|
||||||
private final G2DRenderer renderer;
|
private final G2DRenderer renderer;
|
||||||
|
|
||||||
|
private RendererData rendererData;
|
||||||
|
|
||||||
private CoordI2 absoluteViewportDimension = REFERENCE_RESOLUTION;
|
private CoordI2 absoluteViewportDimension = REFERENCE_RESOLUTION;
|
||||||
|
|
||||||
private CoordI2 effectiveViewportDimension = REFERENCE_RESOLUTION;
|
private CoordI2 effectiveViewportDimension = REFERENCE_RESOLUTION;
|
||||||
@@ -37,9 +37,8 @@ public class G2DRendererControl implements RendererControl {
|
|||||||
|
|
||||||
private volatile long videoOptionsAppliedAt;
|
private volatile long videoOptionsAppliedAt;
|
||||||
|
|
||||||
public G2DRendererControl(final G2DRenderer renderer, final RendererData rendererData) {
|
public G2DRendererControl(final G2DRenderer renderer) {
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
this.rendererData = rendererData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -82,7 +81,7 @@ public class G2DRendererControl implements RendererControl {
|
|||||||
else {
|
else {
|
||||||
mainFrame.windowed();
|
mainFrame.windowed();
|
||||||
}
|
}
|
||||||
mainFrame.setTitle(this.renderer.getTitle());
|
mainFrame.setTitle(this.renderer.getTitle() == null ? "" : this.renderer.getTitle());
|
||||||
if (this.rendererData.getVideoOptions().getFrameRateTarget() == 0) {
|
if (this.rendererData.getVideoOptions().getFrameRateTarget() == 0) {
|
||||||
this.rendererData.getVideoOptions().setFrameRateTarget(this.frameRate);
|
this.rendererData.getVideoOptions().setFrameRateTarget(this.frameRate);
|
||||||
}
|
}
|
||||||
@@ -252,4 +251,9 @@ public class G2DRendererControl implements RendererControl {
|
|||||||
public long getFrame() {
|
public long getFrame() {
|
||||||
return this.rendererData.getFrame();
|
return this.rendererData.getFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRendererData(final RendererData rendererData) {
|
||||||
|
this.rendererData = rendererData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import java.util.Objects;
|
|||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.g2d.G2DRendererControl;
|
import de.extio.game_engine.renderer.g2d.G2DRendererControl;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||||
import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor;
|
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.spatial2.model.MutableCoordI2;
|
||||||
import de.extio.game_engine.util.rng.ThreadLocalXorShift128Random;
|
import de.extio.game_engine.util.rng.ThreadLocalXorShift128Random;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawBackground extends G2DAbstractRenderingBo {
|
public class G2DDrawBackground extends G2DAbstractRenderingBo {
|
||||||
|
|
||||||
private static VolatileImage BACKGROUND_IMAGE;
|
private static VolatileImage BACKGROUND_IMAGE;
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import java.awt.Graphics2D;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.g2d.G2DRenderer;
|
import de.extio.game_engine.renderer.g2d.G2DRenderer;
|
||||||
import de.extio.game_engine.renderer.g2d.control.components.ComponentRenderingSupport;
|
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.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.ImmutableCoordI2;
|
||||||
import de.extio.game_engine.spatial2.model.MutableCoordI2;
|
import de.extio.game_engine.spatial2.model.MutableCoordI2;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawEffect extends G2DAbstractRenderingBo implements DrawEffectRenderingBo {
|
public class G2DDrawEffect extends G2DAbstractRenderingBo implements DrawEffectRenderingBo {
|
||||||
|
|
||||||
private DrawEffectRenderingBoEffects effect;
|
private DrawEffectRenderingBoEffects effect;
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import java.awt.font.TextAttribute;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
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.DrawFontRenderingBo;
|
||||||
import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBoTextAlignment;
|
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.ImmutableCoordI2;
|
||||||
import de.extio.game_engine.spatial2.model.MutableCoordI2;
|
import de.extio.game_engine.spatial2.model.MutableCoordI2;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawFont extends G2DAbstractRenderingBo implements DrawFontRenderingBo {
|
public class G2DDrawFont extends G2DAbstractRenderingBo implements DrawFontRenderingBo {
|
||||||
|
|
||||||
private final static float FONT_SIZE_MIN = 12.0F;
|
private final static float FONT_SIZE_MIN = 12.0F;
|
||||||
|
|||||||
@@ -4,8 +4,11 @@ import java.awt.Color;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawFpsHistory extends G2DAbstractRenderingBo {
|
public class G2DDrawFpsHistory extends G2DAbstractRenderingBo {
|
||||||
|
|
||||||
private Collection<Integer> history;
|
private Collection<Integer> history;
|
||||||
|
|||||||
@@ -12,10 +12,13 @@ import java.util.Map;
|
|||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.g2d.G2DRenderer;
|
import de.extio.game_engine.renderer.g2d.G2DRenderer;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||||
import de.extio.game_engine.renderer.model.bo.DrawImageRenderingBo;
|
import de.extio.game_engine.renderer.model.bo.DrawImageRenderingBo;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawImage extends G2DAbstractRenderingBo implements DrawImageRenderingBo {
|
public class G2DDrawImage extends G2DAbstractRenderingBo implements DrawImageRenderingBo {
|
||||||
|
|
||||||
private static Map<String, CachedImage> IMAGE_CACHE = new HashMap<>();
|
private static Map<String, CachedImage> IMAGE_CACHE = new HashMap<>();
|
||||||
|
|||||||
@@ -2,9 +2,12 @@ package de.extio.game_engine.renderer.g2d.bo.rendering;
|
|||||||
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||||
import de.extio.game_engine.renderer.model.bo.DrawTestRenderingBo;
|
import de.extio.game_engine.renderer.model.bo.DrawTestRenderingBo;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawTest extends G2DAbstractRenderingBo implements DrawTestRenderingBo {
|
public class G2DDrawTest extends G2DAbstractRenderingBo implements DrawTestRenderingBo {
|
||||||
|
|
||||||
// private static BufferedImage TILE;
|
// private static BufferedImage TILE;
|
||||||
|
|||||||
@@ -2,12 +2,15 @@ package de.extio.game_engine.renderer.g2d.bo.rendering;
|
|||||||
|
|
||||||
import java.awt.Graphics2D;
|
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.g2d.control.components.ComponentRenderingSupport;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||||
import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo;
|
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.ImmutableRgbaColor;
|
||||||
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawWindow extends G2DAbstractRenderingBo implements DrawWindowRenderingBo {
|
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());
|
private static final RgbaColor COLOR_WINDOW = new ImmutableRgbaColor(ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getRed(), ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getGreen(), ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getBlue());
|
||||||
|
|||||||
@@ -8,12 +8,15 @@ import java.awt.image.BufferedImage;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import de.extio.game_engine.renderer.g2d.G2DRenderer;
|
import de.extio.game_engine.renderer.g2d.G2DRenderer;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||||
import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo;
|
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.ImmutableRgbaColor;
|
||||||
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawWindow2 extends G2DAbstractRenderingBo implements DrawWindowRenderingBo {
|
public class G2DDrawWindow2 extends G2DAbstractRenderingBo implements DrawWindowRenderingBo {
|
||||||
|
|
||||||
private static final Map<Long, G2DWindowCacheEntry> CACHE = new HashMap<>();
|
private static final Map<Long, G2DWindowCacheEntry> CACHE = new HashMap<>();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.bo.rendering.G2DAbstractRenderingBo;
|
||||||
import de.extio.game_engine.renderer.g2d.control.impl.G2DBaseControlImpl;
|
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.bo.DrawFontRenderingBoTextAlignment;
|
||||||
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawControl extends G2DAbstractRenderingBo implements ControlRenderingBo {
|
public class G2DDrawControl extends G2DAbstractRenderingBo implements ControlRenderingBo {
|
||||||
|
|
||||||
private final static Logger LOGGER = LoggerFactory.getLogger(G2DDrawControl.class);
|
private final static Logger LOGGER = LoggerFactory.getLogger(G2DDrawControl.class);
|
||||||
|
|||||||
@@ -3,12 +3,15 @@ package de.extio.game_engine.renderer.g2d.control;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Graphics2D;
|
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.G2DAbstractRenderingBo;
|
||||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
|
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.RenderingBoLayer;
|
||||||
import de.extio.game_engine.renderer.model.color.MutableRgbaColor;
|
import de.extio.game_engine.renderer.model.color.MutableRgbaColor;
|
||||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||||
|
|
||||||
|
@Component
|
||||||
public class G2DDrawControlTooltip extends G2DAbstractRenderingBo {
|
public class G2DDrawControlTooltip extends G2DAbstractRenderingBo {
|
||||||
|
|
||||||
public static record TooltipRecord(CoordI2 position, String text) {
|
public static record TooltipRecord(CoordI2 position, String text) {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public final class UiOptions {
|
|||||||
|
|
||||||
private boolean backgroundScrollingReverse1;
|
private boolean backgroundScrollingReverse1;
|
||||||
|
|
||||||
private boolean drawFps;
|
private boolean drawFps = true;
|
||||||
|
|
||||||
private CoordI2 backgroundOffset0 = MutableCoordI2.create();
|
private CoordI2 backgroundOffset0 = MutableCoordI2.create();
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package de.extio.game_engine.renderer.model.options;
|
|||||||
|
|
||||||
public final class VideoOptions {
|
public final class VideoOptions {
|
||||||
|
|
||||||
private VideoOptionsVideoMode videoMode = VideoOptionsVideoMode.BORDERLESS;
|
private VideoOptionsVideoMode videoMode = VideoOptionsVideoMode.WINDOW;
|
||||||
|
|
||||||
private int fullScreenNumber = -1;
|
private int fullScreenNumber = -1;
|
||||||
|
|
||||||
|
|||||||
42
src/test/java/de/extio/game_engine/BootstrapTest.java
Normal file
42
src/test/java/de/extio/game_engine/BootstrapTest.java
Normal file
@@ -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<Object> eventConsumer() {
|
||||||
|
return event -> {
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void contextLoads() {
|
||||||
|
try {
|
||||||
|
Thread.sleep(100000);
|
||||||
|
} catch (final InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user