2018-09-22 10:29:40 +02:00
|
|
|
package it.cavallium.warppi.gui.graphicengine.impl.swing;
|
2016-09-02 20:32:37 +02:00
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
import java.awt.GraphicsEnvironment;
|
2016-09-02 20:32:37 +02:00
|
|
|
import java.awt.image.BufferedImage;
|
2017-01-31 22:29:49 +01:00
|
|
|
import java.io.IOException;
|
2017-09-24 13:09:30 +02:00
|
|
|
import java.util.concurrent.Semaphore;
|
2016-09-02 20:32:37 +02:00
|
|
|
|
2018-09-11 19:19:24 +02:00
|
|
|
import it.cavallium.warppi.Engine;
|
2018-09-02 13:36:49 +02:00
|
|
|
import it.cavallium.warppi.StaticVars;
|
|
|
|
import it.cavallium.warppi.flow.Observable;
|
|
|
|
import it.cavallium.warppi.gui.graphicengine.BinaryFont;
|
|
|
|
import it.cavallium.warppi.gui.graphicengine.GraphicEngine;
|
|
|
|
import it.cavallium.warppi.gui.graphicengine.RenderingLoop;
|
|
|
|
import it.cavallium.warppi.gui.graphicengine.Skin;
|
2016-09-02 20:32:37 +02:00
|
|
|
|
2018-09-22 10:29:40 +02:00
|
|
|
public class SwingEngine implements GraphicEngine {
|
2016-09-02 20:32:37 +02:00
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
private SwingWindow INSTANCE;
|
2018-09-22 10:29:40 +02:00
|
|
|
public SwingRenderer r;
|
2018-09-11 01:12:54 +02:00
|
|
|
public volatile BufferedImage g;
|
|
|
|
public volatile boolean initialized;
|
|
|
|
public Semaphore exitSemaphore;
|
2016-09-02 20:32:37 +02:00
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public void setTitle(final String title) {
|
2016-09-02 20:32:37 +02:00
|
|
|
INSTANCE.setTitle(title);
|
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public void setResizable(final boolean r) {
|
2016-09-02 20:32:37 +02:00
|
|
|
INSTANCE.setResizable(r);
|
2018-09-22 11:17:30 +02:00
|
|
|
if (!r)
|
2016-09-02 20:32:37 +02:00
|
|
|
INSTANCE.setUndecorated(true);
|
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2017-01-22 13:46:38 +01:00
|
|
|
public void setDisplayMode(final int ww, final int wh) {
|
2016-09-02 20:32:37 +02:00
|
|
|
INSTANCE.setSize(ww, wh);
|
2017-07-16 13:47:29 +02:00
|
|
|
r.size = new int[] { ww, wh };
|
2018-09-22 10:29:40 +02:00
|
|
|
SwingRenderer.canvas2d = new int[ww * wh];
|
2018-08-29 00:07:45 +02:00
|
|
|
g = new BufferedImage(ww, wh, BufferedImage.TYPE_INT_RGB);
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
2017-09-24 18:47:30 +02:00
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2017-01-22 13:46:38 +01:00
|
|
|
public void create() {
|
2017-09-15 23:24:12 +02:00
|
|
|
create(null);
|
|
|
|
}
|
2017-09-24 18:47:30 +02:00
|
|
|
|
2017-09-15 23:24:12 +02:00
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public void create(final Runnable onInitialized) {
|
2018-09-22 10:29:40 +02:00
|
|
|
r = new SwingRenderer();
|
2018-09-11 01:12:54 +02:00
|
|
|
g = new BufferedImage(r.size[0], r.size[1], BufferedImage.TYPE_INT_RGB);
|
|
|
|
initialized = false;
|
|
|
|
exitSemaphore = new Semaphore(0);
|
2017-03-03 23:06:43 +01:00
|
|
|
INSTANCE = new SwingWindow(this);
|
2018-09-12 22:16:33 +02:00
|
|
|
setResizable(Engine.getPlatform().getSettings().isDebugEnabled());
|
2017-10-17 22:49:21 +02:00
|
|
|
setDisplayMode(StaticVars.screenSize[0], StaticVars.screenSize[1]);
|
2016-09-02 20:32:37 +02:00
|
|
|
INSTANCE.setVisible(true);
|
|
|
|
initialized = true;
|
2018-09-22 11:17:30 +02:00
|
|
|
if (onInitialized != null)
|
2017-09-15 23:24:12 +02:00
|
|
|
onInitialized.run();
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
2017-01-31 22:29:49 +01:00
|
|
|
|
|
|
|
@Override
|
2018-08-29 00:07:45 +02:00
|
|
|
public Observable<Integer[]> onResize() {
|
|
|
|
return INSTANCE.onResize();
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2017-01-22 13:46:38 +01:00
|
|
|
public int getWidth() {
|
2018-09-11 19:19:24 +02:00
|
|
|
return INSTANCE.getWWidth() - StaticVars.screenPos[0];
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2017-01-22 13:46:38 +01:00
|
|
|
public int getHeight() {
|
2018-09-11 19:19:24 +02:00
|
|
|
return INSTANCE.getWHeight() - StaticVars.screenPos[1];
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2017-01-22 13:46:38 +01:00
|
|
|
public void destroy() {
|
2016-09-02 20:32:37 +02:00
|
|
|
initialized = false;
|
2017-09-24 13:09:30 +02:00
|
|
|
exitSemaphore.release();
|
2016-09-02 20:32:37 +02:00
|
|
|
INSTANCE.setVisible(false);
|
|
|
|
INSTANCE.dispose();
|
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public void start(final RenderingLoop d) {
|
2017-03-03 23:06:43 +01:00
|
|
|
INSTANCE.setRenderingLoop(d);
|
2017-04-10 22:50:43 +02:00
|
|
|
final Thread th = new Thread(() -> {
|
2017-01-31 22:29:49 +01:00
|
|
|
try {
|
|
|
|
double extratime = 0;
|
|
|
|
while (initialized) {
|
2018-08-29 00:07:45 +02:00
|
|
|
final long start = System.nanoTime();
|
2017-01-31 22:29:49 +01:00
|
|
|
repaint();
|
2018-08-29 00:07:45 +02:00
|
|
|
final long end = System.nanoTime();
|
2018-09-22 11:17:30 +02:00
|
|
|
final double delta = end - start;
|
2018-08-29 00:07:45 +02:00
|
|
|
if (extratime + delta < 50 * 1000d * 1000d) {
|
|
|
|
Thread.sleep((long) Math.floor(50d - (extratime + delta) / 1000d / 1000d));
|
2017-01-31 22:29:49 +01:00
|
|
|
extratime = 0;
|
2018-09-22 11:17:30 +02:00
|
|
|
} else
|
2017-01-31 22:29:49 +01:00
|
|
|
extratime += delta - 50d;
|
|
|
|
}
|
|
|
|
} catch (final InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
});
|
2017-02-06 21:38:17 +01:00
|
|
|
th.setName("CPU rendering thread");
|
2017-01-31 22:29:49 +01:00
|
|
|
th.setDaemon(true);
|
|
|
|
th.start();
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Deprecated()
|
2017-01-22 13:46:38 +01:00
|
|
|
public void refresh() {
|
2018-09-22 11:17:30 +02:00
|
|
|
if (Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || Engine.INSTANCE.getHardwareDevice().getDisplayManager().error != null && Engine.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed())
|
2018-08-29 00:07:45 +02:00
|
|
|
INSTANCE.c.paintImmediately(0, 0, getWidth(), getHeight());
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
|
|
|
|
2017-01-31 22:29:49 +01:00
|
|
|
@Override
|
2017-01-22 13:46:38 +01:00
|
|
|
public void repaint() {
|
2017-01-31 22:29:49 +01:00
|
|
|
INSTANCE.c.repaint();
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
2016-10-03 22:00:58 +02:00
|
|
|
|
2017-01-22 13:46:38 +01:00
|
|
|
public abstract class Startable {
|
2016-09-02 20:32:37 +02:00
|
|
|
public Startable() {
|
2017-01-31 22:29:49 +01:00
|
|
|
force = false;
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
|
|
|
|
2018-09-22 11:17:30 +02:00
|
|
|
public Startable(final boolean force) {
|
2016-09-02 20:32:37 +02:00
|
|
|
this.force = force;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean force = false;
|
|
|
|
|
|
|
|
public abstract void run();
|
|
|
|
}
|
|
|
|
|
2017-01-22 13:46:38 +01:00
|
|
|
@Override
|
|
|
|
public int[] getSize() {
|
2017-07-16 13:47:29 +02:00
|
|
|
return r.size;
|
2017-01-22 13:46:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isInitialized() {
|
|
|
|
return initialized;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-09-22 10:29:40 +02:00
|
|
|
public SwingRenderer getRenderer() {
|
2017-01-31 22:29:49 +01:00
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public BinaryFont loadFont(final String fontName) throws IOException {
|
2018-09-22 10:29:40 +02:00
|
|
|
return new SwingFont(fontName);
|
2017-11-19 22:58:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public BinaryFont loadFont(final String path, final String fontName) throws IOException {
|
2018-09-22 10:29:40 +02:00
|
|
|
return new SwingFont(path, fontName);
|
2017-01-31 22:29:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-09-22 11:17:30 +02:00
|
|
|
public Skin loadSkin(final String file) throws IOException {
|
2018-09-22 10:29:40 +02:00
|
|
|
return new SwingSkin(file);
|
2017-01-31 22:29:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2017-09-24 18:47:30 +02:00
|
|
|
public void waitForExit() {
|
2017-01-31 22:29:49 +01:00
|
|
|
try {
|
2017-09-24 13:09:30 +02:00
|
|
|
exitSemaphore.acquire();
|
2018-05-12 21:18:29 +02:00
|
|
|
} catch (final InterruptedException e) {}
|
2017-01-31 22:29:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isSupported() {
|
2018-09-22 11:17:30 +02:00
|
|
|
if (StaticVars.startupArguments.isEngineForced() && StaticVars.startupArguments.isCPUEngineForced() == false)
|
2017-09-24 18:47:30 +02:00
|
|
|
return false;
|
2018-09-27 17:41:31 +02:00
|
|
|
return (GraphicsEnvironment.isHeadless()) == false;
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|
2017-02-06 21:38:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean doesRefreshPauses() {
|
|
|
|
return true;
|
|
|
|
}
|
2018-09-11 19:19:24 +02:00
|
|
|
|
2018-09-22 11:17:30 +02:00
|
|
|
public void setAlphaChanged(final boolean val) {
|
|
|
|
INSTANCE.setAlphaChanged(val);
|
2018-09-11 19:19:24 +02:00
|
|
|
}
|
|
|
|
|
2018-09-22 11:17:30 +02:00
|
|
|
public void setShiftChanged(final boolean val) {
|
|
|
|
INSTANCE.setShiftChanged(val);
|
2018-09-11 19:19:24 +02:00
|
|
|
}
|
2016-09-02 20:32:37 +02:00
|
|
|
}
|