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:
Joseph Gardner
2017-09-14 14:16:53 +12:00
61 changed files with 1279 additions and 945 deletions
@@ -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