Clean-up Controller and correctly re-apply settings when new object is loaded

pull/35/head
James Ball 2021-05-19 21:25:38 +01:00
rodzic a1539eb6f8
commit 105054da84
1 zmienionych plików z 49 dodań i 35 usunięć

Wyświetl plik

@ -46,7 +46,6 @@ public class Controller implements Initializable {
private static final int SAMPLE_RATE = 192000; private static final int SAMPLE_RATE = 192000;
private static final InputStream DEFAULT_OBJ = Controller.class.getResourceAsStream("/models/cube.obj"); private static final InputStream DEFAULT_OBJ = Controller.class.getResourceAsStream("/models/cube.obj");
private static final double DEFAULT_ROTATE_SPEED = 0.1;
private final FileChooser fileChooser = new FileChooser(); private final FileChooser fileChooser = new FileChooser();
private final Renderer<List<Shape>, AudioInputStream> renderer; private final Renderer<List<Shape>, AudioInputStream> renderer;
@ -129,9 +128,9 @@ public class Controller implements Initializable {
scaleSlider, scaleSlider,
scaleEffect::setScale, scaleEffect::setScale,
focalLengthSlider, focalLengthSlider,
this::setFocalLength, d -> updateFocalLength(),
objectRotateSpeedSlider, objectRotateSpeedSlider,
this::setObjectRotateSpeed d -> updateObjectRotateSpeed()
); );
} }
@ -146,7 +145,6 @@ public class Controller implements Initializable {
); );
} }
// TODO: Refactor and clean up duplication
@Override @Override
public void initialize(URL url, ResourceBundle resourceBundle) { public void initialize(URL url, ResourceBundle resourceBundle) {
Map<Slider, Consumer<Double>> sliders = initializeSliderMap(); Map<Slider, Consumer<Double>> sliders = initializeSliderMap();
@ -158,36 +156,16 @@ public class Controller implements Initializable {
); );
} }
InvalidationListener translationUpdate = observable -> translationXTextField.textProperty().addListener(e -> updateTranslation());
translateEffect.setTranslation(new Vector2( translationYTextField.textProperty().addListener(e -> updateTranslation());
tryParse(translationXTextField.getText()),
tryParse(translationYTextField.getText())
));
translationXTextField.textProperty().addListener(translationUpdate); cameraXTextField.textProperty().addListener(e -> updateCameraPos());
translationYTextField.textProperty().addListener(translationUpdate); cameraYTextField.textProperty().addListener(e -> updateCameraPos());
cameraZTextField.textProperty().addListener(e -> updateCameraPos());
InvalidationListener cameraPosUpdate = observable -> rotateXTextField.textProperty().addListener(e -> updateRotation());
producer.setFrameSettings(ObjSettingsFactory.cameraPosition(new Vector3( rotateYTextField.textProperty().addListener(e -> updateRotation());
tryParse(cameraXTextField.getText()), rotateZTextField.textProperty().addListener(e -> updateRotation());
tryParse(cameraYTextField.getText()),
tryParse(cameraZTextField.getText())
)));
cameraXTextField.textProperty().addListener(cameraPosUpdate);
cameraYTextField.textProperty().addListener(cameraPosUpdate);
cameraZTextField.textProperty().addListener(cameraPosUpdate);
InvalidationListener rotateUpdate = observable ->
producer.setFrameSettings(ObjSettingsFactory.rotation(new Vector3(
tryParse(rotateXTextField.getText()),
tryParse(rotateYTextField.getText()),
tryParse(rotateZTextField.getText())
)));
rotateXTextField.textProperty().addListener(rotateUpdate);
rotateYTextField.textProperty().addListener(rotateUpdate);
rotateZTextField.textProperty().addListener(rotateUpdate);
resetRotationButton.setOnAction(e -> producer.setFrameSettings(ObjSettingsFactory.resetRotation())); resetRotationButton.setOnAction(e -> producer.setFrameSettings(ObjSettingsFactory.resetRotation()));
@ -222,7 +200,7 @@ public class Controller implements Initializable {
recordButton.setOnAction(event -> toggleRecord()); recordButton.setOnAction(event -> toggleRecord());
setObjectRotateSpeed(DEFAULT_ROTATE_SPEED); updateObjectRotateSpeed();
renderer.addEffect(EffectType.SCALE, scaleEffect); renderer.addEffect(EffectType.SCALE, scaleEffect);
renderer.addEffect(EffectType.ROTATE, rotateEffect); renderer.addEffect(EffectType.ROTATE, rotateEffect);
@ -258,16 +236,48 @@ public class Controller implements Initializable {
} }
} }
private void setFocalLength(double focalLength) { private void updateFocalLength() {
double focalLength = focalLengthSlider.getValue();
producer.setFrameSettings(ObjSettingsFactory.focalLength(focalLength)); producer.setFrameSettings(ObjSettingsFactory.focalLength(focalLength));
} }
private void setObjectRotateSpeed(double rotateSpeed) { private void updateObjectRotateSpeed() {
double rotateSpeed = objectRotateSpeedSlider.getValue();
producer.setFrameSettings( producer.setFrameSettings(
ObjSettingsFactory.rotateSpeed((Math.exp(3 * rotateSpeed) - 1) / 50) ObjSettingsFactory.rotateSpeed((Math.exp(3 * rotateSpeed) - 1) / 50)
); );
} }
private void updateTranslation() {
translateEffect.setTranslation(new Vector2(
tryParse(translationXTextField.getText()),
tryParse(translationYTextField.getText())
));
}
private void resetCameraPos() {
cameraXTextField.setText("");
cameraYTextField.setText("");
cameraZTextField.setText("");
}
private void updateCameraPos() {
renderer.flushFrames();
producer.setFrameSettings(ObjSettingsFactory.cameraPosition(new Vector3(
tryParse(cameraXTextField.getText()),
tryParse(cameraYTextField.getText()),
tryParse(cameraZTextField.getText())
)));
}
private void updateRotation() {
producer.setFrameSettings(ObjSettingsFactory.rotation(new Vector3(
tryParse(rotateXTextField.getText()),
tryParse(rotateYTextField.getText()),
tryParse(rotateZTextField.getText())
)));
}
private double tryParse(String value) { private double tryParse(String value) {
try { try {
return Double.parseDouble(value); return Double.parseDouble(value);
@ -290,10 +300,14 @@ public class Controller implements Initializable {
try { try {
producer.stop(); producer.stop();
String path = file.getAbsolutePath(); String path = file.getAbsolutePath();
resetCameraPos();
producer = new FrameProducer<>( producer = new FrameProducer<>(
renderer, renderer,
ParserFactory.getParser(path).parse() ParserFactory.getParser(path).parse()
); );
updateRotation();
updateObjectRotateSpeed();
updateFocalLength();
executor.submit(producer); executor.submit(producer);
if (file.exists() && !file.isDirectory()) { if (file.exists() && !file.isDirectory()) {