diff --git a/src/main/java/sh/ball/MovableRenderer.java b/src/main/java/sh/ball/MovableRenderer.java new file mode 100644 index 00000000..ae16a27d --- /dev/null +++ b/src/main/java/sh/ball/MovableRenderer.java @@ -0,0 +1,8 @@ +package sh.ball; + +public interface MovableRenderer extends Renderer { + void setRotationSpeed(double speed); + void setTranslation(T translation); + void setTranslationSpeed(double speed); + void setScale(double scale); +} diff --git a/src/main/java/sh/ball/Renderer.java b/src/main/java/sh/ball/Renderer.java new file mode 100644 index 00000000..a03f42fa --- /dev/null +++ b/src/main/java/sh/ball/Renderer.java @@ -0,0 +1,7 @@ +package sh.ball; + +public interface Renderer extends Runnable { + void stop(); + void setQuality(double quality); + void addFrame(T frame); +} diff --git a/src/main/java/sh/ball/audio/AudioPlayer.java b/src/main/java/sh/ball/audio/AudioPlayer.java index 591acf4a..8d6a96c1 100644 --- a/src/main/java/sh/ball/audio/AudioPlayer.java +++ b/src/main/java/sh/ball/audio/AudioPlayer.java @@ -1,5 +1,6 @@ package sh.ball.audio; +import sh.ball.MovableRenderer; import xt.audio.Enums.XtSample; import xt.audio.Enums.XtSetup; import xt.audio.Enums.XtSystem; @@ -25,14 +26,15 @@ import sh.ball.shapes.Vector2; import java.util.List; -public class AudioPlayer implements Runnable { +public class AudioPlayer implements MovableRenderer, Vector2> { private static final int SAMPLE_RATE = 192000; + private static final int BUFFER_SIZE = 20; private final XtMix MIX = new XtMix(SAMPLE_RATE, XtSample.FLOAT32); private final XtChannels CHANNELS = new XtChannels(0, 0, 2, 0); private final XtFormat FORMAT = new XtFormat(MIX, CHANNELS); - private final BlockingQueue> frameQueue; + private final BlockingQueue> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE); private List frame; private int currentShape = 0; @@ -48,18 +50,14 @@ public class AudioPlayer implements Runnable { private volatile boolean stopped; - public AudioPlayer(BlockingQueue> frameQueue) { - this.frameQueue = frameQueue; - } + public AudioPlayer() {} - public AudioPlayer(ArrayBlockingQueue> frameQueue, double rotateSpeed, - double translateSpeed, Vector2 translateVector, double scale, double weight) { - this(frameQueue); - setRotateSpeed(rotateSpeed); + public AudioPlayer(double rotateSpeed, double translateSpeed, Vector2 translateVector, double scale, double weight) { + setRotationSpeed(rotateSpeed); setTranslationSpeed(translateSpeed); setTranslation(translateVector); setScale(scale); - setWeight(weight); + setQuality(weight); } private int render(XtStream stream, XtBuffer buffer, Object user) throws InterruptedException { @@ -136,20 +134,29 @@ public class AudioPlayer implements Runnable { return shape; } - public void setRotateSpeed(double speed) { + @Override + public void setRotationSpeed(double speed) { this.rotateSpeed = speed; } + @Override public void setTranslation(Vector2 translation) { this.translateVector = translation; } + @Override + public void setTranslationSpeed(double speed) { + translateSpeed = speed; + } + + @Override public void setScale(double scale) { this.scale = scale; } - public void setWeight(double weight) { - this.weight = weight; + @Override + public void setQuality(double quality) { + this.weight = quality; } private Shape getCurrentShape() { @@ -195,12 +202,19 @@ public class AudioPlayer implements Runnable { } } - public void stopPlaying() { + @Override + public void stop() { stopped = true; } - public void setTranslationSpeed(Double speed) { - translateSpeed = speed; + @Override + public void addFrame(List frame) { + try { + frameQueue.put(frame); + } catch (InterruptedException e) { + e.printStackTrace(); + System.err.println("Frame missed."); + } } private static final class Phase { diff --git a/src/main/java/sh/ball/audio/FrameProducer.java b/src/main/java/sh/ball/audio/FrameProducer.java index 08fb7428..1fcea358 100644 --- a/src/main/java/sh/ball/audio/FrameProducer.java +++ b/src/main/java/sh/ball/audio/FrameProducer.java @@ -1,9 +1,9 @@ package sh.ball.audio; +import sh.ball.Renderer; import sh.ball.engine.Vector3; import java.io.IOException; import java.util.List; -import java.util.concurrent.BlockingQueue; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import sh.ball.parser.FileParser; @@ -14,26 +14,21 @@ import sh.ball.shapes.Shape; public class FrameProducer implements Runnable { - private final BlockingQueue> frameQueue; + private final Renderer> renderer; private ObjParser objParser; private SvgParser svgParser; private TextParser textParser; private FileParser parser; - public FrameProducer(BlockingQueue> frameQueue) { - this.frameQueue = frameQueue; + public FrameProducer(Renderer> renderer) { + this.renderer = renderer; } @Override public void run() { while (true) { - try { - frameQueue.put(parser.nextFrame()); - } catch (InterruptedException e) { - e.printStackTrace(); - System.out.println("Frame missed."); - } + renderer.addFrame(parser.nextFrame()); } } diff --git a/src/main/java/sh/ball/gui/Controller.java b/src/main/java/sh/ball/gui/Controller.java index e21fd571..e2250bda 100644 --- a/src/main/java/sh/ball/gui/Controller.java +++ b/src/main/java/sh/ball/gui/Controller.java @@ -1,5 +1,6 @@ package sh.ball.gui; +import sh.ball.MovableRenderer; import sh.ball.audio.AudioPlayer; import sh.ball.audio.FrameProducer; import sh.ball.engine.Vector3; @@ -9,8 +10,6 @@ import java.net.URL; import java.util.List; import java.util.Map; import java.util.ResourceBundle; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; import javafx.beans.InvalidationListener; import javafx.fxml.FXML; import javafx.fxml.Initializable; @@ -29,13 +28,12 @@ import sh.ball.shapes.Vector2; public class Controller implements Initializable { - private static final int BUFFER_SIZE = 20; private static final String DEFAULT_FILE = "src/main/resources/models/cube.obj"; private final FileChooser fileChooser = new FileChooser(); - private final BlockingQueue> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE); - private final AudioPlayer player = new AudioPlayer(frameQueue); - private final FrameProducer producer = new FrameProducer(frameQueue); + + private final MovableRenderer, Vector2> renderer = new AudioPlayer(); + private final FrameProducer producer = new FrameProducer(renderer); private Stage stage; @@ -79,13 +77,13 @@ public class Controller implements Initializable { private Map> initializeSliderMap() { return Map.of( weightSlider, - new SliderUpdater<>(weightLabel::setText, player::setWeight), + new SliderUpdater<>(weightLabel::setText, renderer::setQuality), rotateSpeedSlider, - new SliderUpdater<>(rotateSpeedLabel::setText, player::setRotateSpeed), + new SliderUpdater<>(rotateSpeedLabel::setText, renderer::setRotationSpeed), translationSpeedSlider, - new SliderUpdater<>(translationSpeedLabel::setText, player::setTranslationSpeed), + new SliderUpdater<>(translationSpeedLabel::setText, renderer::setTranslationSpeed), scaleSlider, - new SliderUpdater<>(scaleLabel::setText, player::setScale), + new SliderUpdater<>(scaleLabel::setText, renderer::setScale), focalLengthSlider, new SliderUpdater<>(focalLengthLabel::setText, producer::setFocalLength) ); @@ -104,7 +102,7 @@ public class Controller implements Initializable { } InvalidationListener translationUpdate = observable -> - player.setTranslation(new Vector2( + renderer.setTranslation(new Vector2( tryParse(translationXTextField.getText()), tryParse(translationYTextField.getText()) )); @@ -132,7 +130,7 @@ public class Controller implements Initializable { }); new Thread(producer).start(); - new Thread(player).start(); + new Thread(renderer).start(); } private double tryParse(String value) { diff --git a/src/main/java/sh/ball/gui/Gui.java b/src/main/java/sh/ball/gui/Gui.java index 65f41781..51852732 100644 --- a/src/main/java/sh/ball/gui/Gui.java +++ b/src/main/java/sh/ball/gui/Gui.java @@ -1,6 +1,5 @@ package sh.ball.gui; - import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXMLLoader;