2727import se .llbit .chunky .PersistentSettings ;
2828import se .llbit .chunky .launcher .LauncherSettings ;
2929import se .llbit .chunky .main .Chunky ;
30- import se .llbit .chunky .renderer .EmitterSamplingStrategy ;
31- import se .llbit .chunky .renderer .RenderController ;
32- import se .llbit .chunky .renderer .RenderManager ;
30+ import se .llbit .chunky .renderer .*;
3331import se .llbit .chunky .renderer .export .PictureExportFormat ;
3432import se .llbit .chunky .renderer .export .PictureExportFormats ;
3533import se .llbit .chunky .renderer .scene .AsynchronousSceneManager ;
3836import se .llbit .chunky .ui .Adjuster ;
3937import se .llbit .chunky .ui .DoubleAdjuster ;
4038import se .llbit .chunky .ui .IntegerAdjuster ;
39+ import se .llbit .chunky .ui .RegisterableCellAdapter ;
4140import se .llbit .chunky .ui .controller .RenderControlsFxController ;
4241import se .llbit .chunky .ui .dialogs .ShutdownAlert ;
4342import se .llbit .chunky .ui .render .RenderControlsTab ;
43+ import se .llbit .fxutil .CustomizedListCellFactory ;
4444import se .llbit .fxutil .Dialogs ;
4545import se .llbit .log .Log ;
4646import se .llbit .math .Octree ;
@@ -72,16 +72,16 @@ public class AdvancedTab extends ScrollPane implements RenderControlsTab, Initia
7272 @ FXML private DoubleAdjuster transmissivityCap ;
7373 @ FXML private IntegerAdjuster cacheResolution ;
7474 @ FXML private DoubleAdjuster animationTime ;
75- @ FXML private ChoiceBox <PictureExportFormat > outputMode ;
76- @ FXML private ChoiceBox < String > octreeImplementation ;
75+ @ FXML private ComboBox <PictureExportFormat > outputMode ;
76+ @ FXML private ComboBox < Octree . ImplementationFactory > octreeImplementation ;
7777 @ FXML private Button octreeSwitchImplementation ;
78- @ FXML private ChoiceBox < String > bvhMethod ;
79- @ FXML private ChoiceBox < String > biomeStructureImplementation ;
78+ @ FXML private ComboBox < BVH . Factory . BVHBuilder > bvhMethod ;
79+ @ FXML private ComboBox < BiomeStructure . Factory > biomeStructureImplementation ;
8080 @ FXML private IntegerAdjuster gridSize ;
8181 @ FXML private CheckBox preventNormalEmitterWithSampling ;
8282 @ FXML private CheckBox hideUnknownBlocks ;
83- @ FXML private ChoiceBox < String > rendererSelect ;
84- @ FXML private ChoiceBox < String > previewSelect ;
83+ @ FXML private ComboBox < Renderer > rendererSelect ;
84+ @ FXML private ComboBox < Renderer > previewSelect ;
8585 @ FXML private CheckBox showLauncher ;
8686
8787 public AdvancedTab () throws IOException {
@@ -95,6 +95,7 @@ public AdvancedTab() throws IOException {
9595 public void initialize (URL location , ResourceBundle resources ) {
9696 outputMode .getItems ().addAll (PictureExportFormats .getFormats ());
9797 outputMode .getSelectionModel ().select (PictureExportFormats .PNG );
98+ CustomizedListCellFactory .install (outputMode , PictureExportFormat ::getDescription );
9899 cpuLoad .setName ("CPU utilization" );
99100 cpuLoad .setTooltip ("CPU utilization percentage per render thread." );
100101 cpuLoad .setRange (1 , 100 );
@@ -196,77 +197,76 @@ public PictureExportFormat fromString(String string) {
196197 renderControls .showPopup ("This change takes effect after restarting Chunky." , renderThreads );
197198 });
198199
199- ArrayList <String > octreeNames = new ArrayList <>();
200+ ArrayList <Octree . ImplementationFactory > octreeImplementations = new ArrayList <>();
200201 StringBuilder tooltipTextBuilder = new StringBuilder ();
201202 for (Map .Entry <String , Octree .ImplementationFactory > entry : Octree .getEntries ()) {
202- octreeNames .add (entry .getKey ());
203+ octreeImplementations .add (entry .getValue ());
203204 tooltipTextBuilder .append (entry .getKey ());
204205 tooltipTextBuilder .append (": " );
205206 tooltipTextBuilder .append (entry .getValue ().getDescription ());
206207 tooltipTextBuilder .append ('\n' );
207208 }
208209 tooltipTextBuilder .append ("Requires reloading chunks to take effect." );
209- octreeImplementation .getItems ().addAll (octreeNames );
210+ octreeImplementation .getItems ().addAll (octreeImplementations );
210211 octreeImplementation .getSelectionModel ().selectedItemProperty ()
211212 .addListener ((observable , oldvalue , newvalue ) -> {
212- PersistentSettings .setOctreeImplementation (newvalue );
213- if (!scene .getOctreeImplementation ().equals (newvalue )) {
214- scene .setOctreeImplementation (newvalue );
213+ PersistentSettings .setOctreeImplementation (newvalue . getId () );
214+ if (!scene .getOctreeImplementation ().equals (getId () )) {
215+ scene .setOctreeImplementation (newvalue . getId () );
215216 scene .softRefresh ();
216217 }
217218 });
219+ CustomizedListCellFactory .install (octreeImplementation , RegisterableCellAdapter .INSTANCE );
218220 octreeImplementation .setTooltip (new Tooltip (tooltipTextBuilder .toString ()));
219221
220222 octreeSwitchImplementation .setOnAction (event -> Chunky .getCommonThreads ().submit (() -> {
221223 TaskTracker tracker = controller .getSceneManager ().getTaskTracker ();
222224 try {
223225 try (TaskTracker .Task task = tracker .task ("(1/2) Converting world octree" , 1000 )) {
224- scene .getWorldOctree ().switchImplementation (octreeImplementation .getValue (), task );
226+ scene .getWorldOctree ().switchImplementation (octreeImplementation .getValue (). getId () , task );
225227 }
226228 try (TaskTracker .Task task = tracker .task ("(2/2) Converting water octree" )) {
227- scene .getWaterOctree ().switchImplementation (octreeImplementation .getValue (), task );
229+ scene .getWaterOctree ().switchImplementation (octreeImplementation .getValue (). getId () , task );
228230 }
229231 } catch (IOException e ) {
230232 Log .error ("Switching octrees failed. Reload the scene.\n " , e );
231233 }
232234 }));
233235
234- ArrayList <String > bvhNames = new ArrayList <>();
235236 StringBuilder bvhMethodBuilder = new StringBuilder ();
236237 for (BVH .Factory .BVHBuilder builder : BVH .Factory .getImplementations ()) {
237- bvhNames .add (builder .getName ());
238238 bvhMethodBuilder .append (builder .getName ());
239239 bvhMethodBuilder .append (": " );
240240 bvhMethodBuilder .append (builder .getDescription ());
241241 bvhMethodBuilder .append ('\n' );
242242 }
243243 bvhMethodBuilder .append ("Requires reloading chunks to take effect." );
244- bvhMethod .getItems ().addAll (bvhNames );
245- bvhMethod .getSelectionModel ().select (PersistentSettings .getBvhMethod ());
244+ bvhMethod .getItems ().addAll (BVH . Factory . getImplementations () );
245+ bvhMethod .getSelectionModel ().select (BVH . Factory . getImplementation ( PersistentSettings .getBvhMethod () ));
246246 bvhMethod .getSelectionModel ().selectedItemProperty ()
247247 .addListener (((observable , oldValue , newValue ) -> {
248- PersistentSettings .setBvhMethod (newValue );
249- scene .setBvhImplementation (newValue );
248+ PersistentSettings .setBvhMethod (newValue . getId () );
249+ scene .setBvhImplementation (newValue . getId () );
250250 scene .softRefresh ();
251251 }));
252+ CustomizedListCellFactory .install (bvhMethod , RegisterableCellAdapter .INSTANCE );
252253 bvhMethod .setTooltip (new Tooltip (bvhMethodBuilder .toString ()));
253254
254- ArrayList <String > biomeStructureIds = new ArrayList <>();
255255 StringBuilder biomeStructureTooltipBuilder = new StringBuilder ();
256256 for (Registerable entry : BiomeStructure .REGISTRY .values ()) {
257- biomeStructureIds .add (entry .getId ());
258257 biomeStructureTooltipBuilder .append (entry .getName ());
259258 biomeStructureTooltipBuilder .append (": " );
260259 biomeStructureTooltipBuilder .append (entry .getDescription ());
261260 biomeStructureTooltipBuilder .append ('\n' );
262261 }
263262 biomeStructureTooltipBuilder .append ("Requires reloading chunks to take effect." );
264- biomeStructureImplementation .getItems ().addAll (biomeStructureIds );
263+ biomeStructureImplementation .getItems ().addAll (BiomeStructure . REGISTRY . values () );
265264 biomeStructureImplementation .getSelectionModel ().selectedItemProperty ()
266265 .addListener ((observable , oldvalue , newvalue ) -> {
267- scene .setBiomeStructureImplementation (newvalue );
268- PersistentSettings .setBiomeStructureImplementation (newvalue );
266+ scene .setBiomeStructureImplementation (newvalue . getId () );
267+ PersistentSettings .setBiomeStructureImplementation (newvalue . getId () );
269268 });
269+ CustomizedListCellFactory .install (biomeStructureImplementation , RegisterableCellAdapter .INSTANCE );
270270 biomeStructureImplementation .setTooltip (new Tooltip (biomeStructureTooltipBuilder .toString ()));
271271
272272 gridSize .setRange (4 , 64 );
@@ -306,11 +306,13 @@ public PictureExportFormat fromString(String string) {
306306
307307 rendererSelect .setTooltip (new Tooltip ("The renderer to use for rendering." ));
308308 rendererSelect .getSelectionModel ().selectedItemProperty ().addListener ((observable , oldValue , newValue ) ->
309- scene .setRenderer (newValue ));
309+ scene .setRenderer (newValue .getId ()));
310+ CustomizedListCellFactory .install (rendererSelect , RegisterableCellAdapter .INSTANCE );
310311
311312 previewSelect .setTooltip (new Tooltip ("The renderer to use for the preview." ));
312313 previewSelect .getSelectionModel ().selectedItemProperty ().addListener ((observable , oldValue , newValue ) ->
313- scene .setPreviewRenderer (newValue ));
314+ scene .setPreviewRenderer (newValue .getId ()));
315+ CustomizedListCellFactory .install (previewSelect , RegisterableCellAdapter .INSTANCE );
314316
315317 LauncherSettings settings = new LauncherSettings ();
316318 settings .load ();
@@ -339,15 +341,15 @@ public void update(Scene scene) {
339341 cpuLoad .set (PersistentSettings .getCPULoad ());
340342 rayDepth .set (scene .getRayDepth ());
341343 branchCount .set (scene .getBranchCount ());
342- octreeImplementation .getSelectionModel ().select (scene .getOctreeImplementation ());
343- bvhMethod .getSelectionModel ().select (scene .getBvhImplementation ());
344- biomeStructureImplementation .getSelectionModel ().select (scene .getBiomeStructureImplementation ());
344+ octreeImplementation .getSelectionModel ().select (Octree . getImplementation ( scene .getOctreeImplementation () ));
345+ bvhMethod .getSelectionModel ().select (BVH . Factory . getImplementation ( scene .getBvhImplementation () ));
346+ biomeStructureImplementation .getSelectionModel ().select (BiomeStructure . REGISTRY . get ( scene .getBiomeStructureImplementation () ));
345347 gridSize .set (scene .getGridSize ());
346348 preventNormalEmitterWithSampling .setSelected (scene .isPreventNormalEmitterWithSampling ());
347349 animationTime .set (scene .getAnimationTime ());
348350 hideUnknownBlocks .setSelected (scene .getHideUnknownBlocks ());
349- rendererSelect .getSelectionModel ().select (scene .getRenderer ());
350- previewSelect .getSelectionModel ().select (scene .getPreviewRenderer ());
351+ rendererSelect .getSelectionModel ().select (DefaultRenderManager . renderers . get ( scene .getRenderer () ));
352+ previewSelect .getSelectionModel ().select (DefaultRenderManager . previewRenderers . get ( scene .getPreviewRenderer () ));
351353 }
352354
353355 @ Override
@@ -372,24 +374,17 @@ public void setController(RenderControlsFxController controls) {
372374 }
373375 });
374376
375- // Set the renderers
376- rendererSelect .getItems ().clear ();
377- RenderManager renderManager = controller .getRenderManager ();
378- ArrayList <String > ids = new ArrayList <>();
379377
380- for (Registerable renderer : renderManager .getRenderers ())
381- ids .add (renderer .getId ());
378+ RenderManager renderManager = controller .getRenderManager ();
382379
383- rendererSelect .getItems ().addAll (ids );
384- rendererSelect .getSelectionModel ().select (scene .getRenderer ());
380+ // Set the renderers
381+ rendererSelect .getItems ().clear ();
382+ rendererSelect .getItems ().addAll (renderManager .getRenderers ());
383+ rendererSelect .getSelectionModel ().select (renderManager .getRenderers ().stream ().filter (r -> r .getId ().equals (scene .getRenderer ())).findFirst ().orElse (null ));
385384
386- // Set the preview renderers, reuse the `ids` ArrayList
385+ // Set the preview renderers
387386 previewSelect .getItems ().clear ();
388- ids .clear ();
389- for (Registerable render : renderManager .getPreviewRenderers ())
390- ids .add (render .getId ());
391-
392- previewSelect .getItems ().addAll (ids );
393- previewSelect .getSelectionModel ().select (scene .getPreviewRenderer ());
387+ previewSelect .getItems ().addAll (renderManager .getPreviewRenderers ());
388+ previewSelect .getSelectionModel ().select (renderManager .getPreviewRenderers ().stream ().filter (r -> r .getId ().equals (scene .getPreviewRenderer ())).findFirst ().orElse (null ));
394389 }
395390}
0 commit comments