package mocap.gui;
|
|
import java.awt.Dimension;
|
import java.awt.GridLayout;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
|
import javax.media.j3d.Transform3D;
|
import javax.swing.BorderFactory;
|
import javax.swing.ImageIcon;
|
import javax.swing.JButton;
|
import javax.swing.JLabel;
|
import javax.swing.JPanel;
|
import javax.swing.JSlider;
|
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeListener;
|
import javax.vecmath.Point3d;
|
|
import mocap.JMocap;
|
import java.net.URL;
|
import javax.swing.BoxLayout;
|
|
/**
|
* Pane on right hand side to load animations, change perspective,
|
* playback etc.
|
*
|
* @author Michael Kipp
|
*/
|
public class ControlPanel extends JPanel
|
{
|
|
private static final int DEFAULT_FPS = 120;
|
private JMocap _jmocap;
|
private JMocapGUI _gui;
|
private int _lastRot;
|
protected JButton _playButton;
|
protected ImageIcon _playIcon, _pauseIcon;
|
private InfoPanel _info;
|
private JLabel _fpsLabel;
|
private JSlider _fpsSlider;
|
|
protected ControlPanel(JMocap app, JMocapGUI gui, ActionListener actionListener)
|
{
|
_jmocap = app;
|
_gui = gui;
|
setLayout(new GridLayout(0, 1));
|
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
add(createFilePane(actionListener));
|
add(createPlaybackPane());
|
add(createFpsPane());
|
add(create3DControls());
|
add(createCursorControls());
|
add(_info = new InfoPanel(app));
|
}
|
|
public InfoPanel getInfo()
|
{
|
return _info;
|
}
|
|
public void setFps(int n)
|
{
|
_fpsSlider.setValue(n);
|
}
|
|
private JPanel createFilePane(ActionListener actionListener)
|
{
|
JPanel p = new JPanel();
|
p.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(1), "File"));
|
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
|
JButton loadASF = new JButton(JMocapGUI.LOAD_ASF);
|
JButton loadAMC = new JButton(JMocapGUI.LOAD_AMC);
|
JButton loadBVH = new JButton(JMocapGUI.LOAD_BVH);
|
JButton clearAll = new JButton("Clear");
|
p.add(loadASF);
|
p.add(loadAMC);
|
p.add(loadBVH);
|
p.add(clearAll);
|
loadASF.addActionListener(actionListener);
|
loadAMC.addActionListener(actionListener);
|
loadBVH.addActionListener(actionListener);
|
clearAll.addActionListener(new ActionListener()
|
{
|
|
@Override
|
public void actionPerformed(ActionEvent e)
|
{
|
_jmocap.clearAll();
|
}
|
});
|
return p;
|
}
|
|
private ImageIcon getIcon(String path)
|
{
|
URL url = getClass().getResource("/" + path);
|
if (url != null) {
|
System.out.println("found url: " + url);
|
return new ImageIcon(url);
|
} else {
|
System.out.println("no url");
|
return new ImageIcon(path);
|
}
|
}
|
|
private JPanel createPlaybackPane()
|
{
|
JPanel p = new JPanel();
|
p.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(1), "Play"));
|
// _playIcon = new ImageIcon("img/Play16.gif");
|
|
|
_playIcon = getIcon("img/Play16.gif");
|
|
_pauseIcon = getIcon("img/Pause16.gif");
|
_playButton = new JButton(_playIcon);
|
JButton stop = new JButton(getIcon("img/Stop16.gif"));
|
JButton ffwd = new JButton(getIcon("img/StepForward16.gif"));
|
JButton fbwd = new JButton(getIcon("img/StepBack16.gif"));
|
JButton reset = new JButton("reset");
|
_playButton.setFocusPainted(false);
|
_playButton.setRolloverEnabled(false);
|
stop.setFocusPainted(false);
|
stop.setRolloverEnabled(false);
|
_playButton.addActionListener(new ActionListener()
|
{
|
|
@Override
|
public void actionPerformed(ActionEvent e)
|
{
|
if (_playButton.getIcon() == _playIcon) {
|
if (_jmocap.getFigureManager().playAll()) {
|
_playButton.setIcon(_pauseIcon);
|
}
|
} else {
|
pause();
|
_playButton.setIcon(_playIcon);
|
}
|
}
|
});
|
stop.addActionListener(new ActionListener()
|
{
|
|
@Override
|
public void actionPerformed(ActionEvent e)
|
{
|
if (_playButton.getIcon() == _pauseIcon) {
|
_playButton.setIcon(_playIcon);
|
}
|
_jmocap.getFigureManager().stopAll();
|
}
|
});
|
ffwd.addActionListener(new ActionListener()
|
{
|
|
@Override
|
public void actionPerformed(ActionEvent e)
|
{
|
pause();
|
_jmocap.getFigureManager().frameForwardAll();
|
}
|
});
|
fbwd.addActionListener(new ActionListener()
|
{
|
|
@Override
|
public void actionPerformed(ActionEvent e)
|
{
|
pause();
|
_jmocap.getFigureManager().frameBackwardAll();
|
}
|
});
|
reset.addActionListener(new ActionListener()
|
{
|
|
@Override
|
public void actionPerformed(ActionEvent e)
|
{
|
_jmocap.getFigure().getSkeleton().reset();
|
}
|
});
|
p.add(_playButton);
|
p.add(stop);
|
p.add(fbwd);
|
p.add(ffwd);
|
p.add(reset);
|
return p;
|
}
|
|
/**
|
* Panel for 3D controls: rotation and zoom.
|
*/
|
private JPanel create3DControls()
|
{
|
JPanel p = new JPanel();
|
JPanel p1 = new JPanel();
|
JLabel lrot = new JLabel("Rotate:");
|
lrot.setHorizontalAlignment(JLabel.CENTER);
|
JLabel lzoom = new JLabel("Zoom:");
|
p.setBorder(BorderFactory.createEtchedBorder());
|
final JSlider rotSlider = new JSlider(-180, 180);
|
rotSlider.setMajorTickSpacing(180);
|
rotSlider.setPaintTicks(true);
|
rotSlider.setPaintLabels(true);
|
p1.setLayout(new GridLayout(0, 1));
|
p1.add(lrot);
|
p1.add(rotSlider);
|
final JSlider distSlider = new JSlider(JSlider.VERTICAL, 0, 50, (int) JMocapController.CAMERA.z);
|
distSlider.setMajorTickSpacing(25);
|
distSlider.setPaintLabels(true);
|
distSlider.setPaintTicks(true);
|
distSlider.setPreferredSize(new Dimension(50, 90));
|
rotSlider.setPreferredSize(new Dimension(120, 50));
|
_lastRot = 0;
|
rotSlider.addChangeListener(new ChangeListener()
|
{
|
|
@Override
|
public void stateChanged(ChangeEvent e)
|
{
|
Transform3D tf = new Transform3D();
|
Transform3D t2 = new Transform3D();
|
t2.rotY(Math.toRadians(_lastRot - rotSlider.getValue()));
|
_lastRot = rotSlider.getValue();
|
_jmocap.getUniverse().getViewingPlatform().getViewPlatformTransform().getTransform(tf);
|
t2.mul(tf);
|
_jmocap.getUniverse().getViewingPlatform().getViewPlatformTransform().setTransform(t2);
|
}
|
});
|
distSlider.addChangeListener(new ChangeListener()
|
{
|
|
@Override
|
public void stateChanged(ChangeEvent e)
|
{
|
Transform3D tf = new Transform3D();
|
_jmocap.getUniverse().getViewingPlatform().getViewPlatformTransform().getTransform(tf);
|
Point3d cam = new Point3d(0, 0, 0);
|
tf.transform(cam);
|
cam.z = distSlider.getValue();
|
_jmocap.setCameraView(cam, JMocapController.CAMERA_TARGET);
|
}
|
});
|
p.add(p1);
|
p.add(lzoom);
|
p.add(distSlider);
|
return p;
|
}
|
|
/**
|
* Panel for 3D controls: rotation and zoom.
|
*/
|
private JPanel createCursorControls()
|
{
|
final int MAX = 300;
|
JPanel p = new JPanel();
|
JPanel p1 = new JPanel();
|
JLabel lrot = new JLabel("x:");
|
lrot.setHorizontalAlignment(JLabel.CENTER);
|
JLabel lzoom = new JLabel("z:");
|
p.setBorder(BorderFactory.createEtchedBorder());
|
final JSlider xSlider = new JSlider(-MAX, MAX);
|
xSlider.setMajorTickSpacing(100);
|
xSlider.setPaintTicks(true);
|
xSlider.setPaintLabels(true);
|
p1.setLayout(new GridLayout(0, 1));
|
p1.add(lrot);
|
p1.add(xSlider);
|
final JSlider zSlider = new JSlider(JSlider.VERTICAL, -MAX, MAX, 0);
|
zSlider.setMajorTickSpacing(100);
|
zSlider.setPaintLabels(true);
|
zSlider.setPaintTicks(true);
|
xSlider.setPreferredSize(new Dimension(150, 50));
|
zSlider.setPreferredSize(new Dimension(50, 120));
|
|
_lastRot = 0;
|
ChangeListener ch = new ChangeListener()
|
{
|
|
@Override
|
public void stateChanged(ChangeEvent e)
|
{
|
_gui.moveCursor(xSlider.getValue() / 10f, -zSlider.getValue() / 10f);
|
}
|
};
|
xSlider.addChangeListener(ch);
|
zSlider.addChangeListener(ch);
|
p.add(p1);
|
p.add(lzoom);
|
p.add(zSlider);
|
return p;
|
}
|
|
private JSlider createFpsSlider()
|
{
|
final JSlider s = new JSlider(JSlider.HORIZONTAL, 0, 200, DEFAULT_FPS);
|
s.setPreferredSize(new Dimension(120, 50));
|
s.setMinorTickSpacing(10);
|
s.setMajorTickSpacing(50);
|
s.setPaintTicks(true);
|
s.setPaintLabels(true);
|
s.setSnapToTicks(true);
|
s.addChangeListener(new ChangeListener()
|
{
|
|
@Override
|
public void stateChanged(ChangeEvent e)
|
{
|
int i = s.getValue();
|
_fpsLabel.setText("fps: " + i);
|
_jmocap.getFigureManager().setFpsAll(s.getValue());
|
}
|
});
|
_fpsSlider = s;
|
return s;
|
}
|
|
private JPanel createFpsPane()
|
{
|
JPanel p = new JPanel();
|
p.setLayout(new GridLayout(0, 1));
|
p.setBorder(BorderFactory.createEtchedBorder());
|
_fpsLabel = new JLabel("fps: " + DEFAULT_FPS);
|
_fpsLabel.setHorizontalAlignment(JLabel.CENTER);
|
p.add(_fpsLabel);
|
p.add(createFpsSlider());
|
p.setPreferredSize(new Dimension(200, 100));
|
return p;
|
}
|
|
protected void pause()
|
{
|
if (_playButton.getIcon() == _pauseIcon) {
|
_playButton.setIcon(_playIcon);
|
_jmocap.getFigureManager().pauseAll();
|
}
|
}
|
}
|