Touch device updated

This commit is contained in:
Andrea Cavalli 2018-07-28 23:26:07 +02:00
parent 6e327f0eb1
commit 84590f6f20
12 changed files with 251 additions and 127 deletions

View File

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="test" value="true"/>
@ -13,13 +17,13 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="org/warp/picalculator/gui/graphicengine/html/*" kind="src" output="target/classes" path="src/main/java">
<classpathentry excluding="org/warp/picalculator/gui/graphicengine/cpu/CPUEngine|org/warp/picalculator/gui/graphicengine/cpu/CPURenderer|org/warp/picalculator/gui/graphicengine/cpu/SwingWindow|org/warp/picalculator/gui/graphicengine/gpu/*|org/warp/picalculator/gui/graphicengine/headless24bit/*|org/warp/picalculator/gui/graphicengine/headless256/*|org/warp/picalculator/gui/graphicengine/headless8/*|org/warp/picalculator/gui/graphicengine/framebuffer/*" kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/rules">
<classpathentry excluding="org/warp/picalculator/gui/graphicengine/cpu/CPUEngine|org/warp/picalculator/gui/graphicengine/cpu/CPURenderer|org/warp/picalculator/gui/graphicengine/cpu/SwingWindow|org/warp/picalculator/gui/graphicengine/gpu/*|org/warp/picalculator/gui/graphicengine/headless24bit/*|org/warp/picalculator/gui/graphicengine/headless256/*|org/warp/picalculator/gui/graphicengine/headless8/*|org/warp/picalculator/gui/graphicengine/framebuffer/*" kind="src" output="target/classes" path="src/main/rules">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
@ -30,7 +34,7 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="org/warp/picalculator/gui/graphicengine/html/*" kind="src" output="target/classes" path="src/jar-specific/java">
<classpathentry excluding="org/warp/picalculator/gui/graphicengine/cpu/CPUEngine|org/warp/picalculator/gui/graphicengine/cpu/CPURenderer|org/warp/picalculator/gui/graphicengine/cpu/SwingWindow|org/warp/picalculator/gui/graphicengine/gpu/*|org/warp/picalculator/gui/graphicengine/headless24bit/*|org/warp/picalculator/gui/graphicengine/headless256/*|org/warp/picalculator/gui/graphicengine/headless8/*|org/warp/picalculator/gui/graphicengine/framebuffer/*" kind="src" output="target/classes" path="src/js-specific/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>

View File

@ -1,4 +1,4 @@
activeProfiles=jarprofile
activeProfiles=jsprofile
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@ -31,6 +31,10 @@
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>jitpack.io</id> <!-- JitPack allows github repo to be used as a maven repo -->
<url>https://jitpack.io</url> <!-- For documentation: http://jitpack.io/ -->
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>

View File

@ -114,7 +114,13 @@ public class StorageUtils {
throw e;
}
} else {
return Files.newInputStream(Paths.get(string.substring(1)));
if (string.length() > 0) {
char ch = string.charAt(0);
if (ch == '/' || ch == File.separatorChar) {
string = string.substring(1);
}
}
return Files.newInputStream(Paths.get(string));
}
}

View File

