kopia lustrzana https://github.com/jameshball/osci-render
Reimplement updating focal length and camera position
rodzic
67fb81dea8
commit
210f473f72
|
@ -2,4 +2,5 @@ package sh.ball;
|
||||||
|
|
||||||
public interface FrameSet<T> {
|
public interface FrameSet<T> {
|
||||||
T next();
|
T next();
|
||||||
|
void setFrameSettings(Object settings);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,14 @@ import sh.ball.parser.FileParser;
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
public class FrameProducer<T> implements Runnable {
|
public class FrameProducer<S> implements Runnable {
|
||||||
|
|
||||||
private final Renderer<T> renderer;
|
private final Renderer<S> renderer;
|
||||||
private final FrameSet<T> frames;
|
private final FrameSet<S> frames;
|
||||||
|
|
||||||
private boolean running;
|
private boolean running;
|
||||||
|
|
||||||
public FrameProducer(Renderer<T> renderer, FileParser<FrameSet<T>> parser) throws IOException, SAXException, ParserConfigurationException {
|
public FrameProducer(Renderer<S> renderer, FileParser<FrameSet<S>> parser) throws IOException, SAXException, ParserConfigurationException {
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
this.frames = parser.parse();
|
this.frames = parser.parse();
|
||||||
}
|
}
|
||||||
|
@ -32,4 +32,8 @@ public class FrameProducer<T> implements Runnable {
|
||||||
public void stop() {
|
public void stop() {
|
||||||
running = false;
|
running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFrameSettings(Object settings) {
|
||||||
|
frames.setFrameSettings(settings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,4 +127,8 @@ public class Camera {
|
||||||
public void setFocalLength(double focalLength) {
|
public void setFocalLength(double focalLength) {
|
||||||
this.focalLength = focalLength;
|
this.focalLength = focalLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getFocalLength() {
|
||||||
|
return focalLength;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import sh.ball.audio.AudioPlayer;
|
||||||
import sh.ball.audio.FrameProducer;
|
import sh.ball.audio.FrameProducer;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -28,6 +27,8 @@ import javafx.stage.Stage;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
import sh.ball.engine.Vector3;
|
||||||
|
import sh.ball.parser.obj.ObjFrameSettings;
|
||||||
import sh.ball.parser.obj.ObjParser;
|
import sh.ball.parser.obj.ObjParser;
|
||||||
import sh.ball.parser.ParserFactory;
|
import sh.ball.parser.ParserFactory;
|
||||||
import sh.ball.parser.txt.TextParser;
|
import sh.ball.parser.txt.TextParser;
|
||||||
|
@ -44,7 +45,7 @@ public class Controller implements Initializable {
|
||||||
|
|
||||||
private FrameProducer<List<Shape>> producer = new FrameProducer<>(
|
private FrameProducer<List<Shape>> producer = new FrameProducer<>(
|
||||||
renderer,
|
renderer,
|
||||||
ParserFactory.getParser(DEFAULT_FILE).orElseThrow(FileNotFoundException::new)
|
ParserFactory.getParser(DEFAULT_FILE)
|
||||||
);
|
);
|
||||||
|
|
||||||
private Stage stage;
|
private Stage stage;
|
||||||
|
@ -98,9 +99,9 @@ public class Controller implements Initializable {
|
||||||
translationSpeedSlider,
|
translationSpeedSlider,
|
||||||
new SliderUpdater<>(translationSpeedLabel::setText, renderer::setTranslationSpeed),
|
new SliderUpdater<>(translationSpeedLabel::setText, renderer::setTranslationSpeed),
|
||||||
scaleSlider,
|
scaleSlider,
|
||||||
new SliderUpdater<>(scaleLabel::setText, renderer::setScale)
|
new SliderUpdater<>(scaleLabel::setText, renderer::setScale),
|
||||||
// focalLengthSlider,
|
focalLengthSlider,
|
||||||
// new SliderUpdater<>(focalLengthLabel::setText, producer::setFocalLength)
|
new SliderUpdater<>(focalLengthLabel::setText, this::setFocalLength)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,29 +124,32 @@ public class Controller implements Initializable {
|
||||||
translationXTextField.textProperty().addListener(translationUpdate);
|
translationXTextField.textProperty().addListener(translationUpdate);
|
||||||
translationYTextField.textProperty().addListener(translationUpdate);
|
translationYTextField.textProperty().addListener(translationUpdate);
|
||||||
|
|
||||||
// InvalidationListener cameraPosUpdate = observable ->
|
InvalidationListener cameraPosUpdate = observable ->
|
||||||
// producer.setCameraPos(new Vector3(
|
producer.setFrameSettings(new ObjFrameSettings(new Vector3(
|
||||||
// tryParse(cameraXTextField.getText()),
|
tryParse(cameraXTextField.getText()),
|
||||||
// tryParse(cameraYTextField.getText()),
|
tryParse(cameraYTextField.getText()),
|
||||||
// tryParse(cameraZTextField.getText())
|
tryParse(cameraZTextField.getText())
|
||||||
// ));
|
)));
|
||||||
//
|
|
||||||
// cameraXTextField.textProperty().addListener(cameraPosUpdate);
|
cameraXTextField.textProperty().addListener(cameraPosUpdate);
|
||||||
// cameraYTextField.textProperty().addListener(cameraPosUpdate);
|
cameraYTextField.textProperty().addListener(cameraPosUpdate);
|
||||||
// cameraZTextField.textProperty().addListener(cameraPosUpdate);
|
cameraZTextField.textProperty().addListener(cameraPosUpdate);
|
||||||
|
|
||||||
chooseFileButton.setOnAction(e -> {
|
chooseFileButton.setOnAction(e -> {
|
||||||
File file = null;
|
File file = fileChooser.showOpenDialog(stage);
|
||||||
while (file == null) {
|
if (file != null) {
|
||||||
file = fileChooser.showOpenDialog(stage);
|
chooseFile(file);
|
||||||
}
|
}
|
||||||
chooseFile(file);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
executor.submit(producer);
|
executor.submit(producer);
|
||||||
new Thread(renderer).start();
|
new Thread(renderer).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setFocalLength(double focalLength) {
|
||||||
|
producer.setFrameSettings(new ObjFrameSettings(focalLength));
|
||||||
|
}
|
||||||
|
|
||||||
private double tryParse(String value) {
|
private double tryParse(String value) {
|
||||||
try {
|
try {
|
||||||
return Double.parseDouble(value);
|
return Double.parseDouble(value);
|
||||||
|
@ -161,7 +165,6 @@ public class Controller implements Initializable {
|
||||||
producer = new FrameProducer<>(
|
producer = new FrameProducer<>(
|
||||||
renderer,
|
renderer,
|
||||||
ParserFactory.getParser(path)
|
ParserFactory.getParser(path)
|
||||||
.orElseThrow(FileNotFoundException::new)
|
|
||||||
);
|
);
|
||||||
executor.submit(producer);
|
executor.submit(producer);
|
||||||
|
|
||||||
|
|
|
@ -8,21 +8,21 @@ import sh.ball.parser.txt.TextParser;
|
||||||
import sh.ball.shapes.Shape;
|
import sh.ball.shapes.Shape;
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class ParserFactory {
|
public class ParserFactory {
|
||||||
|
|
||||||
public static Optional<FileParser<FrameSet<List<Shape>>>> getParser(String filePath) throws IOException, ParserConfigurationException, SAXException {
|
public static FileParser<FrameSet<List<Shape>>> getParser(String filePath) throws IOException, ParserConfigurationException, SAXException {
|
||||||
if (ObjParser.isObjFile(filePath)) {
|
if (ObjParser.isObjFile(filePath)) {
|
||||||
return Optional.of(new ObjParser(filePath, 1));
|
return new ObjParser(filePath, 1);
|
||||||
} else if (SvgParser.isSvgFile(filePath)) {
|
} else if (SvgParser.isSvgFile(filePath)) {
|
||||||
return Optional.of(new SvgParser(filePath));
|
return new SvgParser(filePath);
|
||||||
} else if (TextParser.isTxtFile(filePath)) {
|
} else if (TextParser.isTxtFile(filePath)) {
|
||||||
return Optional.of(new TextParser(filePath));
|
return new TextParser(filePath);
|
||||||
}
|
}
|
||||||
return Optional.empty();
|
throw new IOException("No known parser that can parse " + new File(filePath).getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,4 +17,7 @@ public class ShapeFrameSet implements FrameSet<List<Shape>> {
|
||||||
public List<Shape> next() {
|
public List<Shape> next() {
|
||||||
return shapes;
|
return shapes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFrameSettings(Object settings) {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,11 +13,13 @@ public class ObjFrameSet implements FrameSet<List<Shape>> {
|
||||||
private final WorldObject object;
|
private final WorldObject object;
|
||||||
private final Camera camera;
|
private final Camera camera;
|
||||||
private final Vector3 rotation;
|
private final Vector3 rotation;
|
||||||
|
private final boolean isDefaultPosition;
|
||||||
|
|
||||||
public ObjFrameSet(WorldObject object, Camera camera, Vector3 rotation) {
|
public ObjFrameSet(WorldObject object, Camera camera, Vector3 rotation, boolean isDefaultPosition) {
|
||||||
this.object = object;
|
this.object = object;
|
||||||
this.camera = camera;
|
this.camera = camera;
|
||||||
this.rotation = rotation;
|
this.rotation = rotation;
|
||||||
|
this.isDefaultPosition = isDefaultPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -25,4 +27,22 @@ public class ObjFrameSet implements FrameSet<List<Shape>> {
|
||||||
object.rotate(rotation);
|
object.rotate(rotation);
|
||||||
return camera.draw(object);
|
return camera.draw(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFrameSettings(Object settings) {
|
||||||
|
if (settings instanceof ObjFrameSettings obj) {
|
||||||
|
Double focalLength = obj.focalLength();
|
||||||
|
Vector3 cameraPos = obj.cameraPos();
|
||||||
|
|
||||||
|
if (focalLength != null && camera.getFocalLength() != focalLength) {
|
||||||
|
camera.setFocalLength(focalLength);
|
||||||
|
if (isDefaultPosition) {
|
||||||
|
camera.findZPos(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cameraPos != null && camera.getPos() != cameraPos) {
|
||||||
|
camera.setPos(cameraPos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
package sh.ball.parser.obj;
|
||||||
|
|
||||||
|
import sh.ball.engine.Vector3;
|
||||||
|
|
||||||
|
public record ObjFrameSettings(Double focalLength, Vector3 cameraPos) {
|
||||||
|
|
||||||
|
public ObjFrameSettings(double focalLength) {
|
||||||
|
this(focalLength, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjFrameSettings(Vector3 cameraPos) {
|
||||||
|
this(null, cameraPos);
|
||||||
|
}
|
||||||
|
}
|
|
@ -49,7 +49,7 @@ public class ObjParser extends FileParser<FrameSet<List<Shape>>> {
|
||||||
camera.findZPos(object);
|
camera.findZPos(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ObjFrameSet(object, camera, rotation);
|
return new ObjFrameSet(object, camera, rotation, isDefaultPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Ładowanie…
Reference in New Issue