On Fri, 4 Sep 2020 23:20:43 GMT, Nir Lisker <nlis...@openjdk.org> wrote:
>> Thanks, the test runs now, but I've run into an issue with `snapshot`. >> >> `Node#snapshot` uses its scene parameters (like lights) to render the image, >> but if the node is in a subscene then the >> image will be wrong since it takes the wrong data. Bounds transforms like >> `sceneToLocal` and `localToScene` do take >> care of this case. I think that this is a mistake in `snapshot`, and maybe >> it should use the subscene, or a `boolean >> subScene` parameter should be offered, or `SnapshotParameters` should allow >> to specify it. > > Looks like there's more to it. I've created the test code: > > import javafx.application.Application; > import javafx.scene.Group; > import javafx.scene.PerspectiveCamera; > import javafx.scene.PointLight; > import javafx.scene.Scene; > import javafx.scene.control.Button; > import javafx.scene.control.Slider; > import javafx.scene.image.ImageView; > import javafx.scene.layout.BorderPane; > import javafx.scene.paint.Color; > import javafx.scene.shape.Box; > import javafx.stage.Stage; > > public class PointLightAttenuationTest extends Application { > > public static void main(String[] args) throws Exception { > launch(args); > } > > @Override > public void start(Stage stage) { > var light = new PointLight(Color.BLUE); > light.setTranslateZ(-10); > Box box = new Box(100, 100, 1); > var group = new Group(light, box); > > var scene = new Scene(group, 500, 500, true); > var camera = new PerspectiveCamera(true); > camera.setTranslateZ(-300); > camera.setFarClip(1000); > scene.setCamera(camera); > stage.setScene(scene); > stage.show(); > > var imageView = new ImageView(); > var snapshotButton = new Button("Node Snaphot"); > snapshotButton.setOnAction(e -> > imageView.setImage(scene.snapshot(null))); > > var slider = new Slider(0, 0.2, 0); > slider.setShowTickMarks(true); > slider.setShowTickLabels(true); > > light.linearAttenuationProperty().bindBidirectional(slider.valueProperty()); > > var snapshotStage = new Stage(); > snapshotStage.setScene(new Scene(new BorderPane(imageView, > snapshotButton, null, slider, null))); > snapshotStage.setWidth(600); > snapshotStage.setHeight(600); > snapshotStage.show(); > } > } > If the line `snapshotButton.setOnAction(e -> > imageView.setImage(scene.snapshot(null)));` is replaced to use > `box.snapshot(null, null)` then the snapshot is wrong. @nlisker Since there is a possible bug in snapshot, you might consider using Robot screen capture instead? Also, I don't know if you noticed, but there are now whitespace errors after the fix for [JDK-8240499](https://bugs.openjdk.java.net/browse/JDK-8240499). ------------- PR: https://git.openjdk.java.net/jfx/pull/43