DisplacementMap effect shifts each pixel by a distance specified by the first two bands of of the specified FloatMap.
What is FloatMap?
FloatMap is a buffer that contains floating point data, intended for use as a parameter to effects such as DisplacementMap.
DisplcementMap provides following constructors to get an instance of DisplacementMap.
public DisplacementMap()
public DisplacementMap(FloatMap mapData)
DisplacementMap(FloatMap mapData, double offsetX, double offsetY, double scaleX, double scaleY)
mapData: specifies the map data for this displacement map effect. This specifies how to map pixels.
offsetX: specifies the offset by which all x coordinate offset values in the FloatMap are displaced after they are scaled
offsetY: specifies the offset by which all y coordinate offset values in the FloatMap are displaced after they are scaled
scaleX: specifies the scale factor by which all x coordinate offset values in the FloatMap are multiplied
scaleY: specifies the scale factor by which all y coordinate offset values in the FloatMap are multiplied
Follow step-by-step procedure to get an idea of DisplacementMap effect.
Step 1: Define FloatMap instance.
FloatMap floatMap1 = new FloatMap(300, 100);
Step 2: Populate FloatMap with samples.
for (int i = 0; i < width; i++) {
double v1 = (Math.sin(i / 20.0 * Math.PI) - 0.5) / 40.0;
for (int j = 0; j < height; j++) {
floatMap1.setSamples(i, j, 0.0f, (float) v1);
}
}
Step 3: Instantiate DisplacementMap with floatmap instance.
DisplacementMap displacementMap1 = new DisplacementMap(floatMap1);
displacementMap1.setScaleX(5);
displacementMap1.setScaleY(2);
Step 4: Set DisplacementMap effect to the ui widget.
text1.setEffect(displacementMap1);
Find the below working application.
displacementMapDemo.fxml
<?import javafx.scene.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<Group xmlns:fx="http://javafx.com/fxml" fx:controller="com.sample.app.effects.controller.DisplacementMapController">
<Text fx:id = "text1" text="Learning JavaFX" fill="lightgreen"
style="-fx-font-weight: bold; -fx-font-size: 50; -fx-font-family: Verdana; -fx-font-style: italic"
stroke="darkblue" strokeWidth="2"
underline="true"
x="50" y="50"/>
<Text fx:id = "text2" text="Learning JavaFX" fill="lightgreen"
style="-fx-font-weight: bold; -fx-font-size: 50; -fx-font-family: Verdana; -fx-font-style: italic"
stroke="darkblue" strokeWidth="2"
underline="true"
x="50" y="150"/>
<Text fx:id = "text3" text="Learning JavaFX" fill="lightgreen"
style="-fx-font-weight: bold; -fx-font-size: 50; -fx-font-family: Verdana; -fx-font-style: italic"
stroke="darkblue" strokeWidth="2"
underline="true"
x="50" y="250"/>
</Group>
DisplacementMapController.java
package com.sample.app.effects.controller;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.effect.DisplacementMap;
import javafx.scene.effect.FloatMap;
import javafx.scene.text.Text;
public class DisplacementMapController implements Initializable {
@FXML
private Text text1;
@FXML
private Text text2;
@FXML
private Text text3;
@Override
public void initialize(URL location, ResourceBundle resources) {
int width = 300;
int height = 100;
FloatMap floatMap1 = new FloatMap(300, 100);
FloatMap floatMap2 = new FloatMap(300, 100);
FloatMap floatMap3 = new FloatMap(300, 100);
for (int i = 0; i < width; i++) {
double v1 = (Math.sin(i / 20.0 * Math.PI) - 0.5) / 40.0;
double v2 = (Math.sin(i / 30.0 * Math.PI) - 0.5) / 40.0;
double v3 = (Math.sin(i / 40.0 * Math.PI) - 0.5) / 40.0;
for (int j = 0; j < height; j++) {
floatMap1.setSamples(i, j, 0.0f, (float) v1);
floatMap2.setSamples(i, j, 0.0f, (float) v2);
floatMap3.setSamples(i, j, 0.0f, (float) v3);
}
}
DisplacementMap displacementMap1 = new DisplacementMap(floatMap1);
displacementMap1.setScaleX(5);
displacementMap1.setScaleY(2);
DisplacementMap displacementMap2 = new DisplacementMap(floatMap2);
displacementMap2.setScaleX(5);
displacementMap2.setScaleY(2);
DisplacementMap displacementMap3 = new DisplacementMap(floatMap3);
displacementMap3.setScaleX(5);
displacementMap3.setScaleY(2);
text1.setEffect(displacementMap1);
text2.setEffect(displacementMap2);
text3.setEffect(displacementMap3);
}
}
DisplacementMapDemo.java
package com.sample.app.effects.controller;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class DisplacementMapDemo extends Application {
private static final String FXML_FILE = "/displacementMapDemo.fxml";
private static final String STAGE_TITLE = "Displacement Map Effect";
public static void main(String args[]) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = (Parent) FXMLLoader.load(this.getClass().getResource(FXML_FILE));
Scene scene = new Scene(root, 700, 400, Color.WHITE);
primaryStage.setTitle(STAGE_TITLE);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Output
No comments:
Post a Comment