TerraForged/TerraForgedApp/src/main/java/com/terraforged/app/Controller.java

237 lines
6.9 KiB
Java

/*
*
* MIT License
*
* Copyright (c) 2020 TerraForged
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.terraforged.app;
import processing.core.PApplet;
import processing.event.KeyEvent;
import processing.event.MouseEvent;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
public class Controller {
private static final int BUTTON_NONE = -1;
private static final int BUTTON_1 = 37;
private static final int BUTTON_2 = 39;
private static final int BUTTON_3 = 3;
private static final float cameraSpeed = 100F;
private static final float zoomSpeed = 0.01F;
private static final float rotateSpeed = 0.002F;
private static final float translateSpeed = 2F;
private static final float moveSpeed = 10F;
private int mouseButton = BUTTON_NONE;
private int lastX = 0;
private int lastY = 0;
private float yaw = -0.2F;
private float pitch = 0.85F;
private float translateX = 0F;
private float translateY = 0F;
private float translateZ = -800;
private float velocityX = 0F;
private float velocityY = 0F;
private int colorMode = 1;
private int renderMode = 0;
private int newSeed = 0;
private int left = 0;
private int right = 0;
private int up = 0;
private int down = 0;
private float zoom = 16;
private boolean filters = true;
public void apply(PApplet applet) {
applet.translate(translateX, translateY, translateZ);
applet.translate(applet.width / 2, applet.height / 2, 0);
applet.rotateX(pitch);
applet.rotateZ(yaw);
update();
}
public void update() {
float forward = up + down;
float strafe = left + right;
velocityX = forward * (float) Math.sin(yaw);
velocityY = forward * (float) Math.cos(yaw);
velocityX += strafe * (float) Math.sin(yaw + Math.toRadians(90));
velocityY += strafe * (float) Math.cos(yaw + Math.toRadians(90));
if (velocityX != 0 || velocityY != 0) {
float magnitude = (float) Math.sqrt(velocityX * velocityX + velocityY * velocityY);
velocityX /= magnitude;
velocityY /= magnitude;
}
}
public int getColorMode() {
return colorMode;
}
public int getRenderMode() {
return renderMode;
}
public float velocityX() {
return velocityX * moveSpeed / zoom;
}
public float velocityY() {
return velocityY * moveSpeed / zoom;
}
public float zoomLevel() {
return zoom;
}
public boolean filters() {
return filters;
}
public int getNewSeed() {
if (newSeed == 1) {
newSeed = 0;
return 1;
}
if (newSeed != 0) {
int val = newSeed;
newSeed = 0;
return val;
}
return 0;
}
public void keyPress(KeyEvent event) {
switch (event.getKey()) {
case 'w':
up = -1;
break;
case 'a':
left = -1;
break;
case 's':
down = 1;
break;
case 'd':
right = 1;
break;
}
}
public void keyRelease(KeyEvent event) {
switch (event.getKey()) {
case 'w':
up = 0;
return;
case 'a':
left = 0;
return;
case 's':
down = 0;
return;
case 'd':
right = 0;
return;
case 'r':
renderMode = renderMode == 0 ? 1 : 0;
return;
case 'n':
newSeed = 1;
return;
case 'm':
newSeed = Main.seed;
return;
case 'f':
filters = !filters;
return;
case 'c':
StringSelection selection = new StringSelection("" + Main.seed);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
return;
case 'v':
try {
Object data = Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
newSeed = (int) Long.parseLong(data.toString());
} catch (Throwable t) {
t.printStackTrace();
}
}
if (event.getKey() >= '1' && event.getKey() <= '9') {
colorMode = event.getKey() - '0';
return;
}
}
public void mousePress(MouseEvent event) {
if (mouseButton == BUTTON_NONE) {
lastX = event.getX();
lastY = event.getY();
mouseButton = event.getButton();
}
}
public void mouseRelease(MouseEvent event) {
mouseButton = BUTTON_NONE;
}
public void mouseWheel(MouseEvent event) {
translateZ -= event.getCount() * cameraSpeed;
}
public void mouseDrag(MouseEvent event) {
int dx = event.getX() - lastX;
int dy = event.getY() - lastY;
boolean ctrl = (event.getModifiers() & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK;
lastX = event.getX();
lastY = event.getY();
if (mouseButton == BUTTON_1) {
yaw -= dx * rotateSpeed;
pitch -= dy * rotateSpeed;
}
if (mouseButton == BUTTON_2) {
translateX += dx * translateSpeed;
translateY += dy * translateSpeed;
}
if (mouseButton == BUTTON_3) {
if (ctrl) {
zoom += (dy - dx) * zoom * zoomSpeed;
zoom = Math.max(1F, zoom);
} else {
translateZ -= (dy - dx) * cameraSpeed * 0.1F;
}
}
}
}