You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.3 KiB
Java
135 lines
3.3 KiB
Java
import processing.core.PApplet;
|
|
import java.util.ArrayList;
|
|
|
|
class ProjectorApplet extends PApplet {
|
|
/*
|
|
Secondary applet for controlling what gets displayed on
|
|
the projector.
|
|
|
|
This window runs as a separate thread, so in order to draw
|
|
things, you should create a ProjectorCommand and queue it
|
|
up with projectorApplet.commandQueue.add(myCommand).
|
|
*/
|
|
|
|
// Which screen should we display on?
|
|
final int projectorScreenNumber = 2;
|
|
|
|
// Center coordinates of the screen
|
|
final static int centerX = 860;
|
|
final static int centerY = 540;
|
|
|
|
// Background color
|
|
int bgColor = color(0, 0, 0);
|
|
|
|
// Pointer to the main applet
|
|
EuglenaApplet parent;
|
|
|
|
// Calibration component
|
|
Calibrator calibrator;
|
|
|
|
// Queue of commands to execute
|
|
ArrayList<ProjectorCommand> commandQueue;
|
|
|
|
ProjectorApplet(EuglenaApplet parent) {
|
|
this.parent = parent;
|
|
calibrator = new Calibrator(this);
|
|
commandQueue = new ArrayList<>();
|
|
}
|
|
|
|
public void settings() {
|
|
fullScreen(P2D, this.projectorScreenNumber);
|
|
}
|
|
|
|
@Override
|
|
public void setup() {
|
|
clear();
|
|
// smooth(); // Smooth might create artifacts when animating?
|
|
}
|
|
|
|
@Override
|
|
public void draw() {
|
|
/*
|
|
Main draw loop for the projector window
|
|
*/
|
|
|
|
/*
|
|
Exectue commands from the commandQueue.
|
|
If a command finished, mark it for removal.
|
|
If we get a ProjectorCommandException, don't execute
|
|
any further commands.
|
|
*/
|
|
ArrayList<Integer> entriesToRemove = new ArrayList<>();
|
|
try {
|
|
for (int i = 0; i < commandQueue.size(); i++) {
|
|
|
|
boolean done = commandQueue.get(i).run(this);
|
|
if (done) {
|
|
entriesToRemove.add(i);
|
|
}
|
|
|
|
}
|
|
} catch (ProjectorCommandException e) {
|
|
// Do nothing
|
|
}
|
|
|
|
// Remove finished commands (have to do it in reverse order to preserve indices)
|
|
for (int i = entriesToRemove.size() - 1; i >= 0; i--) {
|
|
commandQueue.remove(i);
|
|
}
|
|
|
|
// Let the calibration module draw anything it needs
|
|
calibrator.draw(parent);
|
|
}
|
|
|
|
public void reset() {
|
|
/*
|
|
Clear the commandQueue and the screen
|
|
*/
|
|
commandQueue.clear();
|
|
this.clear();
|
|
}
|
|
|
|
public void clear() {
|
|
/*
|
|
Clear the screen
|
|
*/
|
|
fill(bgColor);
|
|
noStroke();
|
|
rectMode(CORNER);
|
|
rect(0, 0, width * 4, height * 4);
|
|
}
|
|
|
|
public void setBgColor(int c) {
|
|
bgColor = c;
|
|
}
|
|
|
|
public void setBgColor(int r, int b, int g) {
|
|
bgColor = color(r, g, b);
|
|
}
|
|
|
|
public int getBgColor() {
|
|
return bgColor;
|
|
}
|
|
|
|
/*
|
|
Functions for converting coordinates and distances from
|
|
main-window to projector-window coordinates
|
|
*/
|
|
|
|
public float convertXCoord(float x) {
|
|
return (x / calibrator.magx + width * calibrator.offsetx);
|
|
}
|
|
|
|
public float convertYCoord(float y) {
|
|
return (y / calibrator.magy + height * calibrator.offsety);
|
|
}
|
|
|
|
public float convertXDistance(float dx) {
|
|
return (dx / calibrator.magx);
|
|
}
|
|
|
|
public float convertYDistance(float dy) {
|
|
return (dy / calibrator.magy);
|
|
}
|
|
}
|