package visualiser.layout; import javafx.geometry.Point3D; import javafx.scene.image.Image; import javafx.scene.image.PixelWriter; import javafx.scene.image.WritableImage; import javafx.scene.paint.Color; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.MeshView; import javafx.scene.transform.Rotate; import visualiser.utils.PerlinNoiseGenerator; import java.util.ArrayList; import java.util.List; /** * Creates a skyBox */ public class SkyBox { private int size; private double x; private double y; private double z; private double freq; private List skyBoxPlanes = new ArrayList<>(); public SkyBox(int edgeLength, double freq, double x, double y, double z) { this.size = edgeLength; this.x = x; this.y = y; this.z = z; this.freq = freq; makeSkyBox(); } private void makeSkyBox() { //addTop(); addFront(); //addBack(); //addLeft(); //addRight(); //addSeaOverlay(); } private void addTop() { MeshView surface = makeSurface(new Image(getClass().getClassLoader().getResourceAsStream("images/skybox/skyTop.png"))); surface.setRotationAxis(new Point3D(0, 0, 1)); surface.setRotate(180); surface.setTranslateX(x); surface.setTranslateY(y - size + 0.01); surface.setTranslateZ(z); Subject3D top = new Subject3D(surface); skyBoxPlanes.add(top); } private void addLeft() { MeshView surface = makeSurface(new Image(getClass().getClassLoader().getResourceAsStream("images/skybox/skyLeft.png"))); surface.setTranslateX(size/2); surface.setTranslateY(size/2); surface.setRotationAxis(new Point3D(1, 0, 0)); surface.setRotate(90); surface.setTranslateX(-size/2); surface.setTranslateY(-size/2); surface.setTranslateX(x); surface.setTranslateY(y - size/2); surface.setTranslateZ(z + size/2); Subject3D left = new Subject3D(surface); skyBoxPlanes.add(left); } private void addRight() { MeshView surface = makeSurface(new Image(getClass().getClassLoader().getResourceAsStream("images/skybox/skyRight.png"))); surface.setTranslateX(size/2); surface.setTranslateY(size/2); surface.setRotationAxis(new Point3D(1, 0, 0)); surface.setRotate(-90); surface.setTranslateX(-size/2); surface.setTranslateY(-size/2); surface.setScaleX(-1); surface.setScaleZ(-1); surface.setTranslateX(x); surface.setTranslateY(y - size/2); surface.setTranslateZ(z - size/2); Subject3D right = new Subject3D(surface); skyBoxPlanes.add(right); } private void addBack() { MeshView surface = makeSurface(new Image(getClass().getClassLoader().getResourceAsStream("images/skybox/skyBack.png"))); surface.getTransforms().add(new Rotate(90, 0, 0)); surface.setRotationAxis(new Point3D(1, 0, 0)); surface.setRotate(-90); surface.setScaleY(-1); surface.setScaleZ(-1); surface.setTranslateX(x - size/2); surface.setTranslateY(y - size/2); surface.setTranslateZ(z); Subject3D back = new Subject3D(surface); skyBoxPlanes.add(back); } private void addFront() { MeshView surface = makeSurface(new Image(getClass().getClassLoader().getResourceAsStream("images/skybox/skyFront.png"))); surface.getTransforms().add(new Rotate(90, 0, 0)); surface.setRotationAxis(new Point3D(1, 0, 0)); surface.setRotate(90); surface.setScaleY(-1); surface.setScaleZ(-1); surface.setTranslateX(x + size/2); surface.setTranslateY(y - size/2); surface.setTranslateZ(z); Subject3D front = new Subject3D(surface); skyBoxPlanes.add(front); } private MeshView makeSurface(Image diffuseMap) { PhongMaterial material = new PhongMaterial(); //material.setDiffuseColor(Color.BLUE); material.setDiffuseMap(diffuseMap); //material.setSpecularColor(Color.WHITE); Plane3D plane = new Plane3D(size, size, 10, 10); MeshView surface = new MeshView(plane); surface.setMaterial(material); surface.setMouseTransparent(true); return surface; } private void addSeaOverlay() { SeaSurface seaSurface = new SeaSurface(size * 3, 200); seaSurface.setX(x); seaSurface.setY(y - size/4 + 1); seaSurface.setZ(z); skyBoxPlanes.add(seaSurface); } public List getSkyBoxPlanes() { return skyBoxPlanes; } }