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());
}
}