From 31b184690efd1a7e928b53c7b8c3a0f7465a1b40 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Tue, 28 Dec 2021 01:13:18 +0100 Subject: [PATCH] Show names and descriptions as tooltips for renderer, bvh and output mode dropdowns. --- .../llbit/chunky/renderer/RenderManager.java | 4 +- .../postprocessing/PostProcessingFilter.java | 6 +- .../chunky/ui/RegisterableCellAdapter.java | 26 +++++ .../chunky/ui/render/tabs/AdvancedTab.java | 95 +++++++++---------- .../java/se/llbit/math/BigPackedOctree.java | 12 ++- .../java/se/llbit/math/NodeBasedOctree.java | 12 ++- chunky/src/java/se/llbit/math/Octree.java | 12 ++- .../src/java/se/llbit/math/PackedOctree.java | 12 ++- chunky/src/java/se/llbit/math/bvh/BVH.java | 14 +-- .../java/se/llbit/math/bvh/MidpointBVH.java | 7 +- chunky/src/java/se/llbit/math/bvh/SahBVH.java | 7 +- .../src/java/se/llbit/math/bvh/SahMaBVH.java | 7 +- .../chunky/ui/render/tabs/AdvancedTab.fxml | 14 +-- 13 files changed, 151 insertions(+), 77 deletions(-) create mode 100644 chunky/src/java/se/llbit/chunky/ui/RegisterableCellAdapter.java diff --git a/chunky/src/java/se/llbit/chunky/renderer/RenderManager.java b/chunky/src/java/se/llbit/chunky/renderer/RenderManager.java index c89372cd63..57abe00e7b 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/RenderManager.java +++ b/chunky/src/java/se/llbit/chunky/renderer/RenderManager.java @@ -39,12 +39,12 @@ public interface RenderManager { /** * Get all available {@code Renderer}s. */ - Collection getRenderers(); + Collection getRenderers(); /** * Get all available preview {@code Renderer}s. */ - Collection getPreviewRenderers(); + Collection getPreviewRenderers(); /** * Instructs the renderer to change its CPU load. diff --git a/chunky/src/java/se/llbit/chunky/renderer/postprocessing/PostProcessingFilter.java b/chunky/src/java/se/llbit/chunky/renderer/postprocessing/PostProcessingFilter.java index 2de0c0ad5c..cb9168d9d6 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/postprocessing/PostProcessingFilter.java +++ b/chunky/src/java/se/llbit/chunky/renderer/postprocessing/PostProcessingFilter.java @@ -2,6 +2,7 @@ import se.llbit.chunky.plugin.PluginApi; import se.llbit.chunky.resources.BitmapImage; +import se.llbit.util.Registerable; import se.llbit.util.TaskTracker; /** @@ -14,7 +15,7 @@ * PixelPostProcessingFilter} instead. */ @PluginApi -public interface PostProcessingFilter { +public interface PostProcessingFilter extends Registerable { /** * Post process the entire frame * @param width The width of the image @@ -30,12 +31,14 @@ public interface PostProcessingFilter { * Get name of the post processing filter * @return The name of the post processing filter */ + @Override String getName(); /** * Get description of the post processing filter * @return The description of the post processing filter */ + @Override default String getDescription() { return null; } @@ -44,5 +47,6 @@ default String getDescription() { * Get id of the post processing filter * @return The id of the post processing filter */ + @Override String getId(); } diff --git a/chunky/src/java/se/llbit/chunky/ui/RegisterableCellAdapter.java b/chunky/src/java/se/llbit/chunky/ui/RegisterableCellAdapter.java new file mode 100644 index 0000000000..cf90dbb837 --- /dev/null +++ b/chunky/src/java/se/llbit/chunky/ui/RegisterableCellAdapter.java @@ -0,0 +1,26 @@ +package se.llbit.chunky.ui; + +import javafx.scene.control.Tooltip; +import se.llbit.fxutil.CustomizedListCellFactory; +import se.llbit.util.Registerable; + +public class RegisterableCellAdapter implements CustomizedListCellFactory.Adapter { + public static final RegisterableCellAdapter INSTANCE = new RegisterableCellAdapter(); + + private RegisterableCellAdapter() { + } + + @Override + public String getLabel(Registerable item) { + return item.getName(); + } + + @Override + public Tooltip getTooltip(Registerable item) { + String description = item.getDescription(); + if (description != null && !description.isEmpty()) { + return new Tooltip(item.getDescription()); + } + return null; + } +} diff --git a/chunky/src/java/se/llbit/chunky/ui/render/tabs/AdvancedTab.java b/chunky/src/java/se/llbit/chunky/ui/render/tabs/AdvancedTab.java index 8dc587d111..92bb412ba4 100644 --- a/chunky/src/java/se/llbit/chunky/ui/render/tabs/AdvancedTab.java +++ b/chunky/src/java/se/llbit/chunky/ui/render/tabs/AdvancedTab.java @@ -27,9 +27,7 @@ import se.llbit.chunky.PersistentSettings; import se.llbit.chunky.launcher.LauncherSettings; import se.llbit.chunky.main.Chunky; -import se.llbit.chunky.renderer.EmitterSamplingStrategy; -import se.llbit.chunky.renderer.RenderController; -import se.llbit.chunky.renderer.RenderManager; +import se.llbit.chunky.renderer.*; import se.llbit.chunky.renderer.export.PictureExportFormat; import se.llbit.chunky.renderer.export.PictureExportFormats; import se.llbit.chunky.renderer.scene.AsynchronousSceneManager; @@ -38,9 +36,11 @@ import se.llbit.chunky.ui.Adjuster; import se.llbit.chunky.ui.DoubleAdjuster; import se.llbit.chunky.ui.IntegerAdjuster; +import se.llbit.chunky.ui.RegisterableCellAdapter; import se.llbit.chunky.ui.controller.RenderControlsFxController; import se.llbit.chunky.ui.dialogs.ShutdownAlert; import se.llbit.chunky.ui.render.RenderControlsTab; +import se.llbit.fxutil.CustomizedListCellFactory; import se.llbit.fxutil.Dialogs; import se.llbit.log.Log; import se.llbit.math.Octree; @@ -72,16 +72,16 @@ public class AdvancedTab extends ScrollPane implements RenderControlsTab, Initia @FXML private DoubleAdjuster transmissivityCap; @FXML private IntegerAdjuster cacheResolution; @FXML private DoubleAdjuster animationTime; - @FXML private ChoiceBox outputMode; - @FXML private ChoiceBox octreeImplementation; + @FXML private ComboBox outputMode; + @FXML private ComboBox octreeImplementation; @FXML private Button octreeSwitchImplementation; - @FXML private ChoiceBox bvhMethod; - @FXML private ChoiceBox biomeStructureImplementation; + @FXML private ComboBox bvhMethod; + @FXML private ComboBox biomeStructureImplementation; @FXML private IntegerAdjuster gridSize; @FXML private CheckBox preventNormalEmitterWithSampling; @FXML private CheckBox hideUnknownBlocks; - @FXML private ChoiceBox rendererSelect; - @FXML private ChoiceBox previewSelect; + @FXML private ComboBox rendererSelect; + @FXML private ComboBox previewSelect; @FXML private CheckBox showLauncher; public AdvancedTab() throws IOException { @@ -95,6 +95,7 @@ public AdvancedTab() throws IOException { public void initialize(URL location, ResourceBundle resources) { outputMode.getItems().addAll(PictureExportFormats.getFormats()); outputMode.getSelectionModel().select(PictureExportFormats.PNG); + CustomizedListCellFactory.install(outputMode, PictureExportFormat::getDescription); cpuLoad.setName("CPU utilization"); cpuLoad.setTooltip("CPU utilization percentage per render thread."); cpuLoad.setRange(1, 100); @@ -196,77 +197,76 @@ public PictureExportFormat fromString(String string) { renderControls.showPopup("This change takes effect after restarting Chunky.", renderThreads); }); - ArrayList octreeNames = new ArrayList<>(); + ArrayList octreeImplementations = new ArrayList<>(); StringBuilder tooltipTextBuilder = new StringBuilder(); for(Map.Entry entry : Octree.getEntries()) { - octreeNames.add(entry.getKey()); + octreeImplementations.add(entry.getValue()); tooltipTextBuilder.append(entry.getKey()); tooltipTextBuilder.append(": "); tooltipTextBuilder.append(entry.getValue().getDescription()); tooltipTextBuilder.append('\n'); } tooltipTextBuilder.append("Requires reloading chunks to take effect."); - octreeImplementation.getItems().addAll(octreeNames); + octreeImplementation.getItems().addAll(octreeImplementations); octreeImplementation.getSelectionModel().selectedItemProperty() .addListener((observable, oldvalue, newvalue) -> { - PersistentSettings.setOctreeImplementation(newvalue); - if (!scene.getOctreeImplementation().equals(newvalue)) { - scene.setOctreeImplementation(newvalue); + PersistentSettings.setOctreeImplementation(newvalue.getId()); + if (!scene.getOctreeImplementation().equals(getId())) { + scene.setOctreeImplementation(newvalue.getId()); scene.softRefresh(); } }); + CustomizedListCellFactory.install(octreeImplementation, RegisterableCellAdapter.INSTANCE); octreeImplementation.setTooltip(new Tooltip(tooltipTextBuilder.toString())); octreeSwitchImplementation.setOnAction(event -> Chunky.getCommonThreads().submit(() -> { TaskTracker tracker = controller.getSceneManager().getTaskTracker(); try { try (TaskTracker.Task task = tracker.task("(1/2) Converting world octree", 1000)) { - scene.getWorldOctree().switchImplementation(octreeImplementation.getValue(), task); + scene.getWorldOctree().switchImplementation(octreeImplementation.getValue().getId(), task); } try (TaskTracker.Task task = tracker.task("(2/2) Converting water octree")) { - scene.getWaterOctree().switchImplementation(octreeImplementation.getValue(), task); + scene.getWaterOctree().switchImplementation(octreeImplementation.getValue().getId(), task); } } catch (IOException e) { Log.error("Switching octrees failed. Reload the scene.\n", e); } })); - ArrayList bvhNames = new ArrayList<>(); StringBuilder bvhMethodBuilder = new StringBuilder(); for (BVH.Factory.BVHBuilder builder : BVH.Factory.getImplementations()) { - bvhNames.add(builder.getName()); bvhMethodBuilder.append(builder.getName()); bvhMethodBuilder.append(": "); bvhMethodBuilder.append(builder.getDescription()); bvhMethodBuilder.append('\n'); } bvhMethodBuilder.append("Requires reloading chunks to take effect."); - bvhMethod.getItems().addAll(bvhNames); - bvhMethod.getSelectionModel().select(PersistentSettings.getBvhMethod()); + bvhMethod.getItems().addAll(BVH.Factory.getImplementations()); + bvhMethod.getSelectionModel().select(BVH.Factory.getImplementation(PersistentSettings.getBvhMethod())); bvhMethod.getSelectionModel().selectedItemProperty() .addListener(((observable, oldValue, newValue) -> { - PersistentSettings.setBvhMethod(newValue); - scene.setBvhImplementation(newValue); + PersistentSettings.setBvhMethod(newValue.getId()); + scene.setBvhImplementation(newValue.getId()); scene.softRefresh(); })); + CustomizedListCellFactory.install(bvhMethod, RegisterableCellAdapter.INSTANCE); bvhMethod.setTooltip(new Tooltip(bvhMethodBuilder.toString())); - ArrayList biomeStructureIds = new ArrayList<>(); StringBuilder biomeStructureTooltipBuilder = new StringBuilder(); for (Registerable entry : BiomeStructure.REGISTRY.values()) { - biomeStructureIds.add(entry.getId()); biomeStructureTooltipBuilder.append(entry.getName()); biomeStructureTooltipBuilder.append(": "); biomeStructureTooltipBuilder.append(entry.getDescription()); biomeStructureTooltipBuilder.append('\n'); } biomeStructureTooltipBuilder.append("Requires reloading chunks to take effect."); - biomeStructureImplementation.getItems().addAll(biomeStructureIds); + biomeStructureImplementation.getItems().addAll(BiomeStructure.REGISTRY.values()); biomeStructureImplementation.getSelectionModel().selectedItemProperty() .addListener((observable, oldvalue, newvalue) -> { - scene.setBiomeStructureImplementation(newvalue); - PersistentSettings.setBiomeStructureImplementation(newvalue); + scene.setBiomeStructureImplementation(newvalue.getId()); + PersistentSettings.setBiomeStructureImplementation(newvalue.getId()); }); + CustomizedListCellFactory.install(biomeStructureImplementation, RegisterableCellAdapter.INSTANCE); biomeStructureImplementation.setTooltip(new Tooltip(biomeStructureTooltipBuilder.toString())); gridSize.setRange(4, 64); @@ -306,11 +306,13 @@ public PictureExportFormat fromString(String string) { rendererSelect.setTooltip(new Tooltip("The renderer to use for rendering.")); rendererSelect.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> - scene.setRenderer(newValue)); + scene.setRenderer(newValue.getId())); + CustomizedListCellFactory.install(rendererSelect, RegisterableCellAdapter.INSTANCE); previewSelect.setTooltip(new Tooltip("The renderer to use for the preview.")); previewSelect.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> - scene.setPreviewRenderer(newValue)); + scene.setPreviewRenderer(newValue.getId())); + CustomizedListCellFactory.install(previewSelect, RegisterableCellAdapter.INSTANCE); LauncherSettings settings = new LauncherSettings(); settings.load(); @@ -339,15 +341,15 @@ public void update(Scene scene) { cpuLoad.set(PersistentSettings.getCPULoad()); rayDepth.set(scene.getRayDepth()); branchCount.set(scene.getBranchCount()); - octreeImplementation.getSelectionModel().select(scene.getOctreeImplementation()); - bvhMethod.getSelectionModel().select(scene.getBvhImplementation()); - biomeStructureImplementation.getSelectionModel().select(scene.getBiomeStructureImplementation()); + octreeImplementation.getSelectionModel().select(Octree.getImplementation(scene.getOctreeImplementation())); + bvhMethod.getSelectionModel().select(BVH.Factory.getImplementation(scene.getBvhImplementation())); + biomeStructureImplementation.getSelectionModel().select(BiomeStructure.REGISTRY.get(scene.getBiomeStructureImplementation())); gridSize.set(scene.getGridSize()); preventNormalEmitterWithSampling.setSelected(scene.isPreventNormalEmitterWithSampling()); animationTime.set(scene.getAnimationTime()); hideUnknownBlocks.setSelected(scene.getHideUnknownBlocks()); - rendererSelect.getSelectionModel().select(scene.getRenderer()); - previewSelect.getSelectionModel().select(scene.getPreviewRenderer()); + rendererSelect.getSelectionModel().select(DefaultRenderManager.renderers.get(scene.getRenderer())); + previewSelect.getSelectionModel().select(DefaultRenderManager.previewRenderers.get(scene.getPreviewRenderer())); } @Override @@ -372,24 +374,17 @@ public void setController(RenderControlsFxController controls) { } }); - // Set the renderers - rendererSelect.getItems().clear(); - RenderManager renderManager = controller.getRenderManager(); - ArrayList ids = new ArrayList<>(); - for (Registerable renderer : renderManager.getRenderers()) - ids.add(renderer.getId()); + RenderManager renderManager = controller.getRenderManager(); - rendererSelect.getItems().addAll(ids); - rendererSelect.getSelectionModel().select(scene.getRenderer()); + // Set the renderers + rendererSelect.getItems().clear(); + rendererSelect.getItems().addAll(renderManager.getRenderers()); + rendererSelect.getSelectionModel().select(renderManager.getRenderers().stream().filter(r -> r.getId().equals(scene.getRenderer())).findFirst().orElse(null)); - // Set the preview renderers, reuse the `ids` ArrayList + // Set the preview renderers previewSelect.getItems().clear(); - ids.clear(); - for (Registerable render : renderManager.getPreviewRenderers()) - ids.add(render.getId()); - - previewSelect.getItems().addAll(ids); - previewSelect.getSelectionModel().select(scene.getPreviewRenderer()); + previewSelect.getItems().addAll(renderManager.getPreviewRenderers()); + previewSelect.getSelectionModel().select(renderManager.getPreviewRenderers().stream().filter(r -> r.getId().equals(scene.getPreviewRenderer())).findFirst().orElse(null)); } } diff --git a/chunky/src/java/se/llbit/math/BigPackedOctree.java b/chunky/src/java/se/llbit/math/BigPackedOctree.java index 0075642350..512e7a8cd3 100644 --- a/chunky/src/java/se/llbit/math/BigPackedOctree.java +++ b/chunky/src/java/se/llbit/math/BigPackedOctree.java @@ -460,7 +460,7 @@ private void finalizationNode(long nodeIndex) { } static public void initImplementation() { - Octree.addImplementationFactory("BIGPACKED", new Octree.ImplementationFactory() { + Octree.addImplementationFactory(new Octree.ImplementationFactory() { @Override public Octree.OctreeImplementation create(int depth) { return new BigPackedOctree(depth); @@ -481,6 +481,16 @@ public boolean isOfType(Octree.OctreeImplementation implementation) { return implementation instanceof BigPackedOctree; } + @Override + public String getId() { + return "BIGPACKED"; + } + + @Override + public String getName() { + return "Big Packed"; + } + @Override public String getDescription() { return "Almost as memory efficient as PACKED but doesn't have a limitation on the size of the octree."; diff --git a/chunky/src/java/se/llbit/math/NodeBasedOctree.java b/chunky/src/java/se/llbit/math/NodeBasedOctree.java index 86f687de1e..a3c7906dd1 100644 --- a/chunky/src/java/se/llbit/math/NodeBasedOctree.java +++ b/chunky/src/java/se/llbit/math/NodeBasedOctree.java @@ -210,7 +210,7 @@ private void finalizationNode(Octree.Node node, Octree.Node parent, int childNo) } static public void initImplementation() { - Octree.addImplementationFactory("NODE", new Octree.ImplementationFactory() { + Octree.addImplementationFactory(new Octree.ImplementationFactory() { @Override public Octree.OctreeImplementation create(int depth) { return new NodeBasedOctree(depth, new Octree.Node(0)); @@ -231,6 +231,16 @@ public boolean isOfType(Octree.OctreeImplementation implementation) { return implementation instanceof NodeBasedOctree; } + @Override + public String getId() { + return "NODE"; + } + + @Override + public String getName() { + return "Node"; + } + @Override public String getDescription() { return "The legacy octree implementation, memory inefficient but can work with scene of any size."; diff --git a/chunky/src/java/se/llbit/math/Octree.java b/chunky/src/java/se/llbit/math/Octree.java index 3243d9d725..428123c610 100644 --- a/chunky/src/java/se/llbit/math/Octree.java +++ b/chunky/src/java/se/llbit/math/Octree.java @@ -39,6 +39,7 @@ import se.llbit.log.Log; import se.llbit.util.PositionalInputStream; import se.llbit.util.PositionalOutputStream; +import se.llbit.util.Registerable; import se.llbit.util.TaskTracker; /** @@ -111,12 +112,11 @@ default void setCube(int cubeDepth, int[] types, int x, int y, int z) { public interface NodeId {} - public interface ImplementationFactory { + public interface ImplementationFactory extends Registerable { OctreeImplementation create(int depth); OctreeImplementation load(DataInputStream in) throws IOException; OctreeImplementation loadWithNodeCount(long nodeCount, DataInputStream in) throws IOException; boolean isOfType(OctreeImplementation implementation); - String getDescription(); } static private Map factories = new HashMap<>(); @@ -836,8 +836,8 @@ public OctreeImplementation getImplementation() { return implementation; } - public static void addImplementationFactory(String name, ImplementationFactory factory) { - factories.put(name, factory); + public static void addImplementationFactory(ImplementationFactory factory) { + factories.put(factory.getId(), factory); } static { @@ -849,4 +849,8 @@ public static void addImplementationFactory(String name, ImplementationFactory f public static Iterable> getEntries() { return factories.entrySet(); } + + public static ImplementationFactory getImplementation(String id) { + return factories.get(id); + } } diff --git a/chunky/src/java/se/llbit/math/PackedOctree.java b/chunky/src/java/se/llbit/math/PackedOctree.java index 058f6d6e27..d42a6119b9 100644 --- a/chunky/src/java/se/llbit/math/PackedOctree.java +++ b/chunky/src/java/se/llbit/math/PackedOctree.java @@ -717,7 +717,7 @@ private void finalizationNode(int nodeIndex) { * Add PackedOctree to OctreeImplementationFactory so Packed can be created and loaded via by name. */ static public void initImplementation() { - Octree.addImplementationFactory("PACKED", new Octree.ImplementationFactory() { + Octree.addImplementationFactory(new Octree.ImplementationFactory() { @Override public Octree.OctreeImplementation create(int depth) { return new PackedOctree(depth); @@ -738,6 +738,16 @@ public boolean isOfType(Octree.OctreeImplementation implementation) { return implementation instanceof PackedOctree; } + @Override + public String getId() { + return "PACKED"; + } + + @Override + public String getName() { + return "Packed"; + } + @Override public String getDescription() { return "Memory efficient octree implementation, doesn't work for octree with 2^31 nodes, i.e. scenes of 400k chunks. Should be enough for most use case."; diff --git a/chunky/src/java/se/llbit/math/bvh/BVH.java b/chunky/src/java/se/llbit/math/bvh/BVH.java index 2f19317a40..c6bdbc882f 100644 --- a/chunky/src/java/se/llbit/math/bvh/BVH.java +++ b/chunky/src/java/se/llbit/math/bvh/BVH.java @@ -23,6 +23,7 @@ import se.llbit.math.Intersectable; import se.llbit.math.Ray; import se.llbit.math.Vector3; +import se.llbit.util.Registerable; import se.llbit.util.TaskTracker; import java.util.Collection; @@ -45,11 +46,10 @@ public interface BVH extends Intersectable { final class Factory { - public interface BVHBuilder { + public interface BVHBuilder extends Registerable { BVH create(Collection entities, Vector3 worldOffset, TaskTracker.Task task); - String getName(); - String getDescription(); + default String getId() { return getName(); }; } /** @@ -62,7 +62,7 @@ public interface BVHBuilder { public static BVHBuilder getImplementation(String id) { if (!implementations.containsKey(id)) - Log.warn("Unknown BVH implementation: " + id + ". Using " + DEFAULT_IMPLEMENTATION.getName() + "."); + Log.warn("Unknown BVH implementation: " + id + ". Using " + DEFAULT_IMPLEMENTATION.getId() + "."); return implementations.getOrDefault(id, DEFAULT_IMPLEMENTATION); } @@ -79,9 +79,9 @@ public static Collection getImplementations() { */ @PluginApi public static void addBVHBuilder(BVHBuilder builder) { - if (implementations.containsKey(builder.getName())) - Log.warn("Attempted to register 2+ BVH builders with the name " + builder.getName() + " (do you have the same plugin installed twice?)"); - implementations.put(builder.getName(), builder); + if (implementations.containsKey(builder.getId())) + Log.warn("Attempted to register 2+ BVH builders with the ID " + builder.getId() + " (do you have the same plugin installed twice?)"); + implementations.put(builder.getId(), builder); } static { diff --git a/chunky/src/java/se/llbit/math/bvh/MidpointBVH.java b/chunky/src/java/se/llbit/math/bvh/MidpointBVH.java index 537963285b..9b90067b06 100644 --- a/chunky/src/java/se/llbit/math/bvh/MidpointBVH.java +++ b/chunky/src/java/se/llbit/math/bvh/MidpointBVH.java @@ -52,10 +52,15 @@ public BVH create(Collection entities, Vector3 worldOffset, TaskTracker. } @Override - public String getName() { + public String getId() { return "MIDPOINT"; } + @Override + public String getName() { + return "Midpoint"; + } + @Override public String getDescription() { return "Fast and simple, but not optimal BVH building method."; diff --git a/chunky/src/java/se/llbit/math/bvh/SahBVH.java b/chunky/src/java/se/llbit/math/bvh/SahBVH.java index 1e8c69e7e9..d44d9eeed6 100644 --- a/chunky/src/java/se/llbit/math/bvh/SahBVH.java +++ b/chunky/src/java/se/llbit/math/bvh/SahBVH.java @@ -52,10 +52,15 @@ public BVH create(Collection entities, Vector3 worldOffset, TaskTracker. } @Override - public String getName() { + public String getId() { return "SAH"; } + @Override + public String getName() { + return "Surface Area Heuristic"; + } + @Override public String getDescription() { return "Slow but nearly optimal BVH building method."; diff --git a/chunky/src/java/se/llbit/math/bvh/SahMaBVH.java b/chunky/src/java/se/llbit/math/bvh/SahMaBVH.java index c047893a6e..801bec97df 100644 --- a/chunky/src/java/se/llbit/math/bvh/SahMaBVH.java +++ b/chunky/src/java/se/llbit/math/bvh/SahMaBVH.java @@ -53,10 +53,15 @@ public BVH create(Collection entities, Vector3 worldOffset, TaskTracker. } @Override - public String getName() { + public String getId() { return "SAH_MA"; } + @Override + public String getName() { + return "Surface Area Heuristic with Major Axis splitting"; + } + @Override public String getDescription() { return "Fast and nearly optimal BVH building method."; diff --git a/chunky/src/res/se/llbit/chunky/ui/render/tabs/AdvancedTab.fxml b/chunky/src/res/se/llbit/chunky/ui/render/tabs/AdvancedTab.fxml index 6c9b960236..0b747237d5 100644 --- a/chunky/src/res/se/llbit/chunky/ui/render/tabs/AdvancedTab.fxml +++ b/chunky/src/res/se/llbit/chunky/ui/render/tabs/AdvancedTab.fxml @@ -3,7 +3,6 @@ - @@ -12,6 +11,7 @@ + @@ -30,22 +30,22 @@