/* This file is part of the source code for 3D-XplorMath-J, Version 1.0 (January 2008).
* Copyright (c) 2008 The 3D-XplorMath Consortium (http://3d-xplormath.org).
* This source code is released under a BSD License, which allows redistribution
* in source and binary form, with or without modification, provided copyright
* and license information are included, and with no warranty or guarantee of
* any kind. For details, see http://3d-xplormath.org/j/source/BSDLicense.txt
*/
package vmm3d.core3D;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import vmm3d.core.I18n;
import vmm3d.core.ParameterInput;
import vmm3d.core.Prefs;
import vmm3d.core.RealParam;
import vmm3d.core.SettingsDialog;
/**
* A dialog for setting 3D view options (an eye separation multiplier that multiplies
* the inter-eye distance in all stereo views, and a choice of when anaglyph view
* mode should be used for an exhibit). Note that the values
* of these options are saved, using {@link Prefs}, in
* a way that makes them apply until the user exits the program.
*/
public class Set3DViewOptionsDialog extends SettingsDialog {
private View3D view;
private RealParam multiplier;
private ParameterInput input;
private double originalVal;
private JRadioButton alwaysAnaglyphButton, neverAnaglyphButton, defaultAnaglyphButton;
private String originalAnaglyph;
private JCheckBox moveObjectsForwardInAnaglyphToggle;
private boolean originalMoveObjectsForwardInAnaglyph;
public static void showDialog(View3D view) {
(new Set3DViewOptionsDialog(view)).setVisible(true);
}
/**
* Construct a dialog for setting the eye 3D view options.
* @param view A view whose display will be the parent of the dialog. This view is
* redrawn (if it is showing a stereo view) to show the new eye separation, and anaglyph
* is turned on or off if the setting of apply anaglyph is never or always.
*/
private Set3DViewOptionsDialog(View3D view) {
super(view.getDisplay(),I18n.tr("vmm3d.core3D.commands.SetEyeSep"));
this.view = view;
originalVal = Prefs.getDouble("eyeSeparationMultiplier", 1);
multiplier = new RealParam(I18n.tr("vmm3d.core3D.SetEyeSepDialog.EyeSep"),originalVal);
multiplier.setDefaultValue(1);
multiplier.setMinimumValueForInput(0.1);
multiplier.setMaximumValueForInput(10);
input = new ParameterInput(multiplier);
input.setColumns(5);
Box inputPanel = Box.createVerticalBox();
inputPanel.setBorder(BorderFactory.createEmptyBorder(12,12,12,12));
Box eyeSepInput = Box.createVerticalBox();
Box viewModeInput = Box.createVerticalBox();
Box anaglyphPositioningInput = Box.createVerticalBox();
eyeSepInput.setAlignmentX(0);
viewModeInput.setAlignmentX(0);
inputPanel.add(eyeSepInput);
inputPanel.add(Box.createVerticalStrut(12));
inputPanel.add(viewModeInput);
inputPanel.add(Box.createVerticalStrut(12));
inputPanel.add(anaglyphPositioningInput);
eyeSepInput.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.SetEyeSepMul")),
BorderFactory.createEmptyBorder(8,8,8,8)));
viewModeInput.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.SetViewModePref")),
BorderFactory.createEmptyBorder(8,8,8,8)));
anaglyphPositioningInput.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.SetAnaglyphObjectPosition")),
BorderFactory.createEmptyBorder(8,8,8,8)));
JLabel labl = new JLabel(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.EyeSep.info"));
labl.setAlignmentX(0);
eyeSepInput.add(labl);
viewModeInput.add(Box.createVerticalStrut(18));
JPanel temp = new JPanel();
labl = new JLabel(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.EyeSepMul") + " = ");
labl.setAlignmentX(0);
temp.add(labl);
eyeSepInput.add(temp);
temp.add(input);
temp.setAlignmentX(0);
originalAnaglyph = Prefs.get("view3d.initialAnaglyphMode", "default");
alwaysAnaglyphButton = new JRadioButton(I18n.tr("vmm3d.core3D.SetAnaglyphDefaultMode.always"));
neverAnaglyphButton = new JRadioButton(I18n.tr("vmm3d.core3D.SetAnaglyphDefaultMode.never"));
defaultAnaglyphButton = new JRadioButton(I18n.tr("vmm3d.core3D.SetAnaglyphDefaultMode.default"));
ButtonGroup group = new ButtonGroup();
group.add(alwaysAnaglyphButton);
group.add(neverAnaglyphButton);
group.add(defaultAnaglyphButton);
if (originalAnaglyph.equalsIgnoreCase("always"))
alwaysAnaglyphButton.setSelected(true);
else if (originalAnaglyph.equalsIgnoreCase("never"))
neverAnaglyphButton.setSelected(true);
else
defaultAnaglyphButton.setSelected(true);
labl = new JLabel(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.AnaglyphPref.info"));
viewModeInput.add(labl);
viewModeInput.add(Box.createVerticalStrut(12));
viewModeInput.add(defaultAnaglyphButton);
viewModeInput.add(alwaysAnaglyphButton);
viewModeInput.add(neverAnaglyphButton);
moveObjectsForwardInAnaglyphToggle = new JCheckBox(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.AnaglyphPositionOption"));
originalMoveObjectsForwardInAnaglyph = "yes".equals(Prefs.get("view3d.moveObjectsForwardInAnaglyph"));
moveObjectsForwardInAnaglyphToggle.setSelected(originalMoveObjectsForwardInAnaglyph);
anaglyphPositioningInput.add(Box.createVerticalStrut(2));
anaglyphPositioningInput.add(moveObjectsForwardInAnaglyphToggle);
addInfoLabel(I18n.tr("vmm3d.core3D.Set3DViewOptionsDialog.info"));
addInputPanel(inputPanel);
}
protected boolean doOK() {
String error = input.checkContents();
if (error != null) {
JOptionPane.showMessageDialog(this,error,I18n.tr("vmm3d.core.SettingsDialog.errorTitle"),JOptionPane.ERROR_MESSAGE);
return false;
}
input.setValueFromContents();
double sep = multiplier.getValue();
if (sep != originalVal) {
Prefs.putDouble("eyeSeparationMultiplier", sep);
if (view.getViewStyle() == View3D.RED_GREEN_STEREO_VIEW || view.getViewStyle() == View3D.STEREOGRAPH_VIEW
|| view.getViewStyle() == View3D.CROSS_EYE_STEREO_VIEW)
view.forceRedraw();
}
if (defaultAnaglyphButton.isSelected())
Prefs.put("view3d.initialAnaglyphMode","default");
else if (alwaysAnaglyphButton.isSelected()) {
if (view.getViewStyle() == View3D.MONOCULAR_VIEW)
view.setViewStyle(View3D.RED_GREEN_STEREO_VIEW);
Prefs.put("view3d.initialAnaglyphMode","always");
}
else if (neverAnaglyphButton.isSelected()) {
if (view.getViewStyle() == View3D.RED_GREEN_STEREO_VIEW)
view.setViewStyle(View3D.MONOCULAR_VIEW);
Prefs.put("view3d.initialAnaglyphMode","never");
}
if (moveObjectsForwardInAnaglyphToggle.isSelected()) {
if (view.getViewStyle() == View3D.RED_GREEN_STEREO_VIEW && view.getTransform3D() != null) {
double extent = Math.max(view.getTransform3D().getXmaxRequested() - view.getTransform3D().getXminRequested(),
view.getTransform3D().getYmaxRequested() - view.getTransform3D().getYminRequested());
view.getTransform3D().setObjectDisplacementNormalToScreen(extent/3);
}
Prefs.put("view3d.moveObjectsForwardInAnaglyph","yes");
}
else {
if (view.getViewStyle() == View3D.RED_GREEN_STEREO_VIEW && view.getTransform3D() != null)
view.getTransform3D().setObjectDisplacementNormalToScreen(0);
Prefs.put("view3d.moveObjectsForwardInAnaglyph","no");
}
return true;
}
protected void doDefaults() {
input.defaultVal();
defaultAnaglyphButton.setSelected(true);
moveObjectsForwardInAnaglyphToggle.setSelected(false);
}
}
Ads help maintain this website.