import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import processing.core.PApplet;
import processing.data.JSONObject;
public class Visuals extends PApplet {
public CubeObject[] objects = new CubeObject[4];
private int session = 1;
private boolean isRunning = true;
// static ServerSocket variable
private static ServerSocket server;
// socket server port on which it will listen
private static int PORT = 9876;
public void setup() {
size(displayWidth, displayHeight);
frameRate(20);
background(0);
text("UM-KIPPEN V1. Session#" + this.session, (width / 2) - 80, 40);
objects[0] = new CubeObject(this, random(width), random(height), color(255, 204, 0), color(255, 100, 200, 15));
objects[1] = new CubeObject(this, random(width), random(height), color(50, 200, 100), color(255, 250, 0, 15));
objects[2] = new CubeObject(this, random(width), random(height), color(200, 102, 102), color(134, 122, 102, 15));
objects[3] = new CubeObject(this, random(width), random(height), color(100, 250, 200), color(10, 200, 2, 15));
new Thread(new MessageServer(this)).start();
}
private void reset() {
saveFrame();
background(0);
session++;
text("UM-KIPPEN V1.0: Session#" + this.session, (width / 2) - 80, 40);
}
private class MessageServer implements Runnable {
private Visuals canvas;
public MessageServer(Visuals canvas) {
this.canvas = canvas;
}
public void run() {
try {
server = new ServerSocket(PORT);
while (true) {
System.out.println("Waiting for client request on port " + PORT);
// creating socket and waiting for client connection
Socket socket = server.accept();
// read from socket to ObjectInputStream object
InputStream ois = socket.getInputStream();
// convert ObjectInputStream object to String
JSONObject jsonObject = new JSONObject(new InputStreamReader(ois));
if (jsonObject.hasKey("command")) {
if (jsonObject.getString("command").equals("sideChange")) {
int cubeNumber = jsonObject.getInt("trackNumber");
int clipNumber = jsonObject.getInt("clipNumber");
canvas.objects[cubeNumber].start();
canvas.objects[cubeNumber].sideChange(cubeNumber);
}
else if (jsonObject.getString("command").equals("stop")) {
int cubeNumber = jsonObject.getInt("trackNumber");
canvas.objects[cubeNumber].stop();
boolean oneRunning = false;
// check if all are stopped
for (CubeObject o : objects) {
oneRunning = true;
break;
}
if (!oneRunning)
reset();
}
else if (jsonObject.getString("command").equals("barrelRoll")) {
int cubeNumber = jsonObject.getInt("trackNumber");
Double value = Double.valueOf(jsonObject.getString("value"));
int valueInt = (int) (value * 250);
canvas.objects[cubeNumber].changeColor(valueInt);
}
}
// close resources
ois.close();
socket.close();
// terminate the server if client sends exit request
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void draw() {
// background(50);
for (int i = 0; i < objects.length; i++) {
objects[i].draw();
}
}
// public static void main(String args[]) {
// PApplet.main(new String[] { "--present", "Visuals" });
// }
}
class CubeObject {
private boolean isRunning = true;
private int currentSide = 0;
public int getCurrentSide() {
return currentSide;
}
PApplet canvas;
private int stroke;
private int fill;
float wander_offset;
float x;
float y;
float wander_theta;
float wander_radius;
// bigger = more edgier, hectic
float max_wander_offset = 0.1f;
// bigger = faster turns
float max_wander_radius = 2;
CubeObject(PApplet canvas, float _x, float _y, int fill, int stroke) {
this.canvas = canvas;
this.fill = fill;
this.stroke = stroke;
x = _x;
y = _y;
wander_theta = canvas.random(PApplet.TWO_PI);
wander_radius = canvas.random(max_wander_radius);
wander_offset = canvas.random(-max_wander_offset, max_wander_offset);
}
public boolean isRunning() {
return isRunning;
}
void stayInsideCanvas() {
x %= canvas.width;
y %= canvas.height;
}
void stop() {
this.isRunning = false;
}
public void sideChange(int cubeNumber) {
wander_offset = canvas.random(-max_wander_offset, max_wander_offset);
}
public void changeColor(int color) {
this.stroke = canvas.color(255, color, color / 2, 15);
}
public void toggleIsRunning() {
System.out.println("toggle");
if (isRunning) {
isRunning = false;
} else
isRunning = true;
}
void move() {
if (isRunning) {
// wander_offset = canvas.random(-max_wander_offset,
// max_wander_offset);
wander_theta += wander_offset;
x += canvas.cos(wander_theta);
y += canvas.sin(wander_theta);
}
}
void start() {
isRunning = true;
}
public void draw() {
canvas.noFill();
canvas.stroke(stroke);
this.stayInsideCanvas();
this.move();
canvas.rect(x, y, 20, 20);
}
}