/*
* View3DPanel.java
*
* Created on October 1, 2008, 2:16 PM
*/
package ch.ethz.karto.map3d.gui;
import ch.ethz.karto.map3d.Map3DViewer;
import ch.ethz.karto.map3d.Map3DViewer.Camera;
import com.bric.swing.ColorPicker;
import com.bric.swing.MultiThumbSlider;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Hashtable;
import java.util.prefs.Preferences;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
/**
*
* @author Bernhard Jenny, Institute of Cartography, ETH Zurich.
*/
public class Map3DOptionsPanel extends javax.swing.JPanel implements PropertyChangeListener, KeyListener {
private static final int SHEAR_SLIDER_MAX = 180;
private static final int SHEAR_SLIDER_MIN = 0;
private static final int CYL_HEIGHT_SLIDER_MAX = 100;
private static final int CYL_HEIGHT_SLIDER_MIN = -100;
private static final int INCLINATION_SLIDER_MAX = 90;
private static final int INCLINATION_SLIDER_MIN = 0;
private static final float MIN_VIEW_ANGLE = 0.5f;
private static final String SHIFTX_TOOLTIP = "Move model left or right.";
private static final String SHIFTY_TOOLTIP = "Move model up or down.";
private static final String CYLINDER_POSX_TOOLTIP = "Center of cylindrical camera.";
private static final String CYLINDER_POSY_TOOLTIP = "Center of cylindrical camera.";
private Map3DViewer map3DViewer;
private boolean updatingGUI = false;
private static javax.swing.JDialog dialog = null;
public static void show3DOptions(JFrame owner, Map3DViewer map3DViewer) {
if (dialog == null) {
dialog = new JDialog(owner, "Display Options", false);
//frame = new javax.swing.JFrame("Display Options");
dialog.getRootPane().putClientProperty("Window.style", "small");
// setAlwaysOnTop() is not supported for applets
try {
dialog.setAlwaysOnTop(true);
} catch (SecurityException se) {
}
dialog.add(new Map3DOptionsPanel(map3DViewer));
dialog.pack();
dialog.setLocation(15, 30);
dialog.setResizable(false);
}
dialog.setVisible(true);
}
public static void hide3DOptions() {
if (dialog != null) {
dialog.setVisible(false);
}
}
private static String prefsNodeName = "/ethz/karto/map3d/antialiasing";
private static String prefsAntialiasingLevel = "antialiasinglevel";
public Map3DOptionsPanel(Map3DViewer map3DViewer) {
initComponents();
this.setMap3DViewer(map3DViewer);
}
public Map3DOptionsPanel() {
initComponents();
}
public void setMap3DViewer(Map3DViewer newMap3DViewer) {
if (newMap3DViewer == null) {
return;
}
if (this.map3DViewer != null) {
this.map3DViewer.getComponent().removePropertyChangeListener(this);
}
this.map3DViewer = newMap3DViewer;
this.writeModelToGUI();
newMap3DViewer.getComponent().addPropertyChangeListener("view", this);
if (newMap3DViewer.is2D()) {
this.viewAngleSlider.setEnabled(false);
}
}
public void addPanel(String title, Component panel) {
optionsTabbedPane.addTab(title, panel);
}
public void setAntialiasingPanelVisible(boolean visible) {
if (!visible) {
this.optionsTabbedPane.remove(this.antialiasingPanel);
} else {
this.optionsTabbedPane.add(this.antialiasingPanel);
}
}
public void setCameraVisible(Map3DViewer.Camera camera, boolean visible) {
String cameraName = Map3DViewer.camera(camera);
if (visible) {
this.cameraComboBox.addItem(cameraName);
} else {
this.cameraComboBox.removeItem(cameraName);
}
}
public void setInfoLabelVisible(boolean visible) {
this.infoLabel.setVisible(visible);
}
public boolean isInfoLabelVisible() {
return this.infoLabel.isVisible();
}
private void writeGUIToModel() {
if (updatingGUI) {
return;
}
updatingGUI = true;
try {
// projection
map3DViewer.setZAngle(this.rotationSlider.getValue());
// first slider is used for different parameters
switch (map3DViewer.getCamera()) {
case planOblique:
map3DViewer.setShearYAngle(this.inclinationSlider.getValue());
break;
case perspective:
case parallelOblique:
map3DViewer.setXAngle(this.inclinationSlider.getValue());
break;
case cylindrical:
float v = (float) this.inclinationSlider.getValue() / (CYL_HEIGHT_SLIDER_MAX - CYL_HEIGHT_SLIDER_MIN);
map3DViewer.setCylindricalHeight(v);
break;
case orthogonal:
break;
}
map3DViewer.setViewDistance(this.distanceSlider.getValue() / 100f);
map3DViewer.setViewAngle(Math.max(MIN_VIEW_ANGLE, this.viewAngleSlider.getValue()));
map3DViewer.setShiftX(shiftXSlider.getValue() / 100f);
map3DViewer.setShiftY(shiftYSlider.getValue() / 100f);
// shading
float ambient = ambientSlider.getValue() / 100f;
float diffuse = diffuseSlider.getValue() / 100f;
map3DViewer.setLight(ambient, diffuse);
float azimuth = azimuthSlider.getValue();
float zenith = 90 - elevationSlider.getValue();
map3DViewer.setLightDirection(azimuth, zenith);
// anti-aliasing
map3DViewer.setAntialiasing(antialiasingCheckBox.isSelected());
} finally {
updatingGUI = false;
}
}
private void writeModelToGUI() {
if (updatingGUI) {
return;
}
updatingGUI = true;
try {
// projection
rotationSlider.setValue((int) map3DViewer.getZAngle());
Camera camera = map3DViewer.getCamera();
cameraComboBox.setSelectedItem(Map3DViewer.camera(camera));
switch (camera) {
case perspective:
case parallelOblique:
inclinationSlider.setValue((int) map3DViewer.getXAngle());
break;
case planOblique:
inclinationSlider.setValue((int) map3DViewer.getShearYAngle());
break;
case orthogonal:
inclinationSlider.setValue((int) map3DViewer.getXAngle());
break;
case cylindrical:
int v = Math.round(map3DViewer.getCylindricalHeight() * (CYL_HEIGHT_SLIDER_MAX - CYL_HEIGHT_SLIDER_MIN));
inclinationSlider.setValue(v);
break;
}
this.adjustGUIToCamera();
distanceSlider.setValue((int) (map3DViewer.getViewDistance() * 100f));
viewAngleSlider.setValue((int) map3DViewer.getViewAngle());
shiftXSlider.setValue((int) (map3DViewer.getShiftX() * 100f));
shiftYSlider.setValue((int) (map3DViewer.getShiftY() * 100f));
// shading
ambientSlider.setValue((int) (map3DViewer.getAmbientLight() * 100f));
diffuseSlider.setValue((int) (map3DViewer.getDiffuseLight() * 100f));
azimuthSlider.setValue((int) (map3DViewer.getLightAzimuth()));
elevationSlider.setValue(90 - (int) (map3DViewer.getLightZenith()));
// anti-aliasing
antialiasingCheckBox.setSelected(map3DViewer.isAntialiasing());
int antialiasingLevel = Map3DOptionsPanel.getAntialiasingLevel();
int menuIndex = 0;
if (antialiasingLevel == 4) {
menuIndex = 1;
} else if (antialiasingLevel == 8) {
menuIndex = 2;
}
antialiasingComboBox.setSelectedIndex(menuIndex);
} finally {
updatingGUI = false;
}
}
private void initHypsoSlider() {
float[] values = new float[]{0, 0.08f, 0.24f, 0.43f, 0.69f, 0.89f};
Color[] colors = new Color[]{
new Color(120, 181, 141),
new Color(124, 172, 104),
new Color(190, 194, 107),
new Color(212, 218, 170),
new Color(225, 246, 244),
new Color(255, 255, 255)
};
hypsoSlider.setValues(values, colors);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
fogPanel = new javax.swing.JPanel();
jLabel5 = new javax.swing.JLabel();
jLabel10 = new javax.swing.JLabel();
fogStartSlider = new javax.swing.JSlider();
fogDensitySlider = new javax.swing.JSlider();
fogCheckBox = new javax.swing.JCheckBox();
fogColorButton = new ika.gui.ColorButton();
hypsoPanel = new javax.swing.JPanel();
hypsoSlider = new com.bric.swing.GradientSlider();
{
hypsoSlider.putClientProperty("MultiThumbSlider.indicateSelectedThumb", "true");
hypsoSlider.putClientProperty("MultiThumbSlider.indicateComponent", "false");
hypsoSlider.putClientProperty("GradientSlider.useBevel", "true");
hypsoSlider.putClientProperty("GradientSlider.colorPickerIncludesOpacity","false");
//hypsoSlider.setOrientation(GradientSlider.VERTICAL);
//hypsoSlider.setPaintTicks(false);
initHypsoSlider();
hypsoSlider.setEnabled(false);
}
hypsoCheckBox = new javax.swing.JCheckBox();
javax.swing.JLabel hypsoLabel = new javax.swing.JLabel();
hypsoDefaultButton = new javax.swing.JButton();
hypsoDefaultButton.putClientProperty("JButton.buttonType", "roundRect");
optionsTabbedPane = new javax.swing.JTabbedPane();
javax.swing.JPanel cameraPanel = new TransparentMacPanel();
rotationSlider = new javax.swing.JSlider();
inclinationSlider = new javax.swing.JSlider();
javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
inclinationLabel = new javax.swing.JLabel();
javax.swing.JLabel jLabel3 = new javax.swing.JLabel();
distanceSlider = new javax.swing.JSlider();
viewAngleSlider = new javax.swing.JSlider();
javax.swing.JLabel jLabel4 = new javax.swing.JLabel();
javax.swing.JButton cameraDefaultButton = new javax.swing.JButton();
cameraDefaultButton.putClientProperty("JButton.buttonType", "roundRect");
infoLabel = new javax.swing.JLabel();
shiftYSlider = new javax.swing.JSlider();
shiftXLabel = new javax.swing.JLabel();
shiftYLabel = new javax.swing.JLabel();
shiftXSlider = new javax.swing.JSlider();
cameraComboBox = new javax.swing.JComboBox();
jLabel2 = new javax.swing.JLabel();
shadingPanel = new TransparentMacPanel();
javax.swing.JPanel shadingPanel_ = new TransparentMacPanel();
diffuseSlider = new javax.swing.JSlider();
javax.swing.JLabel jLabel6 = new javax.swing.JLabel();
ambientSlider = new javax.swing.JSlider();
javax.swing.JLabel jLabel7 = new javax.swing.JLabel();
javax.swing.JLabel jLabel8 = new javax.swing.JLabel();
elevationSlider = new javax.swing.JSlider();
javax.swing.JLabel jLabel9 = new javax.swing.JLabel();
azimuthSlider = new javax.swing.JSlider();
javax.swing.JButton shadingDefaultButton = new javax.swing.JButton();
shadingDefaultButton.putClientProperty("JButton.buttonType", "roundRect");
jPanel1 = new TransparentMacPanel();
javax.swing.JButton fogButton = new javax.swing.JButton();
fogButton.putClientProperty("JButton.buttonType", "roundRect");
javax.swing.JButton hypsoButton = new javax.swing.JButton();
hypsoButton.putClientProperty("JButton.buttonType", "roundRect");
antialiasingPanel = new TransparentMacPanel();
antialiasingPanel1 = new TransparentMacPanel();
antialiasingCheckBox = new javax.swing.JCheckBox();
javax.swing.JLabel jLabel12 = new javax.swing.JLabel();
antialiasingComboBox = new javax.swing.JComboBox();
javax.swing.JLabel jLabel13 = new javax.swing.JLabel();
fogPanel.setLayout(new java.awt.GridBagLayout());
jLabel5.setText("Haze Start");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
fogPanel.add(jLabel5, gridBagConstraints);
jLabel10.setText("Density");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
fogPanel.add(jLabel10, gridBagConstraints);
fogStartSlider.setMajorTickSpacing(25);
fogStartSlider.setMinorTickSpacing(5);
fogStartSlider.setPaintLabels(true);
fogStartSlider.setPaintTicks(true);
fogStartSlider.setToolTipText("The position where haze starts, relative to the size of the terrain model.");
fogStartSlider.setValue(0);
fogStartSlider.setEnabled(false);
fogStartSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
fogSliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
fogPanel.add(fogStartSlider, gridBagConstraints);
{
java.util.Hashtable labels = fogStartSlider.createStandardLabels(25);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "%");
}
}
fogStartSlider.setLabelTable(labels);
}
fogDensitySlider.setMajorTickSpacing(299);
fogDensitySlider.setMaximum(300);
fogDensitySlider.setMinimum(1);
fogDensitySlider.setMinorTickSpacing(99);
fogDensitySlider.setPaintLabels(true);
fogDensitySlider.setPaintTicks(true);
fogDensitySlider.setToolTipText("Haze density");
fogDensitySlider.setValue(100);
fogDensitySlider.setEnabled(false);
fogDensitySlider.setInverted(true);
fogDensitySlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
fogSliderChanged(evt);
}
});
{
int max = fogDensitySlider.getMaximum();
int min = fogDensitySlider.getMinimum();
Hashtable labelTable = new Hashtable();
labelTable.put( new Integer( min ), new JLabel("thick") );
labelTable.put( new Integer( max ), new JLabel("thin") );
fogDensitySlider.setLabelTable( labelTable );
}
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
fogPanel.add(fogDensitySlider, gridBagConstraints);
// change the font for slider labels. Must be done after the slider is added
// to a parent container.
{
Font font = fogStartSlider.getFont();
Hashtable<Integer,JLabel> labels;
labels = (Hashtable<Integer,JLabel>)fogDensitySlider.getLabelTable();
int min = fogDensitySlider.getMinimum();
int max = fogDensitySlider.getMaximum();
JLabel label = labels.get( new Integer( min ) );
label.setFont( font ); // Updates the font size
label.setSize( label.getPreferredSize() );// Updates the label size and
// slider layout
label = labels.get( new Integer( max ) );
label.setFont( font ); // Updates the font size
label.setSize( label.getPreferredSize() );// Updates the label size and
// slider layout
}
fogCheckBox.setText("Enable Haze");
fogCheckBox.setToolTipText("Enable or disable haze.");
fogCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fogCheckBoxActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
fogPanel.add(fogCheckBox, gridBagConstraints);
fogColorButton.setToolTipText("Haze color");
fogColorButton.setColor(new java.awt.Color(255, 255, 255));
fogColorButton.setColorChooserTitle("Choose a Haze Color");
fogColorButton.setEnabled(false);
fogColorButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fogColorButtonActionPerformed(evt);
}
});
fogColorButton.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
fogColorButtonPropertyChange(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 20, 0, 0);
fogPanel.add(fogColorButton, gridBagConstraints);
hypsoPanel.setLayout(new java.awt.GridBagLayout());
hypsoSlider.setOrientation(1);
hypsoSlider.setPreferredSize(new java.awt.Dimension(40, 350));
hypsoSlider.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
hypsoSliderPropertyChange(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 12);
hypsoPanel.add(hypsoSlider, gridBagConstraints);
hypsoCheckBox.setText("Enable");
hypsoCheckBox.setToolTipText("Enable or disable hypsometric tinting.");
hypsoCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
hypsoCheckBoxActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
hypsoPanel.add(hypsoCheckBox, gridBagConstraints);
hypsoLabel.setFont(hypsoLabel.getFont().deriveFont(hypsoLabel.getFont().getSize()-2f));
hypsoLabel.setText("<html>Click on the color gradient to add thumbs.<br>Double-click a thumb to change its color.<br><br>Hypsometric tints are not possible in <br>combination with a texture image.</html>");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
hypsoPanel.add(hypsoLabel, gridBagConstraints);
hypsoDefaultButton.setText("Default");
hypsoDefaultButton.setEnabled(false);
hypsoDefaultButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
hypsoDefaultButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
hypsoPanel.add(hypsoDefaultButton, gridBagConstraints);
setLayout(new java.awt.GridBagLayout());
cameraPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 10, 5, 1));
cameraPanel.setLayout(new java.awt.GridBagLayout());
rotationSlider.setMajorTickSpacing(90);
rotationSlider.setMaximum(180);
rotationSlider.setMinimum(-180);
rotationSlider.setMinorTickSpacing(15);
rotationSlider.setPaintLabels(true);
rotationSlider.setPaintTicks(true);
rotationSlider.setToolTipText("Rotate the model around the vertical axis");
rotationSlider.setPreferredSize(new java.awt.Dimension(250, 54));
rotationSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
cameraPanel.add(rotationSlider, gridBagConstraints);
{
java.util.Hashtable labels = rotationSlider.createStandardLabels(90);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "\u00b0");
}
}
rotationSlider.setLabelTable(labels);
}
inclinationSlider.setMajorTickSpacing(45);
inclinationSlider.setMaximum(INCLINATION_SLIDER_MAX);
inclinationSlider.setMinimum(INCLINATION_SLIDER_MIN);
inclinationSlider.setMinorTickSpacing(15);
inclinationSlider.setPaintLabels(true);
inclinationSlider.setPaintTicks(true);
inclinationSlider.setName("Adjust plan oblique view angle"); // NOI18N
inclinationSlider.setPreferredSize(new java.awt.Dimension(250, 54));
inclinationSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
cameraPanel.add(inclinationSlider, gridBagConstraints);
{
java.util.Hashtable labels = inclinationSlider.createStandardLabels(45);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "\u00b0");
}
}
inclinationSlider.setLabelTable(labels);
}
jLabel1.setText("Rotation");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(jLabel1, gridBagConstraints);
inclinationLabel.setText("Inclination");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(inclinationLabel, gridBagConstraints);
jLabel3.setText("Distance");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(jLabel3, gridBagConstraints);
distanceSlider.setMaximum((int)(100 * Map3DViewer.MAX_DISTANCE));
distanceSlider.setMinimum((int)(100 * Map3DViewer.MIN_DISTANCE));
distanceSlider.setToolTipText("Zoom in or out");
distanceSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
cameraPanel.add(distanceSlider, gridBagConstraints);
viewAngleSlider.setMajorTickSpacing(45);
viewAngleSlider.setMaximum(180);
viewAngleSlider.setMinorTickSpacing(15);
viewAngleSlider.setPaintLabels(true);
viewAngleSlider.setPaintTicks(true);
viewAngleSlider.setToolTipText("Telephoto or wide-angle lens.");
viewAngleSlider.setPreferredSize(new java.awt.Dimension(250, 54));
viewAngleSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
cameraPanel.add(viewAngleSlider, gridBagConstraints);
{
java.util.Hashtable labels = viewAngleSlider.createStandardLabels(45);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "\u00b0");
}
}
viewAngleSlider.setLabelTable(labels);
}
jLabel4.setText("Field of View");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(jLabel4, gridBagConstraints);
cameraDefaultButton.setText("Default");
cameraDefaultButton.setToolTipText("Reset to default viewing parameters");
cameraDefaultButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cameraDefaultButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(cameraDefaultButton, gridBagConstraints);
infoLabel.setText("<html><small>Click and drag the mouse to rotate the view. <br>The model is moved when the shift key is <br>pressed while dragging. Use the scroll wheel<br>of the mouse to zoom.</small></html>");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 15, 0, 0);
cameraPanel.add(infoLabel, gridBagConstraints);
shiftYSlider.setMajorTickSpacing(50);
shiftYSlider.setMinimum(-100);
shiftYSlider.setMinorTickSpacing(10);
shiftYSlider.setPaintLabels(true);
shiftYSlider.setPaintTicks(true);
shiftYSlider.setToolTipText(SHIFTY_TOOLTIP);
shiftYSlider.setValue(0);
shiftYSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
shiftSliderStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
cameraPanel.add(shiftYSlider, gridBagConstraints);
shiftXLabel.setText("Shift X");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(shiftXLabel, gridBagConstraints);
shiftYLabel.setText("Shift Y");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(shiftYLabel, gridBagConstraints);
shiftXSlider.setMajorTickSpacing(50);
shiftXSlider.setMinimum(-100);
shiftXSlider.setMinorTickSpacing(10);
shiftXSlider.setPaintLabels(true);
shiftXSlider.setPaintTicks(true);
shiftXSlider.setToolTipText(SHIFTX_TOOLTIP);
shiftXSlider.setValue(0);
shiftXSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
shiftSliderStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
cameraPanel.add(shiftXSlider, gridBagConstraints);
cameraComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Perspective View", "Parallel Oblique", "Plan Oblique", "2D Orthogonal" }));
cameraComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cameraComboBoxItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
cameraPanel.add(cameraComboBox, gridBagConstraints);
jLabel2.setText("Camera");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
cameraPanel.add(jLabel2, gridBagConstraints);
optionsTabbedPane.addTab("Camera", null, cameraPanel, "Projection of the 3D model");
shadingPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0));
shadingPanel_.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 10, 5, 1));
shadingPanel_.setLayout(new java.awt.GridBagLayout());
diffuseSlider.setMajorTickSpacing(25);
diffuseSlider.setMinorTickSpacing(5);
diffuseSlider.setPaintLabels(true);
diffuseSlider.setPaintTicks(true);
diffuseSlider.setToolTipText("Brightness of diffuse reflection");
diffuseSlider.setPreferredSize(new java.awt.Dimension(250, 54));
diffuseSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
shadingPanel_.add(diffuseSlider, gridBagConstraints);
{
java.util.Hashtable labels = diffuseSlider.createStandardLabels(25);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "%");
}
}
diffuseSlider.setLabelTable(labels);
}
jLabel6.setText("Diffuse Reflection");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
shadingPanel_.add(jLabel6, gridBagConstraints);
ambientSlider.setMajorTickSpacing(25);
ambientSlider.setMinorTickSpacing(5);
ambientSlider.setPaintLabels(true);
ambientSlider.setPaintTicks(true);
ambientSlider.setToolTipText("Brightness of ambient illlumination");
ambientSlider.setPreferredSize(new java.awt.Dimension(250, 54));
ambientSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
shadingPanel_.add(ambientSlider, gridBagConstraints);
{
java.util.Hashtable labels = ambientSlider.createStandardLabels(25);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "%");
}
}
ambientSlider.setLabelTable(labels);
}
jLabel7.setText("Ambient Light");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
shadingPanel_.add(jLabel7, gridBagConstraints);
jLabel8.setText("Elevation");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
shadingPanel_.add(jLabel8, gridBagConstraints);
elevationSlider.setMajorTickSpacing(45);
elevationSlider.setMaximum(90);
elevationSlider.setMinorTickSpacing(15);
elevationSlider.setPaintLabels(true);
elevationSlider.setPaintTicks(true);
elevationSlider.setToolTipText("Elevation of illumination source above the horizon.");
elevationSlider.setPreferredSize(new java.awt.Dimension(250, 54));
elevationSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
shadingPanel_.add(elevationSlider, gridBagConstraints);
{
java.util.Hashtable labels = elevationSlider.createStandardLabels(45);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "\u00b0");
}
}
elevationSlider.setLabelTable(labels);
}
jLabel9.setText("Azimuth");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
shadingPanel_.add(jLabel9, gridBagConstraints);
azimuthSlider.setMajorTickSpacing(90);
azimuthSlider.setMaximum(360);
azimuthSlider.setMinorTickSpacing(15);
azimuthSlider.setPaintLabels(true);
azimuthSlider.setPaintTicks(true);
azimuthSlider.setToolTipText("Direction of illumination moving clockwise from north.");
azimuthSlider.setPreferredSize(new java.awt.Dimension(250, 54));
azimuthSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
shadingPanel_.add(azimuthSlider, gridBagConstraints);
{
java.util.Hashtable labels = azimuthSlider.createStandardLabels(90);
java.util.Enumeration e = labels.elements();
while(e.hasMoreElements()) {
javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement();
if (comp instanceof javax.swing.JLabel) {
javax.swing.JLabel label = (javax.swing.JLabel)(comp);
label.setText(label.getText() + "\u00b0");
}
}
azimuthSlider.setLabelTable(labels);
}
shadingDefaultButton.setText("Default Shading");
shadingDefaultButton.setToolTipText("Reset to default shading parameters");
shadingDefaultButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
shadingDefaultButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
shadingPanel_.add(shadingDefaultButton, gridBagConstraints);
fogButton.setText("Haze");
fogButton.setToolTipText("Simulate haze in the background.");
fogButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fogButtonActionPerformed(evt);
}
});
jPanel1.add(fogButton);
hypsoButton.setText("Hypsometric Tints");
hypsoButton.setToolTipText("Add colors depending on terrain altitude.");
hypsoButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
hypsoButtonActionPerformed(evt);
}
});
jPanel1.add(hypsoButton);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 0);
shadingPanel_.add(jPanel1, gridBagConstraints);
shadingPanel.add(shadingPanel_);
optionsTabbedPane.addTab("Shading", shadingPanel);
antialiasingPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 5, 20));
antialiasingPanel1.setLayout(new java.awt.GridBagLayout());
antialiasingCheckBox.setText("Enable Anti-Aliasing");
antialiasingCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
antialiasingCheckBoxActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 20, 0);
antialiasingPanel1.add(antialiasingCheckBox, gridBagConstraints);
jLabel12.setText("Anti-Aliasing Quality:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
antialiasingPanel1.add(jLabel12, gridBagConstraints);
antialiasingComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "2x (Fast)", "4x", "8x (Slow)" }));
antialiasingComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
antialiasingComboBoxItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
antialiasingPanel1.add(antialiasingComboBox, gridBagConstraints);
jLabel13.setText("<html><small>Changes to the quality setting will take effect the next time you <br>start this application.<br>Note: Not all graphics cards support high-quality anti-aliasing.</small></html>");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
antialiasingPanel1.add(jLabel13, gridBagConstraints);
antialiasingPanel.add(antialiasingPanel1);
optionsTabbedPane.addTab("Anti-Aliasing", antialiasingPanel);
add(optionsTabbedPane, new java.awt.GridBagConstraints());
}// </editor-fold>//GEN-END:initComponents
private void adjustGUIToCamera() {
switch (map3DViewer.getCamera()) {
case perspective:
inclinationSlider.setMaximum(INCLINATION_SLIDER_MAX);
inclinationSlider.setMinimum(INCLINATION_SLIDER_MIN);
inclinationSlider.setEnabled(true);
viewAngleSlider.setEnabled(true);
inclinationSlider.setToolTipText("Tilt the model.");
break;
case parallelOblique:
inclinationSlider.setMaximum(INCLINATION_SLIDER_MAX);
inclinationSlider.setMinimum(INCLINATION_SLIDER_MIN);
inclinationSlider.setEnabled(true);
viewAngleSlider.setEnabled(false);
inclinationSlider.setToolTipText("Foreshorten the view in vertical direction.");
break;
case planOblique:
inclinationSlider.setMaximum(SHEAR_SLIDER_MAX);
inclinationSlider.setMinimum(SHEAR_SLIDER_MIN);
inclinationSlider.setEnabled(true);
viewAngleSlider.setEnabled(false);
inclinationSlider.setToolTipText("Adjust the plan oblique angle.");
break;
case orthogonal:
inclinationSlider.setMaximum(INCLINATION_SLIDER_MAX);
inclinationSlider.setMinimum(INCLINATION_SLIDER_MIN);
inclinationSlider.setEnabled(false);
viewAngleSlider.setEnabled(false);
inclinationSlider.setToolTipText("");
break;
case cylindrical:
inclinationSlider.setMaximum(CYL_HEIGHT_SLIDER_MAX);
inclinationSlider.setMinimum(CYL_HEIGHT_SLIDER_MIN);
inclinationSlider.setEnabled(true);
viewAngleSlider.setEnabled(true);
inclinationSlider.setToolTipText("Height of the cylindrical camera.");
inclinationLabel.setText("Height");
shiftXLabel.setText("Camera X");
shiftYLabel.setText("Camera Y");
shiftXSlider.setToolTipText(CYLINDER_POSX_TOOLTIP);
shiftYSlider.setToolTipText(CYLINDER_POSY_TOOLTIP);
break;
}
boolean cylindricalCamera = map3DViewer.getCamera() == Camera.cylindrical;
inclinationSlider.setPaintLabels(!cylindricalCamera);
inclinationSlider.setPaintTicks(!cylindricalCamera);
if (!cylindricalCamera) {
inclinationLabel.setText("Inclination");
shiftXLabel.setText("Shift X");
shiftYLabel.setText("Shift Y");
shiftXSlider.setToolTipText(SHIFTX_TOOLTIP);
shiftYSlider.setToolTipText(SHIFTY_TOOLTIP);
}
}
private void fogCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fogCheckBoxActionPerformed
this.map3DViewer.setFogEnabled(fogCheckBox.isSelected());
this.fogStartSlider.setEnabled(fogCheckBox.isSelected());
this.fogDensitySlider.setEnabled(fogCheckBox.isSelected());
this.fogColorButton.setEnabled(fogCheckBox.isSelected());
}//GEN-LAST:event_fogCheckBoxActionPerformed
private void fogSliderChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_fogSliderChanged
float fogStart = fogStartSlider.getValue() / 100f;
float density = fogDensitySlider.getValue() / 100f;
float fogEnd = fogStart + density;
this.map3DViewer.setFogStart(fogStart);
this.map3DViewer.setFogEnd(fogEnd);
}//GEN-LAST:event_fogSliderChanged
private void fogColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fogColorButtonActionPerformed
Color fogColor = fogColorButton.getColor();
this.map3DViewer.setFogColor(fogColor);
}//GEN-LAST:event_fogColorButtonActionPerformed
private void fogColorButtonPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_fogColorButtonPropertyChange
if (ColorPicker.SELECTED_COLOR_PROPERTY.equals(evt.getPropertyName())) {
this.map3DViewer.setFogColor((Color) evt.getNewValue());
}
}//GEN-LAST:event_fogColorButtonPropertyChange
private void hypsoCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hypsoCheckBoxActionPerformed
hypsoSlider.setEnabled(hypsoCheckBox.isSelected());
hypsoDefaultButton.setEnabled(hypsoCheckBox.isSelected());
adjustHypsometricTintingVisibility();
}//GEN-LAST:event_hypsoCheckBoxActionPerformed
private void adjustHypsometricTintingVisibility() {
if (hypsoCheckBox.isSelected()) {
this.readHypsometricTints();
} else {
map3DViewer.clearTextureImage();
}
}
private void readHypsometricTints() {
BufferedImage image = new BufferedImage(256, 1, BufferedImage.TYPE_INT_ARGB);
for (int i = 0; i < 256; i++) {
// GradientSlider returns null for 0 and 1. Rescale to get around this bug.
// float t = i / 255f;
float t = (1 + 253f / 255f * i) / 255f;
Color color = (Color) hypsoSlider.getValue(t);
image.setRGB(i, 0, color.getRGB());
}
/*
System.out.println("colors");
Color colors[] = hypsoSlider.getColors();
for (int i = 0; i < colors.length; i++) {
Color c = colors[i];
System.out.println(c.getRed() + " " + c.getBlue() + " " + c.getGreen());
}
System.out.println("positions");
float values[] = hypsoSlider.getThumbPositions();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
*/
map3DViewer.setTextureImage(image);
}
public void showHypsometricDialog() {
hypsoCheckBox.setSelected(map3DViewer.hasTexture() && map3DViewer.isTexture1D());
JOptionPane.showOptionDialog(this,
hypsoPanel,
"Hypsometric Tints",
JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE,
null, null, null);
adjustHypsometricTintingVisibility();
}
private void hypsoSliderPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_hypsoSliderPropertyChange
String propName = evt.getPropertyName();
if (MultiThumbSlider.VALUES_PROPERTY.equals(propName) // thumb position
|| MultiThumbSlider.ADJUST_PROPERTY.equals(propName) // color
) {
if (!hypsoSlider.isValueAdjusting()) {
this.readHypsometricTints();
}
}
}//GEN-LAST:event_hypsoSliderPropertyChange
private void hypsoDefaultButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hypsoDefaultButtonActionPerformed
this.initHypsoSlider();
}//GEN-LAST:event_hypsoDefaultButtonActionPerformed
private void antialiasingComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_antialiasingComboBoxItemStateChanged
if (!updatingGUI && evt.getStateChange() == ItemEvent.SELECTED) {
int level = this.antialiasingComboBox.getSelectedIndex();
int antialiasingLevel = 2;
for (int i = 0; i < level; i++) {
antialiasingLevel *= 2;
}
Map3DOptionsPanel.setAntialiasingLevel(antialiasingLevel);
}
}//GEN-LAST:event_antialiasingComboBoxItemStateChanged
/**
* Switch between 2D and 3D viewing mode.
*
* @param evt
*/
private void antialiasingCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_antialiasingCheckBoxActionPerformed
if (this.updatingGUI) {
return;
}
this.writeGUIToModel();
map3DViewer.display();
}//GEN-LAST:event_antialiasingCheckBoxActionPerformed
private void hypsoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hypsoButtonActionPerformed
showHypsometricDialog();
}//GEN-LAST:event_hypsoButtonActionPerformed
private void fogButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fogButtonActionPerformed
fogCheckBox.setSelected(map3DViewer.isFogEnabled());
float fogStart = map3DViewer.getFogStart();
float fogEnd = map3DViewer.getFogEnd();
float fogDensity = fogEnd - fogStart;
fogStartSlider.setValue(Math.round(fogStart * 100));
fogDensitySlider.setValue(Math.round(fogDensity * 100));
fogColorButton.setColor(map3DViewer.getFogColor());
JOptionPane.showOptionDialog(this,
fogPanel,
"Haze",
JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE,
null, null, null);
}//GEN-LAST:event_fogButtonActionPerformed
private void shadingDefaultButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shadingDefaultButtonActionPerformed
map3DViewer.defaultShading();
updatingGUI = true;
try {
ambientSlider.setValue((int) (map3DViewer.getAmbientLight() * 100));
diffuseSlider.setValue((int) (map3DViewer.getDiffuseLight() * 100));
azimuthSlider.setValue((int) map3DViewer.getLightAzimuth());
elevationSlider.setValue(90 - (int) map3DViewer.getLightZenith());
} finally {
updatingGUI = false;
}
map3DViewer.display();
}//GEN-LAST:event_shadingDefaultButtonActionPerformed
private void sliderChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sliderChanged
this.writeGUIToModel();
map3DViewer.display();
}//GEN-LAST:event_sliderChanged
private void cameraComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cameraComboBoxItemStateChanged
if (evt.getStateChange() != ItemEvent.SELECTED || this.updatingGUI) {
return;
}
this.updatingGUI = true;
try {
String name = (String) cameraComboBox.getSelectedItem();
this.map3DViewer.setCamera(Map3DViewer.camera(name));
this.adjustGUIToCamera();
this.map3DViewer.display();
} finally {
this.updatingGUI = false;
}
}//GEN-LAST:event_cameraComboBoxItemStateChanged
private void shiftSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_shiftSliderStateChanged
// The grid must potentially be changed when the location of the
// cylindrical camera changes. So only do the change once, when the slider
// is released.
boolean cylindricalCamera = map3DViewer.getCamera() == Camera.cylindrical;
if (cylindricalCamera && ((JSlider) evt.getSource()).getValueIsAdjusting()) {
return;
}
writeGUIToModel();
map3DViewer.display();
}//GEN-LAST:event_shiftSliderStateChanged
private void cameraDefaultButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cameraDefaultButtonActionPerformed
map3DViewer.resetToDefaultCamera();
writeModelToGUI();
map3DViewer.display();
}//GEN-LAST:event_cameraDefaultButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JSlider ambientSlider;
private javax.swing.JCheckBox antialiasingCheckBox;
private javax.swing.JComboBox antialiasingComboBox;
private javax.swing.JPanel antialiasingPanel;
private javax.swing.JPanel antialiasingPanel1;
private javax.swing.JSlider azimuthSlider;
private javax.swing.JComboBox cameraComboBox;
private javax.swing.JSlider diffuseSlider;
private javax.swing.JSlider distanceSlider;
private javax.swing.JSlider elevationSlider;
private javax.swing.JCheckBox fogCheckBox;
private ika.gui.ColorButton fogColorButton;
private javax.swing.JSlider fogDensitySlider;
private javax.swing.JPanel fogPanel;
private javax.swing.JSlider fogStartSlider;
private javax.swing.JCheckBox hypsoCheckBox;
private javax.swing.JButton hypsoDefaultButton;
private javax.swing.JPanel hypsoPanel;
private com.bric.swing.GradientSlider hypsoSlider;
private javax.swing.JLabel inclinationLabel;
private javax.swing.JSlider inclinationSlider;
private javax.swing.JLabel infoLabel;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel1;
private javax.swing.JTabbedPane optionsTabbedPane;
private javax.swing.JSlider rotationSlider;
private javax.swing.JPanel shadingPanel;
private javax.swing.JLabel shiftXLabel;
private javax.swing.JSlider shiftXSlider;
private javax.swing.JLabel shiftYLabel;
private javax.swing.JSlider shiftYSlider;
private javax.swing.JSlider viewAngleSlider;
// End of variables declaration//GEN-END:variables
@Override
public void propertyChange(PropertyChangeEvent evt) {
this.writeModelToGUI();
}
@Override
public void keyTyped(KeyEvent e) {
this.map3DViewer.getAnimation().keyTyped(e);
}
@Override
public void keyPressed(KeyEvent e) {
this.map3DViewer.getAnimation().keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
this.map3DViewer.getAnimation().keyReleased(e);
}
public static void setAntialiasingLevel(int antialiasLevel) {
Preferences prefs = Preferences.userRoot().node(prefsNodeName);
prefs.putInt(prefsAntialiasingLevel, antialiasLevel);
}
public static int getAntialiasingLevel() {
Preferences prefs = Preferences.userRoot().node(prefsNodeName);
return prefs.getInt(prefsAntialiasingLevel, 2);
}
}