import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.animation.TimelineBuilder;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.GroupBuilder;
import javafx.scene.Parent;
import javafx.scene.PerspectiveCameraBuilder;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.RectangleBuilder;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* @reference: http://sett.ociweb.com/sett/settMay2012.html
*/
public class DepthBuffer extends Application {
private DoubleProperty translateZForNode1 = new SimpleDoubleProperty();
private DoubleProperty translateZForNode2 = new SimpleDoubleProperty();
private DoubleProperty translateZForNode3 = new SimpleDoubleProperty();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
stage.setTitle("Depth Buffer");
stage.setScene(makeScene());
stage.show();
animate();
}
private Scene makeScene() {
return SceneBuilder.create().width(500).height(500).root(createRoot())
.camera(PerspectiveCameraBuilder.create().build())
.depthBuffer(true).build();
}
private Parent createRoot() {
Rectangle node1 = RectangleBuilder.create().x(-150).y(-150)
.translateZ(-100).width(200).height(200).fill(Color.RED)
.build();
Rectangle node2 = RectangleBuilder.create().x(-100).y(-100).width(200)
.height(200).fill(Color.GREEN).build();
Rectangle node3 = RectangleBuilder.create().x(-50).y(-50)
.translateZ(100).width(200).height(200).fill(Color.BLUE)
.build();
node1.translateZProperty().bind(translateZForNode1);
node2.translateZProperty().bind(translateZForNode2);
node3.translateZProperty().bind(translateZForNode3);
return GroupBuilder.create().children(node1, node2, node3)
.translateX(250).translateY(250).build();
}
private void animate() {
TimelineBuilder
.create()
.cycleCount(Timeline.INDEFINITE)
.autoReverse(true)
.keyFrames(
new KeyFrame(Duration.seconds(0), new KeyValue(
translateZForNode1, -100), new KeyValue(
translateZForNode2, -10), new KeyValue(
translateZForNode3, 100)),
new KeyFrame(Duration.seconds(2), new KeyValue(
translateZForNode1, 100), new KeyValue(
translateZForNode2, 90), new KeyValue(
translateZForNode3, -100))).build().play();
}
}