update:
As i removed the GUI code in the first time. Now there is a reworked version of it. I reused most of the actions code so it look cleaner and might be a little bit harder to read. But as you have to read anyway through it, that should no matter. Here we go, the GUI code.
BubbleModelViewer.java
/* =============================================================================
* BubbleModelViewer.java Bubble_Engine
* com.evildevil.bubble.tools
* Copyright (c) 2004 - 2005 Benjamin "Evil-Devil" Behrendt
* All rights reserved
* -------------------------------------------------------------------------- */
package com.evildevil.bubble.tools.model;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Hashtable;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.html.HTMLEditorKit;
import org.lwjgl.LWJGLException;
import com.evildevil.bubble.core.AWTOpenGLCanvas;
import com.evildevil.tools.designtools.Screen;
/**
* @author Benjamin "Evil-Devil" Behrendt
* @version 1.0, 11.11.2005
*/
public class BubbleModelViewer {
private final String APP_TITLE = "Bubble Model Viewer";
private final String APP_ABOUT_IMAGE_NAME = "resources/Bubble_Engine_Logo_Small.png";
private final float APP_VERSION = 1.1f;
private final String APP_ABOUT_TEXT = "<html><h2>"+APP_TITLE+"</h2><hr>"+
"<strong>Version:</strong> "+APP_VERSION+"<br><br>"+
"<strong><em>(c) Copyright 2005 Benjamin "Evil-Devil" Behrendt<br>"+
"All rights reserved</em></strong><hr>"+
"Visit us at: <a href=\"http://www.evil-devil.com\" target=\"_blank\" style=\"hover:font-weight: bold;\">"+
"http://www.evil-devil.com</a></html>";
private JFrame mvFrame = null;
private AWTOpenGLCanvas awtOGLCanvas = null;
private JMenuBar mvMenuBar = null;
private JCheckBox autoRot;
private JCheckBox autoRotX;
private JCheckBox autoRotY;
private JCheckBox autoRotZ;
private final JSlider rotXSpeed = createControlSlider(-100,100,0,10,5);
private final JSlider rotYSpeed = createControlSlider(-100,100,0,10,5);
private final JSlider rotZSpeed = createControlSlider(-100,100,0,10,5);
private final JSlider moveXSpeed = createControlSlider(-100,100,0,10,5);
private final JSlider moveYSpeed = createControlSlider(-100,100,0,10,5);
private final JSlider moveZSpeed = createControlSlider(-100,100,0,10,5);
private final JTextField rotX = new JTextField("0");
private final JTextField rotY = new JTextField("0");
private final JTextField rotZ = new JTextField("0");
private final JTextField moveX = new JTextField("0");
private final JTextField moveY = new JTextField("0");
private final JTextField moveZ = new JTextField("0");
private JCheckBox texturing;
private JCheckBox wireframe;
private JCheckBox lighting;
public BubbleModelViewer() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private void createAndShowGUI() {
mvFrame = new JFrame(this.APP_TITLE);
mvFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// add menu
mvFrame.setJMenuBar(createModelViewerMenu());
JPanel mvPanel = new JPanel(); // becomes our ContentPane
JPanel displayPanel = new JPanel(); // will hold the GLCanvas
JPanel toolPanel = new JPanel(); // takes our tools
JPanel consolePanel = new JPanel(); // takes our output console
JPanel renderAutoPanel = new JPanel();
renderAutoPanel.setLayout(new BoxLayout(renderAutoPanel,BoxLayout.LINE_AXIS));
renderAutoPanel.add(createRenderingPanel());
renderAutoPanel.add(Box.createRigidArea(new Dimension(8,0)));
renderAutoPanel.add(createAutoRotationPanel());
// mvPanel setup
mvPanel.setLayout(new BoxLayout(mvPanel,BoxLayout.LINE_AXIS));
// displayPanel setup
displayPanel.setLayout(new BorderLayout());
displayPanel.setMaximumSize(new Dimension(640,480));
try {
awtOGLCanvas = new AWTOpenGLCanvas(new ModelViewerRenderer());
awtOGLCanvas.setSize(640,480);
// init the scene data
} catch (LWJGLException lwjgle) {
lwjgle.printStackTrace();
}
displayPanel.add(awtOGLCanvas,BorderLayout.CENTER);
// toolPanel setup
toolPanel.setLayout(new BoxLayout(toolPanel,BoxLayout.PAGE_AXIS));
toolPanel.setBorder(new EmptyBorder(2,4,2,2));
toolPanel.add(renderAutoPanel);
toolPanel.add(Box.createRigidArea(new Dimension(0,9)));
toolPanel.add(createTranslationPanel());
toolPanel.add(Box.createRigidArea(new Dimension(0,9)));
toolPanel.add(createRotationPanel());
// add everything
mvPanel.add(displayPanel);
mvPanel.add(toolPanel);
mvFrame.getContentPane().add(mvPanel);
// pack it and set the position
mvFrame.pack();
mvFrame.setLocation(Screen.getCenteredTopLeftPosition(mvFrame.getSize()));
// Display the stuff
mvFrame.setResizable(false);
awtOGLCanvas.setVisible(true);
mvFrame.setVisible(true);
}
private JPanel createRotationPanel() {
final JPanel rotPanel = new JPanel(); // the final panel
final TitledBorder title = new TitledBorder("Rotation");
JPanel buttonPanel;
JPanel sliderPanel;
JPanel fieldPanel;
rotPanel.setAlignmentY(Component.LEFT_ALIGNMENT);
rotPanel.setBorder(title);
rotPanel.setLayout(new BoxLayout(rotPanel,BoxLayout.LINE_AXIS));
// create and add the buttons
buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.PAGE_AXIS));
buttonPanel.add(createControlButton("Rotate X",new RotateAction("X")));
buttonPanel.add(Box.createRigidArea(new Dimension(0,35)));
buttonPanel.add(createControlButton("Rotate Y",new RotateAction("Y")));
buttonPanel.add(Box.createRigidArea(new Dimension(0,38)));
buttonPanel.add(createControlButton("Rotate Z",new RotateAction("Z")));
rotPanel.add(buttonPanel);
rotPanel.add(Box.createRigidArea(new Dimension(16,0)));
// create and add the sliders
sliderPanel = new JPanel();
sliderPanel.setLayout(new BoxLayout(sliderPanel,BoxLayout.PAGE_AXIS));
JLabel sliderLabel = createControlLabel("Speed");
sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
rotXSpeed.addChangeListener(new SliderAction("RX",rotX));
sliderPanel.add(sliderLabel);
sliderPanel.add(rotXSpeed);
sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
rotYSpeed.addChangeListener(new SliderAction("RY",rotY));
sliderPanel.add(Box.createRigidArea(new Dimension(0,10)));
sliderPanel.add(rotYSpeed);
sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
rotZSpeed.addChangeListener(new SliderAction("RZ",rotZ));
sliderPanel.add(Box.createRigidArea(new Dimension(0,10)));
sliderPanel.add(rotZSpeed);
rotPanel.add(sliderPanel);
rotPanel.add(Box.createRigidArea(new Dimension(16,0)));
// create and add the textfields
fieldPanel = new JPanel();
fieldPanel.setLayout(new BoxLayout(fieldPanel,BoxLayout.PAGE_AXIS));
fieldPanel.add(Box.createRigidArea(new Dimension(0,12)));
rotX.setColumns(4);
rotX.addActionListener(new SliderFieldAction(rotXSpeed,"RX"));
fieldPanel.add(rotX);
fieldPanel.add(Box.createRigidArea(new Dimension(0,30)));
rotY.setColumns(4);
rotY.addActionListener(new SliderFieldAction(rotYSpeed,"RY"));
fieldPanel.add(rotY);
fieldPanel.add(Box.createRigidArea(new Dimension(0,38)));
rotZ.setColumns(4);
rotZ.addActionListener(new SliderFieldAction(rotZSpeed,"RZ"));
fieldPanel.add(rotZ);
fieldPanel.add(Box.createRigidArea(new Dimension(0,12)));
rotPanel.add(fieldPanel);
return rotPanel;
}
private JPanel createAutoRotationPanel() {
final JPanel rotPanel = new JPanel();
final TitledBorder title = new TitledBorder("Auto-Rotation");
rotPanel.setAlignmentY(Component.LEFT_ALIGNMENT);
rotPanel.setLayout(new BoxLayout(rotPanel,BoxLayout.PAGE_AXIS));
rotPanel.setBorder(title);
final JPanel autoPanel = new JPanel();
autoPanel.setLayout(new BoxLayout(autoPanel,BoxLayout.LINE_AXIS));
autoPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
autoPanel.add(autoRot = createControlCheckBox("Enable",new RenderingAndAutoRotateAction("AUTO"),true,false));
final JPanel xyzPanel = new JPanel();
xyzPanel.setLayout(new BoxLayout(xyzPanel,BoxLayout.LINE_AXIS));
xyzPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
xyzPanel.add(autoRotX = createControlCheckBox("X",new RenderingAndAutoRotateAction("X"),false,false));
xyzPanel.add(Box.createRigidArea(new Dimension(16,0)));
xyzPanel.add(autoRotY = createControlCheckBox("Y",new RenderingAndAutoRotateAction("Y"),false,false));
xyzPanel.add(Box.createRigidArea(new Dimension(16,0)));
xyzPanel.add(autoRotZ = createControlCheckBox("Z",new RenderingAndAutoRotateAction("Z"),false,false));
rotPanel.add(autoPanel);
rotPanel.add(Box.createVerticalStrut(8));
rotPanel.add(xyzPanel);
return rotPanel;
}
private JPanel createTranslationPanel() {
final JPanel rotPanel = new JPanel(); // the final panel
final TitledBorder title = new TitledBorder("Translation");
JPanel buttonPanel;
JPanel sliderPanel;
JPanel fieldPanel;
rotPanel.setAlignmentY(Component.LEFT_ALIGNMENT);
rotPanel.setBorder(title);
rotPanel.setLayout(new BoxLayout(rotPanel,BoxLayout.LINE_AXIS));
// create and add the buttons with the apropriate listeners
buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.PAGE_AXIS));
buttonPanel.add(createControlButton("Transl. X",new TranslateAction("X")));
buttonPanel.add(Box.createRigidArea(new Dimension(0,35)));
buttonPanel.add(createControlButton("Transl. Y",new TranslateAction("Y")));
buttonPanel.add(Box.createRigidArea(new Dimension(0,38)));
buttonPanel.add(createControlButton("Transl. Z",new TranslateAction("Z")));
rotPanel.add(buttonPanel);
rotPanel.add(Box.createRigidArea(new Dimension(16,0)));
// create and add the sliders
sliderPanel = new JPanel();
sliderPanel.setLayout(new BoxLayout(sliderPanel,BoxLayout.PAGE_AXIS));
JLabel sliderLabel = createControlLabel("Speed");
sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
moveXSpeed.addChangeListener(new SliderAction("TX",moveX));
sliderPanel.add(sliderLabel);
sliderPanel.add(moveXSpeed);
sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
moveYSpeed.addChangeListener(new SliderAction("TY",moveY));
sliderPanel.add(Box.createRigidArea(new Dimension(0,10)));
sliderPanel.add(moveYSpeed);
sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
moveZSpeed.addChangeListener(new SliderAction("TZ",moveZ));
sliderPanel.add(Box.createRigidArea(new Dimension(0,10)));
sliderPanel.add(moveZSpeed);
rotPanel.add(sliderPanel);
rotPanel.add(Box.createRigidArea(new Dimension(16,0)));
// create and add the textfields
fieldPanel = new JPanel();
fieldPanel.setLayout(new BoxLayout(fieldPanel,BoxLayout.PAGE_AXIS));
fieldPanel.add(Box.createRigidArea(new Dimension(0,12)));
moveX.setColumns(4);
moveX.addActionListener(new SliderFieldAction(moveXSpeed,"TX"));
fieldPanel.add(moveX);
fieldPanel.add(Box.createRigidArea(new Dimension(0,30)));
moveY.setColumns(4);
moveY.addActionListener(new SliderFieldAction(moveYSpeed,"TY"));
fieldPanel.add(moveY);
fieldPanel.add(Box.createRigidArea(new Dimension(0,38)));
moveZ.setColumns(4);
moveZ.addActionListener(new SliderFieldAction(moveZSpeed,"TZ"));
fieldPanel.add(moveZ);
fieldPanel.add(Box.createRigidArea(new Dimension(0,12)));
rotPanel.add(fieldPanel);
return rotPanel;
}
private JPanel createRenderingPanel() {
final JPanel renderPanel = new JPanel();
final TitledBorder title = new TitledBorder("Rendering");
renderPanel.setAlignmentY(Component.LEFT_ALIGNMENT);
renderPanel.setBorder(title);
renderPanel.setLayout(new BoxLayout(renderPanel,BoxLayout.PAGE_AXIS));
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.LINE_AXIS));
panel.setAlignmentX(Component.LEFT_ALIGNMENT);
panel.add(texturing = createControlCheckBox("Texturing",new RenderingAndAutoRotateAction("TEXTURE"),true));
panel.add(Box.createRigidArea(new Dimension(13,0)));
panel.add(lighting = createControlCheckBox("Lighting",new RenderingAndAutoRotateAction("LIGHT"),true));
renderPanel.add(panel);
renderPanel.add(Box.createRigidArea(new Dimension(0,8)));
panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.LINE_AXIS));
panel.setAlignmentX(Component.LEFT_ALIGNMENT);
panel.add(wireframe = createControlCheckBox("Wireframe",new RenderingAndAutoRotateAction("WIREFRAME"),false));
panel.add(Box.createRigidArea(new Dimension(4,0)));
panel.add(createControlCheckBox("Reset all",new RenderingAndAutoRotateAction("RESET"),false));
renderPanel.add(panel);
return renderPanel;
}
private void setAutoRotate(boolean auto) {
this.autoRotX.setEnabled(auto);
this.autoRotY.setEnabled(auto);
this.autoRotZ.setEnabled(auto);
}
private JLabel createControlLabel(String title) {
final JLabel label = new JLabel(title);
return label;
}
private JButton createControlButton(String title) {
final JButton button = new JButton(title);
// we want small buttons ^_^
button.setMargin(new Insets(1,8,0,8));
return button;
}
private JButton createControlButton(String title, ActionListener listener) {
final JButton button = createControlButton(title);
button.addActionListener(listener);
return button;
}
private JCheckBox createControlCheckBox(String title, ItemListener listener, boolean enabled, boolean selected) {
final JCheckBox box = createControlCheckBox(title,listener,selected);
box.setEnabled(enabled);
return box;
}
private JCheckBox createControlCheckBox(String title, ItemListener listener, boolean selected) {
final JCheckBox box = new JCheckBox(title);
box.setSelected(selected);
box.addItemListener(listener);
return box;
}
private JSlider createControlSlider(int min, int max, int start,int major, int minor) {
final JSlider slider = new JSlider(min,max,start);
final Hashtable<Integer,JLabel> sliderTexts = new Hashtable<Integer,JLabel>();
sliderTexts.put(min,new JLabel(Float.toString(min/major)));
sliderTexts.put(start,new JLabel(Float.toString(start)));
sliderTexts.put(max,new JLabel(Float.toString(max/major)));
slider.setMajorTickSpacing(major);
slider.setMinorTickSpacing(minor);
slider.setLabelTable(sliderTexts);
slider.setPaintTicks(true);
slider.setPaintTrack(true);
slider.setPaintLabels(true);
return slider;
}
private JMenuBar createModelViewerMenu() {
final JMenuBar bar = new JMenuBar();
JPopupMenu.setDefaultLightWeightPopupEnabled(false); // disable leightweight
JMenu menu = new JMenu("File");
menu.add(createMenuItem("Open",new OpenAction()));
//menu.addSeparator();
//menu.add(createMenuItem("Show Temple Model",new ShowAction("temple_tex.obj")));
//menu.add(createMenuItem("Show F16 Model",new ShowAction("AF_F16.obj")));
//menu.addSeparator();
menu.add(createMenuItem("Preferences",new PreferencesAction()));
menu.add(createMenuItem("Take Screenshot",new ScreenShotAction()));
menu.add(createMenuItem("Exit",new ExitAction()));
bar.add(menu);
menu = new JMenu("?");
menu.add(createMenuItem("About",new AboutAction()));
bar.add(menu);
JPopupMenu.setDefaultLightWeightPopupEnabled(true); // enable leightweight
return bar;
}
private JMenuItem createMenuItem(String name, ActionListener listener) {
final JMenuItem item = new JMenuItem(name);
item.addActionListener(listener);
return item;
}
private void reset() {
// reset all checkboxes and sliders we have
texturing.setSelected(true);
lighting.setSelected(true);
wireframe.setSelected(false);
// reset the autorot stuff
autoRot.setSelected(false);
autoRotX.setSelected(false);
autoRotY.setSelected(false);
autoRotZ.setSelected(false);
// reset the rotspeed sliders
rotXSpeed.setValue(0);
rotYSpeed.setValue(0);
rotZSpeed.setValue(0);
// reset the transspeed sliders
moveXSpeed.setValue(0);
moveYSpeed.setValue(0);
moveZSpeed.setValue(0);
// reset also the rotation and translation of the model
getRenderer().reset();
}
public ModelViewerRenderer getRenderer() {
return (ModelViewerRenderer)awtOGLCanvas.getRenderer();
}
/* =========================================================================
* MAIN Entrance
* ---------------------------------------------------------------------- */
public static void main(String[] args) {
BubbleModelViewer bmv = new BubbleModelViewer();
}
/* =========================================================================
* ACTIONS
* ---------------------------------------------------------------------- */
class ExitAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
mvFrame.dispose();
System.exit(0); // just to make sure the JVM will exit
}
}
class AboutAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAboutDialog();
}
});
}
private void createAboutDialog() {
final JDialog dialog = new JDialog(mvFrame,"About",true);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
panel.setBorder(new EmptyBorder(5,5,5,5));
JEditorPane textPane = new JEditorPane();
textPane.setEditable(false);
textPane.setBackground(dialog.getBackground());
textPane.setEditorKit(new HTMLEditorKit());
textPane.setText(APP_ABOUT_TEXT);
panel.add(textPane);
JButton okButton = new JButton("OK");
okButton.setAlignmentX(Component.RIGHT_ALIGNMENT);
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}
});
panel.add(Box.createRigidArea(new Dimension(0,8)));
panel.add(okButton);
dialog.setContentPane(panel);
// packing :)
dialog.pack();
// center it
dialog.setLocation(Screen.getCenteredTopLeftPosition(dialog.getSize()));
dialog.setVisible(true);
}
}
class OpenAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showOpenDialog();
}
});
}
private void showOpenDialog() {
JFileChooser fc = new JFileChooser("models/");
int result = fc.showOpenDialog(mvFrame);
if (result == JFileChooser.APPROVE_OPTION) {
// we assign the rendercanvas to our own one :)
final ModelViewerRenderer renderer = getRenderer();
// only load the model if the canvas that is used by the renderer
// acknowlegded the renderer that its ready
if (renderer.isInitialized()) {
// reset any modified controls
reset();
// reset the renderer just to be sure there is no old data rest
renderer.resetRenderer();
// set the modelFileName
renderer.setModelFileName(fc.getSelectedFile().getName());
// init the data
renderer.initScene();
// we got the data, now pre-render it
renderer.preRenderScene();
// everything is done, the model should now be displayed
}
}
}
}
class PreferencesAction extends AbstractAction {
private float fov = 0f;
private boolean needUpdate = false;
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showPreferences();
}
});
}
private void showPreferences() {
final JDialog dialog = new JDialog(mvFrame,"Preferences",true);
final JButton okButton = new JButton("OK");
final JButton cancelButton = new JButton("Cancel");
final JButton applyButton = new JButton("Apply");
dialog.setSize(223,98);
final float x = mvFrame.getX() + mvFrame.getWidth()/2 - dialog.getWidth()/2;
final float y = mvFrame.getY() + mvFrame.getHeight()/2 - dialog.getHeight()/2;
dialog.setLocation((int)x,(int)y);
JPanel dialogPanel = new JPanel();
dialogPanel.setLayout(new BoxLayout(dialogPanel,BoxLayout.PAGE_AXIS));
dialogPanel.setBorder(new EmptyBorder(5,5,5,5));
// build the dialog GUI
JPanel panel = new JPanel();
final JTextField fovField = new JTextField(Float.toString(getRenderer().getFOV()));
fovField.setColumns(5);
fovField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final JTextField source = (JTextField)e.getSource();
if (source.getText() == null || source.getText().length() == 0)
return;
try {
fov = Float.parseFloat(source.getText());
} catch (NumberFormatException nfe) {
source.setText(Float.toString(getRenderer().getFOV()));
}
// as the value was changed or even not, disable the ok button and enable apply button
okButton.setEnabled(false);
applyButton.setEnabled(true);
}
});
panel.setLayout(new BoxLayout(panel,BoxLayout.LINE_AXIS));
panel.add(createControlLabel("Field Of View (FOV):"));
panel.add(Box.createRigidArea(new Dimension(8,0)));
panel.add(fovField);
dialogPanel.add(panel);
dialogPanel.add(Box.createRigidArea(new Dimension(0,8)));
panel = new JPanel();
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// call the renderer updateFOV()
// only update if the new fov differs from the current
if (needUpdate) {
// make sure that we have a valid renderer,
// for the case that someone change something within
// the preferences before everything else
getRenderer().updateFOV();
needUpdate = false;
}
// exit the dialog
dialog.dispose();
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// just exist without doing something;
dialog.dispose();
}
});
applyButton.setEnabled(false);
applyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// update the fov value
if (fov > 0f && fov != getRenderer().getFOV())
getRenderer().setFOV(fov);
// enable the ok button
okButton.setEnabled(true);
// disable you
applyButton.setEnabled(false);
needUpdate = true;
}
});
panel.setLayout(new BoxLayout(panel,BoxLayout.LINE_AXIS));
panel.add(okButton);
panel.add(Box.createRigidArea(new Dimension(8,0)));
panel.add(cancelButton);
panel.add(Box.createRigidArea(new Dimension(8,0)));
panel.add(applyButton);
dialogPanel.add(panel);
dialog.setContentPane(dialogPanel);
dialog.pack();
dialog.setVisible(true);
}
}
class ScreenShotAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
if (getRenderer().isInitialized())
getRenderer().takeScreenShot();
}
}
class RotateAction extends AbstractAction {
private String rotationTarget = null;
public RotateAction(String rotation) {
this.rotationTarget = rotation;
}
public void actionPerformed(ActionEvent e) {
if (rotationTarget.equalsIgnoreCase("X"))
((ModelViewerRenderer)awtOGLCanvas.getRenderer()).rotateX();
if (rotationTarget.equalsIgnoreCase("Y"))
((ModelViewerRenderer)awtOGLCanvas.getRenderer()).rotateY();
if (rotationTarget.equalsIgnoreCase("Z"))
((ModelViewerRenderer)awtOGLCanvas.getRenderer()).rotateZ();
}
}
class TranslateAction extends AbstractAction {
private String translateTarget = null;
public TranslateAction(String translation) {
this.translateTarget = translation;
}
public void actionPerformed(ActionEvent e) {
if (translateTarget.equalsIgnoreCase("X"))
getRenderer().translateX();
if (translateTarget.equalsIgnoreCase("Y"))
getRenderer().translateY();
if (translateTarget.equalsIgnoreCase("Z"))
getRenderer().translateZ();
}
}
class RenderingAndAutoRotateAction implements ItemListener {
private String renderingTarget = null;
public RenderingAndAutoRotateAction(String rendering) {
this.renderingTarget = rendering;
}
public void itemStateChanged(ItemEvent e) {
final boolean active = e.getStateChange() == ItemEvent.SELECTED ? true : false;
if (renderingTarget.equalsIgnoreCase("TEXTURE"))
getRenderer().setTexturing(active);
if (renderingTarget.equalsIgnoreCase("LIGHT"))
getRenderer().setLighting(active);
if (renderingTarget.equalsIgnoreCase("WIREFRAME"))
getRenderer().setWireframe(active);
if (renderingTarget.equalsIgnoreCase("RESET") && active) {
reset(); // reset our GUI elements and the renderer
((JCheckBox)e.getSource()).setSelected(false);
}
if (renderingTarget.equalsIgnoreCase("AUTO")) {
setAutoRotate(active);
getRenderer().setAutoRotate(active);
}
if (autoRot.isEnabled()) {
if (renderingTarget.equalsIgnoreCase("X"))
getRenderer().setAutoRotateX(active);
if (renderingTarget.equalsIgnoreCase("Y"))
getRenderer().setAutoRotateY(active);
if (renderingTarget.equalsIgnoreCase("Z"))
getRenderer().setAutoRotateZ(active);
}
}
}
class SliderAction implements ChangeListener {
private String sliderTarget = "";
private JTextField inputTarget = null;
public SliderAction(String slider, JTextField input) {
this.sliderTarget = slider;
this.inputTarget = input;
}
public void stateChanged(ChangeEvent e) {
final JSlider slider = (JSlider)e.getSource();
if(!slider.getValueIsAdjusting()) {
final float speed = (float)slider.getValue()/10;
// rotation speed
if (sliderTarget.equalsIgnoreCase("RX"))
getRenderer().setRotateXSpeed(speed);
if (sliderTarget.equalsIgnoreCase("RY"))
getRenderer().setRotateYSpeed(speed);
if (sliderTarget.equalsIgnoreCase("RZ"))
getRenderer().setRotateZSpeed(speed);
// translation speed
if (sliderTarget.equalsIgnoreCase("TX"))
getRenderer().setTranslateXSpeed(speed);
if (sliderTarget.equalsIgnoreCase("TY"))
getRenderer().setTranslateYSpeed(speed);
if (sliderTarget.equalsIgnoreCase("TZ"))
getRenderer().setTranslateZSpeed(speed);
if (inputTarget != null)
inputTarget.setText(Float.toString((float)slider.getValue()/10));
}
}
}
class SliderFieldAction extends AbstractAction {
private JSlider sliderTarget = null;
private String renderTarget = "";
public SliderFieldAction(JSlider slider, String render) {
this.sliderTarget = slider;
this.renderTarget = render;
}
public void actionPerformed(ActionEvent e) {
final JTextField field = (JTextField)e.getSource();
if (field.getText() != null) {
try {
final int value = Integer.parseInt(field.getText().substring(0,field.getText().length() > 3 ? 3 : field.getText().length()));
applyToSlider(this.sliderTarget,value,10);
field.setText(Float.toString(value));
setRenderAction(this.renderTarget,value);
} catch (NumberFormatException nfe) {
field.setText("0");
setRenderAction(this.renderTarget,0);
}
}
}
private void setRenderAction(String render, float value) {
if (render.equalsIgnoreCase("TX"))
getRenderer().setTranslateXSpeed(value);
if (render.equalsIgnoreCase("TY"))
getRenderer().setTranslateYSpeed(value);
if (render.equalsIgnoreCase("TZ"))
getRenderer().setTranslateZSpeed(value);
if (render.equalsIgnoreCase("RX"))
getRenderer().setRotateXSpeed(value);
if (render.equalsIgnoreCase("RY"))
getRenderer().setRotateYSpeed(value);
if (render.equalsIgnoreCase("RZ"))
getRenderer().setRotateZSpeed(value);
}
private void applyToSlider(JSlider slider, int value, int multiple) {
if (value >= slider.getMaximum())
slider.setValue(slider.getMaximum());
else if (value <= slider.getMinimum())
slider.setValue(slider.getMinimum());
else slider.setValue(value*multiple);
}
}
class ShowAction extends AbstractAction {
private String modelName = null;
public ShowAction(String model) {
this.modelName = model;
}
public void actionPerformed(ActionEvent e) {
final ModelViewerRenderer renderer = getRenderer();
// only load the model if the canvas that is used by the renderer
// acknowlegded the renderer that its ready
if (this.modelName != null && renderer.isInitialized()) {
// reset any modified controls
reset();
// reset the renderer just to be sure there is no old data rest
renderer.resetRenderer();
// set the modelFileName
renderer.setModelFileName(this.modelName);
// init the data
renderer.initScene();
// we got the data, now pre-render it
renderer.preRenderScene();
// everything is done, the model should now be displayed
}
}
}
}