Merge branch 'storyA_sounds' into storyD-3D
# Conflicts: # racevisionGame/src/main/java/visualiser/layout/SeaSurface.java # racevisionGame/src/main/java/visualiser/layout/SkyBox.java
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
package visualiser.layout;
|
||||
|
||||
import javafx.scene.shape.Shape3D;
|
||||
|
||||
/**
|
||||
* Created by connortaylorbrown on 13/09/17.
|
||||
*/
|
||||
public class Annotation3D extends Subject3D {
|
||||
/**
|
||||
* Constructor for view subject wrapper
|
||||
*
|
||||
* @param mesh to be rendered
|
||||
*/
|
||||
public Annotation3D(Shape3D mesh) {
|
||||
super(mesh, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent rescaling of this subject
|
||||
* @param scale ignored
|
||||
*/
|
||||
@Override
|
||||
public void setScale(double scale) {}
|
||||
}
|
||||
@@ -62,12 +62,12 @@ public class Boundary3D {
|
||||
double c = Math.sqrt(a * a + b * b);
|
||||
|
||||
|
||||
Subject3D bound1 = new Subject3D(new Sphere(thickness * 2));
|
||||
Subject3D bound1 = new Subject3D(new Sphere(thickness * 2),0);
|
||||
bound1.setX(graphCoord1.getX());
|
||||
bound1.setZ(graphCoord1.getY());
|
||||
boundaryNodes.add(bound1);
|
||||
|
||||
Subject3D connector = new Subject3D(new Box(c, thickness, thickness));
|
||||
Subject3D connector = new Subject3D(new Box(c, thickness, thickness),0);
|
||||
connector.setX(avgCoord.getX());
|
||||
connector.setZ(avgCoord.getY());
|
||||
double angle = 90 + Math.toDegrees(GPSConverter.getAngle(graphCoord2, graphCoord1));
|
||||
|
||||
@@ -24,7 +24,7 @@ public class SeaSurface extends Subject3D {
|
||||
* @param freq frequency the perlin noise is to be generated at
|
||||
*/
|
||||
public SeaSurface(int size, double freq){
|
||||
super(createSurface(size, freq));
|
||||
super(createSurface(size, freq),0);
|
||||
image = new Image(getClass().getClassLoader().getResourceAsStream("images/skybox/ThickCloudsWaterDown2048.png"));
|
||||
}
|
||||
|
||||
|
||||
@@ -50,10 +50,10 @@ public class SkyBox {
|
||||
surface.setRotate(180);
|
||||
|
||||
surface.setTranslateX(x);
|
||||
surface.setTranslateY(y - size/2 + yshift + clipOverlap);
|
||||
surface.setTranslateY(y - size + 1);
|
||||
surface.setTranslateZ(z);
|
||||
|
||||
Subject3D top = new SkyBoxPlane(surface);
|
||||
Subject3D top = new Subject3D(surface,0);
|
||||
skyBoxPlanes.add(top);
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public class SkyBox {
|
||||
surface.setTranslateZ(z + size/2 - clipOverlap);
|
||||
|
||||
|
||||
Subject3D right = new SkyBoxPlane(surface);
|
||||
Subject3D right = new Subject3D(surface,0);
|
||||
skyBoxPlanes.add(right);
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ public class SkyBox {
|
||||
surface.setTranslateZ(z - size/2 + clipOverlap);
|
||||
|
||||
|
||||
Subject3D left = new SkyBoxPlane(surface);
|
||||
Subject3D left = new Subject3D(surface,0);
|
||||
skyBoxPlanes.add(left);
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public class SkyBox {
|
||||
surface.setTranslateY(y + yshift);
|
||||
surface.setTranslateZ(z);
|
||||
|
||||
Subject3D back = new SkyBoxPlane(surface);
|
||||
Subject3D back = new Subject3D(surface,0);
|
||||
skyBoxPlanes.add(back);
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ public class SkyBox {
|
||||
surface.setTranslateY(y + yshift);
|
||||
surface.setTranslateZ(z);
|
||||
|
||||
Subject3D front = new SkyBoxPlane(surface);
|
||||
Subject3D front = new Subject3D(surface,0);
|
||||
skyBoxPlanes.add(front);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,10 @@ public class Subject3D {
|
||||
* Rendered mesh
|
||||
*/
|
||||
private Shape3D mesh;
|
||||
/**
|
||||
* Source ID of subject in game model
|
||||
*/
|
||||
private int sourceID;
|
||||
|
||||
/**
|
||||
* Position translation updated by state listeners
|
||||
@@ -30,8 +34,9 @@ public class Subject3D {
|
||||
* Constructor for view subject wrapper
|
||||
* @param mesh to be rendered
|
||||
*/
|
||||
public Subject3D(Shape3D mesh) {
|
||||
public Subject3D(Shape3D mesh, int sourceID) {
|
||||
this.mesh = mesh;
|
||||
this.sourceID = sourceID;
|
||||
this.scale = new Scale();
|
||||
this.position = new Translate();
|
||||
this.heading = new Rotate(0, Rotate.Y_AXIS);
|
||||
@@ -43,6 +48,10 @@ public class Subject3D {
|
||||
return mesh;
|
||||
}
|
||||
|
||||
public int getSourceID() {
|
||||
return sourceID;
|
||||
}
|
||||
|
||||
public Translate getPosition() {
|
||||
return this.position;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package visualiser.layout;
|
||||
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.collections.ListChangeListener;
|
||||
import javafx.collections.ObservableList;
|
||||
@@ -31,11 +33,15 @@ public class View3D extends Pane {
|
||||
/**
|
||||
* Map for selecting Subject3D from Shape3D
|
||||
*/
|
||||
private Map<Shape3D, Subject3D> selectionMap;
|
||||
private Map<Shape3D, Subject3D> shapeMap;
|
||||
/**
|
||||
* Map for selecting Shape3D from source ID
|
||||
*/
|
||||
private Map<Integer, Shape3D> sourceMap;
|
||||
/**
|
||||
* Subject tracked by camera
|
||||
*/
|
||||
private Subject3D target;
|
||||
private ObjectProperty<Subject3D> target;
|
||||
/**
|
||||
* Rendering container for shapes
|
||||
*/
|
||||
@@ -95,8 +101,9 @@ public class View3D extends Pane {
|
||||
*/
|
||||
public View3D(boolean fill) {
|
||||
this.world = new Group();
|
||||
this.selectionMap = new HashMap<>();
|
||||
this.target = null;
|
||||
this.shapeMap = new HashMap<>();
|
||||
this.sourceMap = new HashMap<>();
|
||||
this.target = new SimpleObjectProperty<>(null);
|
||||
this.scene = new SubScene(world, 300, 300);
|
||||
|
||||
scene.widthProperty().bind(this.widthProperty());
|
||||
@@ -148,17 +155,23 @@ public class View3D extends Pane {
|
||||
if (c.wasRemoved() || c.wasAdded()) {
|
||||
for (Subject3D shape : c.getRemoved()) {
|
||||
world.getChildren().remove(shape.getMesh());
|
||||
selectionMap.remove(shape.getMesh());
|
||||
shapeMap.remove(shape.getMesh());
|
||||
sourceMap.remove(shape.getSourceID());
|
||||
}
|
||||
for (Subject3D shape : c.getAddedSubList()) {
|
||||
world.getChildren().add(shape.getMesh());
|
||||
selectionMap.put(shape.getMesh(), shape);
|
||||
shapeMap.put(shape.getMesh(), shape);
|
||||
sourceMap.put(shape.getSourceID(), shape.getMesh());
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Shape3D getShape(int sourceID) {
|
||||
return sourceMap.get(sourceID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept mouse clicks on subjects in view. The applied listener cannot be removed.
|
||||
*/
|
||||
@@ -167,12 +180,16 @@ public class View3D extends Pane {
|
||||
PickResult result = e.getPickResult();
|
||||
if(result != null && result.getIntersectedNode() != null && result.getIntersectedNode() instanceof Shape3D) {
|
||||
untrackSubject();
|
||||
trackSubject(selectionMap.get(result.getIntersectedNode()));
|
||||
trackSubject(shapeMap.get(result.getIntersectedNode()));
|
||||
setThirdPerson();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ObjectProperty<Subject3D> targetProperty() {
|
||||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures camera to third person view
|
||||
*/
|
||||
@@ -201,11 +218,12 @@ public class View3D extends Pane {
|
||||
* Stop camera from following the last selected subject
|
||||
*/
|
||||
private void untrackSubject() {
|
||||
if(target != null) {
|
||||
target.getPosition().xProperty().removeListener(pivotX);
|
||||
target.getPosition().yProperty().removeListener(pivotY);
|
||||
target.getPosition().zProperty().removeListener(pivotZ);
|
||||
target.getHeading().angleProperty().removeListener(pivotHeading);
|
||||
if(target.get() != null) {
|
||||
target.get().getPosition().xProperty().removeListener(pivotX);
|
||||
target.get().getPosition().yProperty().removeListener(pivotY);
|
||||
target.get().getPosition().zProperty().removeListener(pivotZ);
|
||||
target.get().getHeading().angleProperty().removeListener(pivotHeading);
|
||||
target.setValue(null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -214,15 +232,15 @@ public class View3D extends Pane {
|
||||
* @param subject to track
|
||||
*/
|
||||
private void trackSubject(Subject3D subject) {
|
||||
target = subject;
|
||||
target.set(subject);
|
||||
|
||||
updatePivot(target.getPosition());
|
||||
setYaw(target.getHeading().getAngle());
|
||||
updatePivot(target.get().getPosition());
|
||||
setYaw(target.get().getHeading().getAngle());
|
||||
|
||||
target.getPosition().xProperty().addListener(pivotX);
|
||||
target.getPosition().yProperty().addListener(pivotY);
|
||||
target.getPosition().zProperty().addListener(pivotZ);
|
||||
target.getHeading().angleProperty().addListener(pivotHeading);
|
||||
target.get().getPosition().xProperty().addListener(pivotX);
|
||||
target.get().getPosition().yProperty().addListener(pivotY);
|
||||
target.get().getPosition().zProperty().addListener(pivotZ);
|
||||
target.get().getHeading().angleProperty().addListener(pivotHeading);
|
||||
}
|
||||
|
||||
public void setNearClip(double nearClip) {
|
||||
@@ -233,6 +251,10 @@ public class View3D extends Pane {
|
||||
this.farClip = farClip;
|
||||
}
|
||||
|
||||
public Translate getPivot() {
|
||||
return pivot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the coordinates of the camera pivot once.
|
||||
* @param pivot source of coordinates
|
||||
|
||||
Reference in New Issue
Block a user