import javafx.application.*; import javafx.beans.property.*; import javafx.beans.value.*; import javafx.geometry.*; import javafx.event.*; import javafx.stage.*; import javafx.scene.*; import javafx.scene.paint.*; import javafx.scene.shape.*; import javafx.scene.effect.*; import javafx.scene.input.*; import javafx.scene.text.*; import javafx.scene.control.*; import static java.lang.Math.*; public class JDispTest2 extends Application { IntegerProperty mapw = new IntegerProperty(); IntegerProperty maph = new IntegerProperty(); FloatMap fm = new FloatMap(); DoubleProperty level = new DoubleProperty(); public void start(Stage stage) { fm.widthProperty().bind(mapw); fm.heightProperty().bind(maph); final Text text = new Text("Hello!"); DisplacementMap dm = new DisplacementMap(); dm.setMapData(fm); text.setEffect(dm); text.layoutBoundsProperty().addListener(new InvalidationListener() { public void invalidated(ObservableValue obs) { mapw.set((int) Math.ceil(obs.getValue().getWidth())); maph.set((int) Math.ceil(obs.getValue().getHeight())); updateMapSin(); } }); mapw.set((int) Math.ceil(text.getLayoutBounds().getWidth())); maph.set((int) Math.ceil(text.getLayoutBounds().getHeight())); text.setTranslateX(30); text.setTranslateY(220); text.setFont(new Font(200)); text.setFill(Color.RED); text.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler() { public void handle(MouseEvent e) { if (text.getFont().getSize() == 200) { text.setFont(new Font(100)); } else { text.setFont(new Font(200)); } } }); Slider slider = new Slider(0, 1, 0); slider.setTranslateX(100); slider.setTranslateY(400); level.bind(slider.valueProperty()); level.addListener(new InvalidationListener() { public void invalidated(ObservableValue obs) { updateMapSin(); } }); Scene scene = new Scene(new Group(text, slider)); scene.setFill(Color.BLACK); stage.setTitle("Displace!"); stage.setScene(scene); stage.setWidth(600); stage.setHeight(500); stage.setVisible(true); } public void updateMapSin() { fillMapSin(level.getValue(), level.getValue()); } public void fillMapSin(double xamplitude, double yamplitude) { int w = fm.getWidth(); int h = fm.getHeight(); System.out.println(w+" "+h); for (int x = 0; x < w; x++) { double angle = PI * 2.0 * (x+0.5) / (w/4.0); float xval = (float) (sin(angle) * xamplitude); for (int y = 0; y < h; y++) { fm.setSample(x, y, 0, xval); } } for (int y = 0; y < h; y++) { double angle = PI * 2.0 * (y+0.5) / (h/4.0); float yval = (float) (sin(angle) * yamplitude); for (int x = 0; x < w; x++) { fm.setSample(x, y, 1, yval); } } } public static void main(String argv[]) { launch(JDispTest2.class, argv); } }