88import java .awt .image .BufferedImage ;
99import java .io .File ;
1010import java .io .IOException ;
11- import java .util .prefs .Preferences ;
1211import java .util .List ;
1312import java .util .function .Consumer ;
14- import javafx .beans .binding .Bindings ;
1513
1614import javafx .animation .PauseTransition ;
1715import javafx .application .Platform ;
18- import javafx .beans .property .BooleanProperty ;
1916import javafx .beans .property .DoubleProperty ;
20- import javafx .beans .property .SimpleBooleanProperty ;
2117import javafx .beans .property .SimpleDoubleProperty ;
18+ import javafx .beans .value .ObservableValue ;
2219import javafx .embed .swing .SwingFXUtils ;
2320import javafx .event .Event ;
2421import javafx .fxml .FXML ;
2522import javafx .geometry .Pos ;
2623import javafx .scene .*;
2724import javafx .scene .control .*;
28- import javafx .scene .control .Alert .AlertType ;
2925import javafx .scene .image .WritableImage ;
3026import javafx .scene .layout .*;
3127import javafx .scene .paint .Color ;
32- import javafx .scene .shape .DrawMode ;
3328import javafx .scene .text .Font ;
3429import javafx .scene .text .Text ;
3530import javafx .scene .text .TextAlignment ;
@@ -80,6 +75,8 @@ public void initialize() {
8075 viewerScene .heightProperty ().bind (rootPane .heightProperty ());
8176 viewerScene .widthProperty ().bind (rootPane .widthProperty ());
8277
78+ rerenderSceneOnChange (viewerScene .boundsInParentProperty ());
79+
8380 // TODO: This just makes our THOR-Soar setup look nice immediately because we use Z as
8481 // "up" in 3D space (towards the ceiling)
8582 rootGroup .getTransforms ().add (new Rotate (180 , Rotate .X_AXIS ));
@@ -92,13 +89,7 @@ public void initialize() {
9289 viewerScene .setCamera (camera );
9390
9491 for (Transform t : List .of (cameraYaw , cameraPitch , cameraRoll , cameraTranslation )) {
95- t .setOnTransformChanged (
96- value ->
97- Platform .runLater (
98- () ->
99- Event .fireEvent (
100- viewerScene ,
101- new SVSViewerEvent (viewerScene , SVSViewerEvent .SCENE_RERENDERED ))));
92+ t .setOnTransformChanged (value -> requestSceneRerender ());
10293 }
10394
10495 // Handle keyboard events
@@ -180,20 +171,13 @@ public void initialize() {
180171 viewerScene .setFocusTraversable (true );
181172
182173 initMouseControls (shapeGroup , viewerScene );
183- rootGroup
184- .boundsInParentProperty ()
185- .addListener (
186- (observable , oldValue , newValue ) ->
187- Platform .runLater (
188- () ->
189- Event .fireEvent (
190- viewerScene ,
191- new SVSViewerEvent (viewerScene , SVSViewerEvent .SCENE_RERENDERED ))));
174+
175+ rerenderSceneOnChange (rootGroup .boundsInParentProperty ());
192176
193177 this .geometryManager =
194178 new GeometryManager (preferences , rootPane , shapeGroup , this ::showMessage );
195179 viewerScene .addEventFilter (
196- SVSViewerEvent .SCENE_RERENDERED , e -> geometryManager .updateLabelPositions ());
180+ SVSViewerEvent .SCENE_RERENDER_REQUESTED , e -> geometryManager .updateLabelPositions ());
197181
198182 Consumer <String > inputProcessor =
199183 (String line ) -> {
@@ -235,6 +219,18 @@ public void initialize() {
235219 initMessageStack (messageStack );
236220 }
237221
222+ private void rerenderSceneOnChange (ObservableValue <?> observable ) {
223+ observable .addListener ((obs , oldValue , newValue ) -> requestSceneRerender ());
224+ }
225+
226+ private void requestSceneRerender () {
227+ Platform .runLater (
228+ () ->
229+ Event .fireEvent (
230+ viewerScene ,
231+ new SVSViewerEvent (viewerScene , SVSViewerEvent .SCENE_RERENDER_REQUESTED )));
232+ }
233+
238234 private void initMessageStack (VBox messageStack ) {
239235 messageStack .setLayoutX (10 );
240236 // under the menu bar. TODO: should use logic to ensure that, rather than hardcoding a value
0 commit comments