kopia lustrzana https://github.com/jameshball/osci-render
Add listeners to framesets so that object positions can be updated on object load
rodzic
0301afa3e8
commit
f912dc5d7b
2
pom.xml
2
pom.xml
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
package sh.ball.parser.obj;
|
||||
|
||||
public interface Listener {
|
||||
|
||||
void update(Object obj);
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) { }
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue