Add listeners to framesets so that object positions can be updated on object load

pull/35/head
James Ball 2021-05-23 13:47:12 +01:00
rodzic 0301afa3e8
commit f912dc5d7b
8 zmienionych plików z 56 dodań i 36 usunięć

Wyświetl plik

@ -6,7 +6,7 @@
<groupId>sh.ball</groupId>
<artifactId>osci-render</artifactId>
<version>1.5.0</version>
<version>1.5.1</version>
<name>osci-render</name>

Wyświetl plik

@ -1,8 +1,12 @@
package sh.ball.audio;
import sh.ball.parser.obj.Listener;
public interface FrameSet<T> {
T next();
void setFrameSettings(Object settings);
void addListener(Listener listener);
}

Wyświetl plik

@ -2,15 +2,12 @@ package sh.ball.gui;
import javafx.application.Platform;
import javafx.scene.control.*;
import sh.ball.audio.FrequencyAnalyser;
import sh.ball.audio.FrequencyListener;
import sh.ball.audio.Renderer;
import sh.ball.audio.*;
import sh.ball.audio.effect.Effect;
import sh.ball.audio.effect.EffectType;
import sh.ball.audio.effect.RotateEffect;
import sh.ball.audio.effect.ScaleEffect;
import sh.ball.audio.effect.EffectFactory;
import sh.ball.audio.FrameProducer;
import java.io.File;
import java.io.IOException;
@ -39,13 +36,14 @@ import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import sh.ball.audio.effect.TranslateEffect;
import sh.ball.engine.Vector3;
import sh.ball.parser.obj.Listener;
import sh.ball.parser.obj.ObjSettingsFactory;
import sh.ball.parser.obj.ObjParser;
import sh.ball.parser.ParserFactory;
import sh.ball.shapes.Shape;
import sh.ball.shapes.Vector2;
public class Controller implements Initializable, FrequencyListener {
public class Controller implements Initializable, FrequencyListener, Listener {
private static final int SAMPLE_RATE = 192000;
private static final InputStream DEFAULT_OBJ = Controller.class.getResourceAsStream("/models/cube.obj");
@ -118,10 +116,9 @@ public class Controller implements Initializable, FrequencyListener {
public Controller(Renderer<List<Shape>, AudioInputStream> renderer) throws IOException {
this.renderer = renderer;
this.producer = new FrameProducer<>(
renderer,
new ObjParser(DEFAULT_OBJ).parse()
);
FrameSet<List<Shape>> frames = new ObjParser(DEFAULT_OBJ).parse();
frames.addListener(this);
this.producer = new FrameProducer<>(renderer, frames);
}
private Map<Slider, Consumer<Double>> initializeSliderMap() {
@ -170,9 +167,9 @@ public class Controller implements Initializable, FrequencyListener {
translationXTextField.textProperty().addListener(e -> updateTranslation());
translationYTextField.textProperty().addListener(e -> updateTranslation());
cameraXTextField.textProperty().addListener(e -> updateCameraPos());
cameraYTextField.textProperty().addListener(e -> updateCameraPos());
cameraZTextField.textProperty().addListener(e -> updateCameraPos());
cameraXTextField.focusedProperty().addListener(e -> updateCameraPos());
cameraYTextField.focusedProperty().addListener(e -> updateCameraPos());
cameraZTextField.focusedProperty().addListener(e -> updateCameraPos());
InvalidationListener vectorCancellingListener = e ->
updateEffect(EffectType.VECTOR_CANCELLING, vectorCancellingCheckBox.isSelected(),
@ -275,12 +272,6 @@ public class Controller implements Initializable, FrequencyListener {
));
}
private void resetCameraPos() {
cameraXTextField.setText("");
cameraYTextField.setText("");
cameraZTextField.setText("");
}
private void updateCameraPos() {
producer.setFrameSettings(ObjSettingsFactory.cameraPosition(new Vector3(
tryParse(cameraXTextField.getText()),
@ -311,11 +302,9 @@ public class Controller implements Initializable, FrequencyListener {
try {
producer.stop();
String path = file.getAbsolutePath();
resetCameraPos();
producer = new FrameProducer<>(
renderer,
ParserFactory.getParser(path).parse()
);
FrameSet<List<Shape>> frames = ParserFactory.getParser(path).parse();
frames.addListener(this);
producer = new FrameProducer<>(renderer, frames);
updateObjectRotateSpeed();
updateFocalLength();
executor.submit(producer);
@ -353,4 +342,15 @@ public class Controller implements Initializable, FrequencyListener {
frequencyLabel.setText(String.format("L Frequency: %d Hz\nR Frequency: %d Hz", Math.round(leftFrequency), Math.round(rightFrequency)))
);
}
@Override
public void update(Object pos) {
if (pos instanceof Vector3 vector) {
Platform.runLater(() -> {
cameraXTextField.setText(String.valueOf(vector.getX()));
cameraYTextField.setText(String.valueOf(vector.getY()));
cameraZTextField.setText(String.valueOf(vector.getZ()));
});
}
}
}

Wyświetl plik

@ -2,7 +2,6 @@ package sh.ball.gui;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventType;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;

Wyświetl plik

@ -0,0 +1,6 @@
package sh.ball.parser.obj;
public interface Listener {
void update(Object obj);
}

Wyświetl plik

@ -6,12 +6,14 @@ import sh.ball.engine.Vector3;
import sh.ball.engine.WorldObject;
import sh.ball.shapes.Shape;
import java.util.ArrayList;
import java.util.List;
public class ObjFrameSet implements FrameSet<List<Shape>> {
private final WorldObject object;
private final Camera camera;
private final List<Listener> listeners = new ArrayList<>();
private Vector3 rotation = new Vector3();
private Double rotateSpeed = 0.0;
@ -21,6 +23,20 @@ public class ObjFrameSet implements FrameSet<List<Shape>> {
this.camera = camera;
}
@Override
public void addListener(Listener listener) {
listeners.add(listener);
notifyListener(listener);
}
private void notifyListener(Listener listener) {
listener.update(camera.getPos());
}
private void notifyListeners() {
listeners.forEach(this::notifyListener);
}
@Override
public List<Shape> next() {
if (rotateSpeed == 0) {
@ -40,6 +56,7 @@ public class ObjFrameSet implements FrameSet<List<Shape>> {
}
if (obj.cameraPos != null && camera.getPos() != obj.cameraPos) {
camera.setPos(obj.cameraPos);
notifyListeners();
}
if (obj.rotation != null) {
this.rotation = obj.rotation;

Wyświetl plik

@ -1,13 +1,11 @@
package sh.ball.shapes;
import sh.ball.audio.FrameSet;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;
import java.util.ArrayList;
import java.util.List;
public abstract class Shape implements FrameSet<List<Shape>> {
public abstract class Shape {
public static final int DEFAULT_WEIGHT = 80;
@ -34,14 +32,6 @@ public abstract class Shape implements FrameSet<List<Shape>> {
return length;
}
@Override
public List<Shape> next() {
return List.of(this);
}
@Override
public void setFrameSettings(Object settings) {}
/* SHAPE HELPER FUNCTIONS */
public static List<Shape> convert(java.awt.Shape shape) {

Wyświetl plik

@ -1,6 +1,7 @@
package sh.ball.shapes;
import sh.ball.audio.FrameSet;
import sh.ball.parser.obj.Listener;
import java.util.List;
@ -19,4 +20,7 @@ public class ShapeFrameSet implements FrameSet<List<Shape>> {
@Override
public void setFrameSettings(Object settings) {}
@Override
public void addListener(Listener listener) { }
}