|
|
|
|
@ -1,17 +1,14 @@
|
|
|
|
|
package visualiser.layout;
|
|
|
|
|
|
|
|
|
|
import javafx.beans.value.ChangeListener;
|
|
|
|
|
import javafx.beans.value.ObservableValue;
|
|
|
|
|
import javafx.collections.ListChangeListener;
|
|
|
|
|
import javafx.collections.ObservableList;
|
|
|
|
|
import javafx.geometry.Point3D;
|
|
|
|
|
import javafx.scene.Group;
|
|
|
|
|
import javafx.scene.PerspectiveCamera;
|
|
|
|
|
import javafx.scene.SubScene;
|
|
|
|
|
import javafx.scene.input.PickResult;
|
|
|
|
|
import javafx.scene.layout.Pane;
|
|
|
|
|
import javafx.scene.paint.Color;
|
|
|
|
|
import javafx.scene.shape.Shape;
|
|
|
|
|
import javafx.scene.shape.Shape3D;
|
|
|
|
|
import javafx.scene.transform.Rotate;
|
|
|
|
|
import javafx.scene.transform.Translate;
|
|
|
|
|
@ -25,6 +22,10 @@ import java.util.Map;
|
|
|
|
|
* sky box, whose textures are set with special methods.
|
|
|
|
|
*/
|
|
|
|
|
public class View3D extends Pane {
|
|
|
|
|
/**
|
|
|
|
|
* Container for group and camera
|
|
|
|
|
*/
|
|
|
|
|
private SubScene scene;
|
|
|
|
|
/**
|
|
|
|
|
* Observable list of renderable items
|
|
|
|
|
*/
|
|
|
|
|
@ -65,39 +66,42 @@ public class View3D extends Pane {
|
|
|
|
|
* Angle between ground plane and camera direction
|
|
|
|
|
*/
|
|
|
|
|
private Rotate pitch;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Single listener for subject heading changes
|
|
|
|
|
*/
|
|
|
|
|
private ChangeListener<? super Number> pivotHeading = (o, prev, curr) -> yaw.setAngle((double)curr);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Single listener for subject position (x) changes
|
|
|
|
|
*/
|
|
|
|
|
private ChangeListener<? super Number> pivotX = (o, prev, curr) -> pivot.setX((double)curr);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Single listener for subject position (y) changes
|
|
|
|
|
*/
|
|
|
|
|
private ChangeListener<? super Number> pivotY = (o, prev, curr) -> pivot.setY((double)curr);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Single listener for subject position (z) changes
|
|
|
|
|
*/
|
|
|
|
|
private ChangeListener<? super Number> pivotZ = (o, prev, curr) -> pivot.setZ((double)curr);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Distance to switch from third person to bird's eye
|
|
|
|
|
*/
|
|
|
|
|
private double THIRD_PERSON_LIMIT = 100;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Default constructor for View3D. Sets up Scene and PerspectiveCamera.
|
|
|
|
|
*/
|
|
|
|
|
public View3D() {
|
|
|
|
|
world = new Group();
|
|
|
|
|
selectionMap = new HashMap<>();
|
|
|
|
|
target = null;
|
|
|
|
|
this.world = new Group();
|
|
|
|
|
this.selectionMap = new HashMap<>();
|
|
|
|
|
this.target = null;
|
|
|
|
|
this.scene = new SubScene(world, 300, 300);
|
|
|
|
|
|
|
|
|
|
SubScene scene = new SubScene(world, 300, 300);
|
|
|
|
|
scene.widthProperty().bind(this.widthProperty());
|
|
|
|
|
scene.heightProperty().bind(this.heightProperty());
|
|
|
|
|
scene.setFill(new Color(0.2, 0.6, 1, 1));
|
|
|
|
|
|
|
|
|
|
scene.setCamera(buildCamera());
|
|
|
|
|
|
|
|
|
|
scene.setOnMousePressed(e -> {
|
|
|
|
|
PickResult result = e.getPickResult();
|
|
|
|
|
if(result != null && result.getIntersectedNode() != null && result.getIntersectedNode() instanceof Shape3D) {
|
|
|
|
|
trackSubject(selectionMap.get(result.getIntersectedNode()));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.getChildren().add(scene);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -142,6 +146,15 @@ public class View3D extends Pane {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void enableTracking() {
|
|
|
|
|
scene.setOnMousePressed(e -> {
|
|
|
|
|
PickResult result = e.getPickResult();
|
|
|
|
|
if(result != null && result.getIntersectedNode() != null && result.getIntersectedNode() instanceof Shape3D) {
|
|
|
|
|
trackSubject(selectionMap.get(result.getIntersectedNode()));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void untrackSubject() {
|
|
|
|
|
if(target != null) {
|
|
|
|
|
target.getPosition().xProperty().removeListener(pivotX);
|
|
|
|
|
@ -189,6 +202,12 @@ public class View3D extends Pane {
|
|
|
|
|
this.distance.setZ(-distance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Adds delta to current distance and changes camera mode if applicable.
|
|
|
|
|
* Third person limit specifies the distance at which a third person camera
|
|
|
|
|
* switches to bird's-eye, remaining focused on the same position.
|
|
|
|
|
* @param delta amount to change distance by
|
|
|
|
|
*/
|
|
|
|
|
public void updateDistance(double delta) {
|
|
|
|
|
double distance = -this.distance.getZ() + delta;
|
|
|
|
|
|
|
|
|
|
|