/* Copyright (c) 2016 Jesper Öqvist <jesper@llbit.se> * * This file is part of Chunky. * * Chunky is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Chunky is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Chunky. If not, see <http://www.gnu.org/licenses/>. */ package se.llbit.chunky.ui.render; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Tab; import javafx.scene.control.Tooltip; import javafx.stage.FileChooser; import se.llbit.chunky.PersistentSettings; import se.llbit.chunky.renderer.OutputMode; import se.llbit.chunky.renderer.RenderController; import se.llbit.chunky.renderer.scene.AsynchronousSceneManager; import se.llbit.chunky.renderer.scene.Scene; import se.llbit.chunky.ui.IntegerAdjuster; import se.llbit.chunky.ui.RenderControlsFxController; import se.llbit.chunky.ui.ShutdownAlert; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; public class AdvancedTab extends Tab implements RenderControlsTab, Initializable { private RenderController controller; private Scene scene; @FXML private IntegerAdjuster renderThreads; @FXML private IntegerAdjuster cpuLoad; @FXML private IntegerAdjuster rayDepth; @FXML private Button mergeRenderDump; @FXML private CheckBox shutdown; @FXML private CheckBox fastFog; @FXML private ChoiceBox<OutputMode> outputMode; public AdvancedTab() throws IOException { FXMLLoader loader = new FXMLLoader(getClass().getResource("AdvancedTab.fxml")); loader.setRoot(this); loader.setController(this); loader.load(); } @Override public void initialize(URL location, ResourceBundle resources) { outputMode.getItems().addAll(OutputMode.values()); cpuLoad.setName("CPU load"); cpuLoad.setTooltip("CPU utilization percentage for rendering."); cpuLoad.setRange(1, 100); cpuLoad.clampBoth(); cpuLoad.onValueChange(value -> { PersistentSettings.setCPULoad(value); controller.getRenderer().setCPULoad(value); }); rayDepth.setName("Ray depth"); rayDepth.setTooltip("Sets the minimum recursive ray depth."); rayDepth.setRange(1, 25); rayDepth.clampMin(); rayDepth.onValueChange(value -> scene.setRayDepth(value)); mergeRenderDump .setTooltip(new Tooltip("Merge an existing render dump with the current render.")); mergeRenderDump.setOnAction(e -> { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Merge Render Dump"); fileChooser .setSelectedExtensionFilter(new FileChooser.ExtensionFilter("Render dumps", "*.dump")); File dump = fileChooser.showOpenDialog(getTabPane().getScene().getWindow()); if (dump != null) { // TODO: remove cast. ((AsynchronousSceneManager) controller.getSceneManager()).mergeRenderDump(dump); } }); outputMode.getSelectionModel().selectedItemProperty() .addListener((observable, oldValue, newValue) -> scene.setOutputMode(newValue)); if (!ShutdownAlert.canShutdown()) { shutdown.setDisable(true); } fastFog.setTooltip(new Tooltip("Enable faster fog rendering algorithm.")); fastFog.selectedProperty() .addListener((observable, oldValue, newValue) -> scene.setFastFog(newValue)); renderThreads.setName("Render threads"); renderThreads.setTooltip("Number of rendering threads."); renderThreads.setRange(1, 20); renderThreads.clampMin(); renderThreads.onValueChange(value -> { controller.getRenderer().setNumThreads(value); PersistentSettings.setNumRenderThreads(value); }); } public boolean shutdownAfterCompletedRender() { return shutdown.isSelected(); } @Override public void update(Scene scene) { outputMode.getSelectionModel().select(scene.getOutputMode()); fastFog.setSelected(scene.fastFog()); renderThreads.set(PersistentSettings.getNumThreads()); cpuLoad.set(PersistentSettings.getCPULoad()); rayDepth.set(scene.getRayDepth()); } @Override public Tab getTab() { return this; } @Override public void setController(RenderControlsFxController controls) { this.controller = controls.getRenderController(); scene = controller.getSceneManager().getScene(); controller.getRenderer().setOnRenderCompleted((time, sps) -> { if (shutdownAfterCompletedRender()) { // TODO: rewrite the shutdown alert in JavaFX. new ShutdownAlert(null); } }); } }