@ -9,6 +9,7 @@ import org.warp.picalculator.device.HardwareTouchDevice;
import org.warp.picalculator.device.InputManager;
import org.warp.picalculator.device.Keyboard;
import org.warp.picalculator.device.PIHardwareDisplay;
import org.warp.picalculator.device.PIHardwareTouchDevice;
import org.warp.picalculator.gui.CalculatorHUD;
import org.warp.picalculator.gui.DisplayManager;
import org.warp.picalculator.gui.HUD;
@ -29,26 +30,13 @@ public class Main {
System.out.println("WarpPI Calculator");
instance = this;
Main.args = args;
ClassUtils.classLoader = this.getClass();
// ClassUtils.classLoader = this.getClass();
beforeStart();
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
PlatformUtils.setThreadName(Thread.currentThread(), "Main thread");
DisplayManager dm = new DisplayManager(disp, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)");
Keyboard k = new Keyboard();
HardwareTouchDevice touch = new HardwareTouchDevice() {
@Override
public boolean getInvertedY() {
return false;
}
@Override
public boolean getInvertedXY() {
return false;
}
@Override
public boolean getInvertedX() {
return false;
}
};
HardwareTouchDevice touch = new PIHardwareTouchDevice(false,false,false);
InputManager im = new InputManager(k, touch);
HardwareDevice hardwareDevice = new HardwareDevice(dm, im);
hardwareDevice.setup(() -> {

View File

@ -1,10 +1,14 @@
package org.warp.picalculator.device;
public interface HardwareTouchDevice {
import org.warp.picalculator.event.TouchEventListener;
import org.warp.picalculator.event.TouchPoint;
public interface HardwareTouchDevice extends TouchEventListener {
public boolean getInvertedXY();
public boolean getInvertedX();
public boolean getInvertedY();
public default void setInvertedXY() {}
public default void setInvertedX() {}
public default void setInvertedY() {}
public TouchPoint makePoint(long id, float x, float y, int maxX, int maxY, float radiusX, float radiusY, float force, float rotationAngle);
}

View File

@ -0,0 +1,111 @@
package org.warp.picalculator.device;
import org.warp.picalculator.event.TouchCancelEvent;
import org.warp.picalculator.event.TouchEndEvent;
import org.warp.picalculator.event.TouchMoveEvent;
import org.warp.picalculator.event.TouchPoint;
import org.warp.picalculator.event.TouchStartEvent;
import org.warp.picalculator.gui.screens.Screen;
public class PIHardwareTouchDevice implements HardwareTouchDevice {
private final boolean invertXY, invertX, invertY;
public PIHardwareTouchDevice(boolean invertXY, boolean invertX, boolean invertY) {
this.invertXY = invertXY;
this.invertX = invertX;
this.invertY = invertY;
}
@Override
public boolean onTouchStart(TouchStartEvent e) {
final Screen scr = HardwareDevice.INSTANCE.getDisplayManager().getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchStart(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
HardwareDevice.INSTANCE.getDisplayManager().forceRefresh = true;
}
return true;
}
@Override
public boolean onTouchEnd(TouchEndEvent e) {
final Screen scr = HardwareDevice.INSTANCE.getDisplayManager().getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchEnd(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
HardwareDevice.INSTANCE.getDisplayManager().forceRefresh = true;
}
return true;
}
@Override
public boolean onTouchCancel(TouchCancelEvent e) {
final Screen scr = HardwareDevice.INSTANCE.getDisplayManager().getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchCancel(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
HardwareDevice.INSTANCE.getDisplayManager().forceRefresh = true;
}
return true;
}
@Override
public boolean onTouchMove(TouchMoveEvent e) {
final Screen scr = HardwareDevice.INSTANCE.getDisplayManager().getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchMove(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
HardwareDevice.INSTANCE.getDisplayManager().forceRefresh = true;
}
return true;
}
@Override
public boolean getInvertedXY() {
return invertXY;
}
@Override
public boolean getInvertedX() {
return invertX;
}
@Override
public boolean getInvertedY() {
return invertY;
}
@Override
public TouchPoint makePoint(long id, float x, float y, int screenWidth, int screenHeight, float radiusX, float radiusY, float force, float rotationAngle) {
if (getInvertedXY()) {
double oldX = x;
double oldY = y;
x = (float) (oldY * ((double)screenWidth)/((double)screenHeight));
y = (float) (oldX * ((double)screenHeight)/((double)screenWidth));
}
if (getInvertedX()) {
x = screenWidth - x;
}
if (getInvertedY()) {
y = screenHeight - y;
}
return new TouchPoint(id, x, y, radiusX, radiusY, force, rotationAngle);
}
}

View File

@ -31,7 +31,7 @@ import org.warp.picalculator.gui.screens.Screen;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
public final class DisplayManager implements RenderingLoop, TouchEventListener {
public final class DisplayManager implements RenderingLoop {
private HardwareDevice device;
private float brightness;
@ -50,14 +50,14 @@ public final class DisplayManager implements RenderingLoop, TouchEventListener {
private Screen screen;
private final HUD hud;
private final String initialTitle;
private final Screen initialScreen;
private Screen initialScreen;
public DSemaphore screenChange = new DSemaphore(0);
public String displayDebugString;
public ObjectArrayList<GUIErrorMessage> errorMessages;
/**
* Set to true when an event is fired
*/
private boolean forceRefresh;
public boolean forceRefresh;
public DisplayManager(HardwareDisplay monitor, HUD hud, Screen screen, String title) {
engine = chooseGraphicEngine();
@ -87,7 +87,6 @@ public final class DisplayManager implements RenderingLoop, TouchEventListener {
DSystem.exit(0);
}
setScreen(initialScreen);
try {
engine.create();
renderer = engine.getRenderer();
@ -393,6 +392,10 @@ public final class DisplayManager implements RenderingLoop, TouchEventListener {
load_fonts();
try {
if (initialScreen != null) {
setScreen(initialScreen);
initialScreen = null;
}
screen.initialize();
} catch (final Exception e) {
e.printStackTrace();
@ -529,64 +532,4 @@ public final class DisplayManager implements RenderingLoop, TouchEventListener {
public void waitForExit() {
engine.waitForExit();
}
@Override
public boolean onTouchStart(TouchStartEvent e) {
final Screen scr = getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchStart(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
forceRefresh = true;
}
return true;
}
@Override
public boolean onTouchEnd(TouchEndEvent e) {
final Screen scr = getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchEnd(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
forceRefresh = true;
}
return true;
}
@Override
public boolean onTouchCancel(TouchCancelEvent e) {
final Screen scr = getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchCancel(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
forceRefresh = true;
}
return true;
}
@Override
public boolean onTouchMove(TouchMoveEvent e) {
final Screen scr = getScreen();
boolean refresh = false;
if (scr != null && scr.initialized && scr.onTouchMove(e)) {
refresh = true;
} else {
//Default behavior
}
if (refresh) {
forceRefresh = true;
}
return true;
}
}

View File

@ -3,12 +3,16 @@ package org.warp.picalculator.gui.graphicengine.cpu;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
@ -19,9 +23,15 @@ import org.warp.picalculator.StaticVars;
import org.warp.picalculator.Utils;
import org.warp.picalculator.device.HardwareDevice;
import org.warp.picalculator.device.Keyboard;
import org.warp.picalculator.event.TouchEndEvent;
import org.warp.picalculator.event.TouchMoveEvent;
import org.warp.picalculator.event.TouchPoint;
import org.warp.picalculator.event.TouchStartEvent;
import org.warp.picalculator.gui.DisplayManager;
import org.warp.picalculator.gui.graphicengine.RenderingLoop;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
public class SwingWindow extends JFrame {
private static final long serialVersionUID = 2945898937634075491L;
public CustomCanvas c;
@ -99,6 +109,49 @@ public class SwingWindow extends JFrame {
}
});
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
final Insets wp = SwingWindow.this.getInsets();
TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0);
ObjectArrayList<TouchPoint> touches = new ObjectArrayList<>();
ObjectArrayList<TouchPoint> changedTouches = new ObjectArrayList<>();
touches.add(p);
changedTouches.add(p);
TouchMoveEvent tse = new TouchMoveEvent(changedTouches, touches);
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchMove(tse);
}
@Override
public void mouseMoved(MouseEvent e) {
}
});
addMouseListener(new MouseListener() {
@Override public void mouseClicked(MouseEvent e) {
}
@Override public void mousePressed(MouseEvent e) {
final Insets wp = SwingWindow.this.getInsets();
TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0);
ObjectArrayList<TouchPoint> touches = new ObjectArrayList<>();
ObjectArrayList<TouchPoint> changedTouches = new ObjectArrayList<>();
touches.add(p);
changedTouches.add(p);
TouchStartEvent tse = new TouchStartEvent(changedTouches, touches);
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchStart(tse);
}
@Override public void mouseReleased(MouseEvent e) {
final Insets wp = SwingWindow.this.getInsets();
TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0);
ObjectArrayList<TouchPoint> touches = new ObjectArrayList<>();
ObjectArrayList<TouchPoint> changedTouches = new ObjectArrayList<>();
changedTouches.add(p);
TouchEndEvent tse = new TouchEndEvent(changedTouches, touches);
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchEnd(tse);
}
@Override public void mouseEntered(MouseEvent e) {
}
@Override public void mouseExited(MouseEvent e) {
}
});
}
@Override

View File

@ -54,7 +54,7 @@ public class GPUEngine implements GraphicEngine {
}
wnd.window.setResizable(r);
wnd.window.setUndecorated(!r);
wnd.window.setPointerVisible(true);
wnd.window.setPointerVisible(r);
}
@Override

View File

@ -148,6 +148,12 @@ public class GPURenderer implements Renderer {
public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth,
float uvHeight) {
enableTexture();
if (uvWidth < 0) {
uvX -= uvWidth;
}
if (uvHeight < 0) {
uvY -= uvHeight;
}
uvWidth /= currentTexWidth;
uvX /= currentTexWidth;
uvHeight /= currentTexHeight;

View File

@ -297,22 +297,22 @@ class NEWTWindow implements GLEventListener {
@Override
public void mouseClicked(MouseEvent e) {
List<TouchPoint> newPoints = new ObjectArrayList<>();
List<TouchPoint> changedPoints = new ObjectArrayList<>();
List<TouchPoint> oldPoints = touches;
int[] xs = e.getAllX();
int[] ys = e.getAllY();
float[] ps = e.getAllPressures();
short[] is = e.getAllPointerIDs();
for (int i = 0; i < e.getPointerCount(); i++) {
newPoints.add(new TouchPoint(is[i], xs[i], ys[i], 5, 5, ps[i], 0));
}
changedPoints.add(newPoints.get(0));
newPoints.remove(0);
touches = newPoints;
HardwareDevice.INSTANCE.getDisplayManager().onTouchStart(new TouchStartEvent(changedPoints, touches));
HardwareDevice.INSTANCE.getDisplayManager().onTouchEnd(new TouchEndEvent(changedPoints, touches));
// List<TouchPoint> newPoints = new ObjectArrayList<>();
// List<TouchPoint> changedPoints = new ObjectArrayList<>();
// List<TouchPoint> oldPoints = touches;
// int[] xs = e.getAllX();
// int[] ys = e.getAllY();
// float[] ps = e.getAllPressures();
// short[] is = e.getAllPointerIDs();
// for (int i = 0; i < e.getPointerCount(); i++) {
// newPoints.add(HardwareDevice.INSTANCE.getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0));
// }
//
// changedPoints.add(newPoints.get(0));
// newPoints.remove(0);
// touches = newPoints;
// HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchStart(new TouchStartEvent(changedPoints, touches));
// HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchEnd(new TouchEndEvent(changedPoints, touches));
}
@Override
@ -337,11 +337,11 @@ class NEWTWindow implements GLEventListener {
float[] ps = e.getAllPressures();
short[] is = e.getAllPointerIDs();
for (int i = 0; i < e.getPointerCount(); i++) {
newPoints.add(new TouchPoint(is[i], xs[i], ys[i], 5, 5, ps[i], 0));
newPoints.add(HardwareDevice.INSTANCE.getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0));
}
changedPoints.add(newPoints.get(0));
touches = newPoints;
HardwareDevice.INSTANCE.getDisplayManager().onTouchStart(new TouchStartEvent(changedPoints, touches));
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchStart(new TouchStartEvent(changedPoints, touches));
}
@Override
@ -354,42 +354,47 @@ class NEWTWindow implements GLEventListener {
float[] ps = e.getAllPressures();
short[] is = e.getAllPointerIDs();
for (int i = 0; i < e.getPointerCount(); i++) {
newPoints.add(new TouchPoint(is[i], xs[i], ys[i], 5, 5, ps[i], 0));
newPoints.add(HardwareDevice.INSTANCE.getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0));
}
changedPoints.add(newPoints.get(0));
newPoints.remove(0);
touches = newPoints;
HardwareDevice.INSTANCE.getDisplayManager().onTouchEnd(new TouchEndEvent(changedPoints, touches));
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchEnd(new TouchEndEvent(changedPoints, touches));
}
@Override
public void mouseMoved(MouseEvent e) {
}
private long lastDraggedTime = 0;
@Override
public void mouseDragged(MouseEvent e) {
List<TouchPoint> newPoints = new ObjectArrayList<>();
List<TouchPoint> changedPoints = new ObjectArrayList<>();
List<TouchPoint> oldPoints = touches;
int[] xs = e.getAllX();
int[] ys = e.getAllY();
float[] ps = e.getAllPressures();
short[] is = e.getAllPointerIDs();
for (int i = 0; i < e.getPointerCount(); i++) {
newPoints.add(new TouchPoint(is[i], xs[i], ys[i], 5, 5, ps[i], 0));
}
newPoints.forEach((newp) -> {
oldPoints.forEach((oldp) -> {
if (newp.getID() == oldp.getID()) {
if (newp.equals(oldp) == false) {
changedPoints.add(newp);
long curTime = System.currentTimeMillis();
if (curTime - lastDraggedTime > 50) {
lastDraggedTime = curTime;
List<TouchPoint> newPoints = new ObjectArrayList<>();
List<TouchPoint> changedPoints = new ObjectArrayList<>();
List<TouchPoint> oldPoints = touches;
int[] xs = e.getAllX();
int[] ys = e.getAllY();
float[] ps = e.getAllPressures();
short[] is = e.getAllPointerIDs();
for (int i = 0; i < e.getPointerCount(); i++) {
newPoints.add(HardwareDevice.INSTANCE.getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0));
}
newPoints.forEach((newp) -> {
oldPoints.forEach((oldp) -> {
if (newp.getID() == oldp.getID()) {
if (newp.equals(oldp) == false) {
changedPoints.add(newp);
}
}
}
});
});
});
touches = newPoints;
HardwareDevice.INSTANCE.getDisplayManager().onTouchMove(new TouchMoveEvent(changedPoints, touches));
touches = newPoints;
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchMove(new TouchMoveEvent(changedPoints, touches));
}
}
@Override