kopia lustrzana https://github.com/jameshball/osci-render
Update GUI and refactor to use SliderUpdater class
rodzic
976b67b889
commit
95bb73debd
|
@ -40,7 +40,7 @@ public class FrameProducer implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFocalLength(float focalLength) {
|
public void setFocalLength(Double focalLength) {
|
||||||
objParser.setFocalLength(focalLength);
|
objParser.setFocalLength(focalLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,4 +60,13 @@ public class FrameProducer implements Runnable {
|
||||||
"Provided file extension in file " + filePath + " not supported.");
|
"Provided file extension in file " + filePath + " not supported.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRotateSpeed(Double rotateSpeed) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTranslationSpeed(Double translationSpeed) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScale(Double scale) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,7 @@ public class Camera {
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFocalLength(float focalLength) {
|
public void setFocalLength(double focalLength) {
|
||||||
this.focalLength = focalLength;
|
this.focalLength = focalLength;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,26 +6,21 @@ import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
import javafx.scene.control.Slider;
|
import javafx.scene.control.Slider;
|
||||||
import javafx.scene.layout.AnchorPane;
|
import javafx.scene.control.TextField;
|
||||||
import javafx.scene.text.Text;
|
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import javax.xml.xpath.XPathEvaluationResult;
|
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import parser.FileParser;
|
|
||||||
import parser.ObjParser;
|
|
||||||
import parser.TextParser;
|
|
||||||
import parser.svg.SvgParser;
|
|
||||||
import shapes.Shape;
|
import shapes.Shape;
|
||||||
import shapes.Vector2;
|
|
||||||
|
|
||||||
public class Controller implements Initializable {
|
public class Controller implements Initializable {
|
||||||
|
|
||||||
|
@ -35,29 +30,64 @@ public class Controller implements Initializable {
|
||||||
private final FileChooser fileChooser = new FileChooser();
|
private final FileChooser fileChooser = new FileChooser();
|
||||||
private final BlockingQueue<List<Shape>> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE);
|
private final BlockingQueue<List<Shape>> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE);
|
||||||
private final AudioPlayer player = new AudioPlayer(SAMPLE_RATE, frameQueue);
|
private final AudioPlayer player = new AudioPlayer(SAMPLE_RATE, frameQueue);
|
||||||
|
|
||||||
/* Default parser. */
|
|
||||||
private final FrameProducer producer = new FrameProducer(frameQueue);
|
private final FrameProducer producer = new FrameProducer(frameQueue);
|
||||||
|
|
||||||
private Stage stage;
|
private Stage stage;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private Button btnBrowse;
|
private Button chooseFileButton;
|
||||||
@FXML
|
@FXML
|
||||||
private Text sliderOutput;
|
public Label fileLabel;
|
||||||
@FXML
|
@FXML
|
||||||
private Slider slider;
|
public TextField translationXTextField;
|
||||||
|
@FXML
|
||||||
|
public TextField translationYTextField;
|
||||||
|
@FXML
|
||||||
|
public TextField weightTextField;
|
||||||
|
@FXML
|
||||||
|
public Slider rotateSpeedSlider;
|
||||||
|
@FXML
|
||||||
|
public Label rotateSpeedLabel;
|
||||||
|
@FXML
|
||||||
|
public Slider translationSpeedSlider;
|
||||||
|
@FXML
|
||||||
|
public Label translationSpeedLabel;
|
||||||
|
@FXML
|
||||||
|
public Slider scaleSlider;
|
||||||
|
@FXML
|
||||||
|
public Label scaleLabel;
|
||||||
|
@FXML
|
||||||
|
private Slider focalLengthSlider;
|
||||||
|
@FXML
|
||||||
|
private Label focalLengthLabel;
|
||||||
|
|
||||||
public Controller() throws IOException, ParserConfigurationException, SAXException {
|
public Controller() throws IOException, ParserConfigurationException, SAXException {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<Slider, SliderUpdater<Double>> initializeSliderMap() {
|
||||||
|
return Map.of(
|
||||||
|
rotateSpeedSlider,
|
||||||
|
new SliderUpdater<>(rotateSpeedLabel::setText, producer::setRotateSpeed),
|
||||||
|
translationSpeedSlider,
|
||||||
|
new SliderUpdater<>(translationSpeedLabel::setText, producer::setTranslationSpeed),
|
||||||
|
scaleSlider,
|
||||||
|
new SliderUpdater<>(scaleLabel::setText, producer::setScale),
|
||||||
|
focalLengthSlider,
|
||||||
|
new SliderUpdater<>(focalLengthLabel::setText, producer::setFocalLength)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL url, ResourceBundle resourceBundle) {
|
public void initialize(URL url, ResourceBundle resourceBundle) {
|
||||||
slider.valueProperty().addListener((source, oldValue, newValue) -> {
|
Map<Slider, SliderUpdater<Double>> sliders = initializeSliderMap();
|
||||||
sliderOutput.setText(String.valueOf(slider.getValue()));
|
|
||||||
producer.setFocalLength((float) slider.getValue());
|
|
||||||
});
|
|
||||||
|
|
||||||
btnBrowse.setOnAction(e -> {
|
for (Slider slider : sliders.keySet()) {
|
||||||
|
slider.valueProperty().addListener((source, oldValue, newValue) ->
|
||||||
|
sliders.get(slider).update(slider.getValue())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
chooseFileButton.setOnAction(e -> {
|
||||||
File file = fileChooser.showOpenDialog(stage);
|
File file = fileChooser.showOpenDialog(stage);
|
||||||
try {
|
try {
|
||||||
producer.setParser(file.getAbsolutePath());
|
producer.setParser(file.getAbsolutePath());
|
||||||
|
@ -67,7 +97,7 @@ public class Controller implements Initializable {
|
||||||
});
|
});
|
||||||
|
|
||||||
new Thread(producer).start();
|
new Thread(producer).start();
|
||||||
new Thread(new AudioPlayer(SAMPLE_RATE, frameQueue)).start();
|
new Thread(player).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStage(Stage stage) {
|
public void setStage(Stage stage) {
|
||||||
|
|
|
@ -1,23 +1,62 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<?import javafx.scene.control.*?>
|
<?import javafx.scene.control.Button?>
|
||||||
<?import javafx.scene.layout.*?>
|
<?import javafx.scene.control.Label?>
|
||||||
<?import javafx.scene.text.*?>
|
<?import javafx.scene.control.Slider?>
|
||||||
|
<?import javafx.scene.control.SplitPane?>
|
||||||
<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gui.Controller">
|
<?import javafx.scene.control.TextField?>
|
||||||
<children>
|
<?import javafx.scene.control.TitledPane?>
|
||||||
<AnchorPane prefHeight="400.0" prefWidth="400.0">
|
<?import javafx.scene.layout.AnchorPane?>
|
||||||
<children>
|
<?import javafx.scene.layout.ColumnConstraints?>
|
||||||
<Slider fx:id="slider" blockIncrement="2.0" layoutX="45.0" layoutY="238.0" max="2.0" min="1.0E-5" prefHeight="14.0" prefWidth="313.0" />
|
<?import javafx.scene.layout.GridPane?>
|
||||||
<Text fx:id="sliderOutput" layoutX="196.0" layoutY="219.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0" />
|
<?import javafx.scene.layout.RowConstraints?>
|
||||||
<Button fx:id="btnBrowse" layoutX="23.0" layoutY="22.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="119.0" text="Browse" />
|
|
||||||
</children>
|
<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gui.Controller">
|
||||||
</AnchorPane>
|
<children>
|
||||||
</children>
|
<AnchorPane prefHeight="279.0" prefWidth="400.0">
|
||||||
<columnConstraints>
|
<children>
|
||||||
<ColumnConstraints />
|
<Button fx:id="chooseFileButton" layoutX="8.0" layoutY="15.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="119.0" text="Choose File" />
|
||||||
</columnConstraints>
|
<SplitPane dividerPositions="0.4723618090452261" layoutX="8.0" layoutY="56.0" orientation="VERTICAL" prefHeight="371.0" prefWidth="386.0">
|
||||||
<rowConstraints>
|
<items>
|
||||||
<RowConstraints />
|
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="0.0" prefWidth="385.0">
|
||||||
</rowConstraints>
|
<children>
|
||||||
</GridPane>
|
<Slider fx:id="rotateSpeedSlider" layoutX="116.0" layoutY="79.0" max="20.0" prefHeight="14.0" prefWidth="198.0" />
|
||||||
|
<Label layoutX="37.0" layoutY="77.0" text="Rotate speed" />
|
||||||
|
<Label fx:id="rotateSpeedLabel" layoutX="316.0" layoutY="77.0" text="0" />
|
||||||
|
<Slider fx:id="translationSpeedSlider" layoutX="116.0" layoutY="105.0" max="20.0" prefHeight="14.0" prefWidth="198.0" />
|
||||||
|
<Label layoutX="14.0" layoutY="103.0" text="Translation speed" />
|
||||||
|
<Label fx:id="translationSpeedLabel" layoutX="316.0" layoutY="103.0" text="0" />
|
||||||
|
<Slider fx:id="scaleSlider" layoutX="116.0" layoutY="130.0" max="10.0" prefHeight="14.0" prefWidth="198.0" value="1.0" />
|
||||||
|
<Label layoutX="80.0" layoutY="128.0" text="Scale" />
|
||||||
|
<Label fx:id="scaleLabel" layoutX="316.0" layoutY="128.0" text="0" />
|
||||||
|
<TextField fx:id="weightTextField" layoutX="118.0" layoutY="45.0" prefHeight="26.0" prefWidth="70.0" />
|
||||||
|
<Label layoutX="70.0" layoutY="50.0" text="Weight" />
|
||||||
|
<TextField fx:id="translationXTextField" layoutX="136.0" layoutY="13.0" prefHeight="26.0" prefWidth="70.0" />
|
||||||
|
<Label layoutX="51.0" layoutY="18.0" text="Translation" />
|
||||||
|
<Label layoutX="120.0" layoutY="18.0" text="x :" />
|
||||||
|
<Label layoutX="217.0" layoutY="18.0" text="y :" />
|
||||||
|
<TextField fx:id="translationYTextField" layoutX="234.0" layoutY="13.0" prefHeight="26.0" prefWidth="70.0" />
|
||||||
|
</children></AnchorPane>
|
||||||
|
<TitledPane animated="false" collapsible="false" text="3D .obj file settings">
|
||||||
|
<content>
|
||||||
|
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
|
||||||
|
<children>
|
||||||
|
<Slider fx:id="focalLengthSlider" blockIncrement="2.0" layoutX="116.0" layoutY="15.0" max="2.0" min="1.0E-5" prefHeight="14.0" prefWidth="198.0" value="1.0" />
|
||||||
|
<Label layoutX="43.0" layoutY="14.0" text="Focal length" />
|
||||||
|
<Label fx:id="focalLengthLabel" layoutX="316.0" layoutY="14.0" text="0" />
|
||||||
|
</children></AnchorPane>
|
||||||
|
</content>
|
||||||
|
</TitledPane>
|
||||||
|
</items>
|
||||||
|
</SplitPane>
|
||||||
|
<Label fx:id="fileLabel" layoutX="134.0" layoutY="20.0" />
|
||||||
|
</children>
|
||||||
|
</AnchorPane>
|
||||||
|
</children>
|
||||||
|
<columnConstraints>
|
||||||
|
<ColumnConstraints />
|
||||||
|
</columnConstraints>
|
||||||
|
<rowConstraints>
|
||||||
|
<RowConstraints />
|
||||||
|
</rowConstraints>
|
||||||
|
</GridPane>
|
||||||
|
|
|
@ -64,7 +64,7 @@ public class ObjParser extends FileParser {
|
||||||
|
|
||||||
// If camera position arguments haven't been specified, automatically work out the position of
|
// If camera position arguments haven't been specified, automatically work out the position of
|
||||||
// the camera based on the size of the object in the camera's view.
|
// the camera based on the size of the object in the camera's view.
|
||||||
public void setFocalLength(float focalLength) {
|
public void setFocalLength(double focalLength) {
|
||||||
camera.setFocalLength(focalLength);
|
camera.setFocalLength(focalLength);
|
||||||
if (isDefaultPosition) {
|
if (isDefaultPosition) {
|
||||||
camera.findZPos(object);
|
camera.findZPos(object);
|
||||||
|
|
Ładowanie…
Reference in New Issue