package com.javamarcher.window; import java.awt.FlowLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.javamarcher.configuration.GlobalConfig; import com.javamarcher.gamestate.MainState; import com.javamarcher.util.ActionGeneric; public class OptionWindow extends JFrame { private static final long serialVersionUID = 1L; private final JPanel mainContainer = new JPanel(); public OptionWindow(String windowName) { super(windowName); initializeWindow(); } private void initializeWindow() { setSize(320, 600); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(1); } }); mainContainer.setLayout(new FlowLayout(FlowLayout.LEFT)); add(mainContainer); // Add all components makeRaymarchingSettingArea(); makeSunSettingArea(); makeCloudIterationsTextField(); makeFogSettingArea(); makeShadowSettingArea(); makeQualitySettingArea(); makePerformanceCounterArea(); makeAOSettingArea(); makeAnimationArea(); setVisible(true); } private void makeAnimationArea() { final LabelBasedUIComponent animationMode = new LabeledCheckBox("Animation Activated", GlobalConfig.IS_ANIMATION_CONTROLLED, new ActionGeneric<Boolean>() { @Override public void performAction(Boolean param) { MainState.tweenManager.killAll(); GlobalConfig.IS_ANIMATION_CONTROLLED = param; } }); mainContainer.add(animationMode.getComponent()); } private void makeAOSettingArea() { final LabelBasedUIComponent aoMode = new LabeledCheckBox("Ambient Occlusion", GlobalConfig.AO_ENABLED, new ActionGeneric<Boolean>() { @Override public void performAction(Boolean param) { GlobalConfig.AO_ENABLED = param; } }); mainContainer.add(aoMode.getComponent()); } private void makePerformanceCounterArea() { final LabelBasedUIComponent perfCounterMode = new LabeledCheckBox("Performance visualization", GlobalConfig.PERFORMANCE_VISUALIZATION, new ActionGeneric<Boolean>() { @Override public void performAction(Boolean param) { GlobalConfig.PERFORMANCE_VISUALIZATION = param; } }); mainContainer.add(perfCounterMode.getComponent()); } private void makeQualitySettingArea() { final LabelBasedUIComponent highQualityMode = new LabeledCheckBox("High Quality Mode", GlobalConfig.HIGH_QUALITY_MODE, new ActionGeneric<Boolean>() { @Override public void performAction(Boolean param) { GlobalConfig.HIGH_QUALITY_MODE = param; } }); mainContainer.add(highQualityMode.getComponent()); } private void makeShadowSettingArea() { final LabelBasedUIComponent shadowStrength = new DoubleJTextfieldWithLabel("Shadow Strength", GlobalConfig.SHADOW_STRENGTH, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.SHADOW_STRENGTH = param; } }, 3, 10); final LabelBasedUIComponent shadowSoftness = new DoubleJTextfieldWithLabel("Shadow Softness", GlobalConfig.SHADOW_SOFTNESS, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.SHADOW_SOFTNESS = param; } }, 3, 10); final LabelBasedUIComponent shadowIterations = new DoubleJTextfieldWithLabel("Shadow Iterations", GlobalConfig.SHADOW_ITERATIONS, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.SHADOW_ITERATIONS = param.intValue(); } }, 1, 5); mainContainer.add(shadowStrength.getComponent()); mainContainer.add(shadowSoftness.getComponent()); mainContainer.add(shadowIterations.getComponent()); } private void makeFogSettingArea() { final LabelBasedUIComponent fogColor = new Vector3fTextfield("Fog Color", new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.FOG_COLOR.x = param.floatValue(); } }, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.FOG_COLOR.y = param.floatValue(); } }, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.FOG_COLOR.z = param.floatValue(); } } , GlobalConfig.FOG_COLOR.x, GlobalConfig.FOG_COLOR.y, GlobalConfig.FOG_COLOR.z); final LabelBasedUIComponent fogStrength = new DoubleJTextfieldWithLabel("Fog Strength", GlobalConfig.FOG_STRENGTH, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.FOG_STRENGTH = param; } }, 5, 6); mainContainer.add(fogColor.getComponent()); mainContainer.add(fogStrength.getComponent()); } private void makeSunSettingArea() { final LabelBasedUIComponent sunDirection = new Vector3fTextfield("Sun Direction", new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.SUN_DIRECTION.x = param.floatValue(); } }, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.SUN_DIRECTION.y = param.floatValue(); } }, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.SUN_DIRECTION.z = param.floatValue(); } } , GlobalConfig.SUN_DIRECTION.x, GlobalConfig.SUN_DIRECTION.y, GlobalConfig.SUN_DIRECTION.z); mainContainer.add(sunDirection.getComponent()); } private void makeRaymarchingSettingArea() { final LabelBasedUIComponent maxStepSlider = makeMaxStepSlider(); final LabelBasedUIComponent maxDistance = makeMaxDistanceTextField(); final LabelBasedUIComponent epsilon = makeEpsilonTextField(); mainContainer.add(maxStepSlider.getComponent()); mainContainer.add(maxDistance.getComponent()); mainContainer.add(epsilon.getComponent()); } private LabelBasedUIComponent makeEpsilonTextField() { return new DoubleJTextfieldWithLabel("Epsilon", GlobalConfig.EPSILON, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.EPSILON = param; } }, 10, 10); } private LabelBasedUIComponent makeMaxDistanceTextField() { return new DoubleJTextfieldWithLabel("Max Distance", GlobalConfig.MAX_DISTANCE, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.MAX_DISTANCE = param; } }, 3, 10); } private JSliderWithLabel makeMaxStepSlider() { return new JSliderWithLabel("Max Steps", 0, 1000, GlobalConfig.MAX_STEPS, new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { final JSlider source = (JSlider) e.getSource(); GlobalConfig.MAX_STEPS = source.getValue(); } }); } private void makeCloudIterationsTextField() { final LabelBasedUIComponent cloudIterations = new DoubleJTextfieldWithLabel("Cloud Iterations", GlobalConfig.CLOUD_ITERATIONS, new ActionGeneric<Double>() { @Override public void performAction(Double param) { GlobalConfig.CLOUD_ITERATIONS = param.intValue(); } }, 1, 10); mainContainer.add(cloudIterations.getComponent()); } }