RFR: 8260013: Snapshot does not work for nodes in a subscene
    Michael Strauß 
    mstrauss at openjdk.org
       
    Mon Jan 15 21:28:30 UTC 2024
    
    
  
On Fri, 12 Jan 2024 14:11:14 GMT, Lukasz Kostyra <lkostyra at openjdk.org> wrote:
> Originally this issue showed the problem of Node being incorrectly rendered (clipped) when snapshotting, compared to a snapshot of the whole Scene. Later on there was another problem added - lights not being taken into account if they are added to a SubScene.
> 
> As it later turned out, the original problem from this bug report is a problem with ParallelCamera incorrectly estimating near/far clipping planes, which just happened to reveal itself while snapshotting a Node. During testing I found out you can make the Node clip regardless of snapshot mechanism. Clipping issue was moved to a separate bug report and this PR only fixes the inconsistency in lights being gathered for a snapshot.
> 
> `Scene.doSnapshot()` was expanded to also check if SubScene provided to it is non-null and to fetch lights assigned to it. Scenario was tested with added SnapshotLightsTest.
> 
> Rest of the tests were checked and don't produce any noticeable regressions.
modules/javafx.graphics/src/main/java/javafx/scene/Scene.java line 1364:
> 1362:         // Grab the lights from the scene and/or subscene
> 1363:         context.lights = null;
> 1364:         int totalLightCount = 0;
Here's a suggestion: you might be able to replace all of the new code, including the `accumulateLightsForSnapshot` method, with the following shorter code:
Stream<NGLightBase> lights = Stream.concat(
    Optional.ofNullable(scene).stream().flatMap(s -> s.lights.stream()).map(LightBase::getPeer),
    Optional.ofNullable(subScene).stream().flatMap(s -> s.getLights().stream()).map(LightBase::getPeer));
context.lights = lights.toArray(NGLightBase[]::new);
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1332#discussion_r1452752285
    
    
More information about the openjfx-dev
mailing list