Added camera panning and recenter command to model viewer.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4179 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -15,6 +15,7 @@ m.view_pivots = Show Pivots
|
|||||||
m.view_bounds = Show Bounds
|
m.view_bounds = Show Bounds
|
||||||
m.view_normals = Show Normals
|
m.view_normals = Show Normals
|
||||||
m.view_light = Rotate Light...
|
m.view_light = Rotate Light...
|
||||||
|
m.view_recenter = Recenter Camera
|
||||||
|
|
||||||
m.animation_mode = Animation Mode
|
m.animation_mode = Animation Mode
|
||||||
m.mode_flipbook = Flipbook
|
m.mode_flipbook = Flipbook
|
||||||
|
|||||||
@@ -230,8 +230,7 @@ public class CameraHandler
|
|||||||
public void zoomCamera (float distance)
|
public void zoomCamera (float distance)
|
||||||
{
|
{
|
||||||
Vector3f loc = _camera.getLocation();
|
Vector3f loc = _camera.getLocation();
|
||||||
float dist = -1f * _ground.normal.dot(loc) /
|
float dist = getGroundPoint().distance(loc),
|
||||||
_ground.normal.dot(_camera.getDirection()),
|
|
||||||
ndist = Math.min(Math.max(dist + distance, _minZoom), _maxZoom);
|
ndist = Math.min(Math.max(dist + distance, _minZoom), _maxZoom);
|
||||||
if ((distance = ndist - dist) == 0f) {
|
if ((distance = ndist - dist) == 0f) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -69,10 +69,12 @@ import javax.swing.event.ChangeListener;
|
|||||||
import javax.swing.filechooser.FileFilter;
|
import javax.swing.filechooser.FileFilter;
|
||||||
|
|
||||||
import com.jme.bounding.BoundingBox;
|
import com.jme.bounding.BoundingBox;
|
||||||
|
import com.jme.bounding.BoundingVolume;
|
||||||
import com.jme.image.Texture;
|
import com.jme.image.Texture;
|
||||||
import com.jme.light.DirectionalLight;
|
import com.jme.light.DirectionalLight;
|
||||||
import com.jme.math.FastMath;
|
import com.jme.math.FastMath;
|
||||||
import com.jme.math.Vector3f;
|
import com.jme.math.Vector3f;
|
||||||
|
import com.jme.renderer.Camera;
|
||||||
import com.jme.renderer.ColorRGBA;
|
import com.jme.renderer.ColorRGBA;
|
||||||
import com.jme.renderer.Renderer;
|
import com.jme.renderer.Renderer;
|
||||||
import com.jme.scene.Line;
|
import com.jme.scene.Line;
|
||||||
@@ -98,6 +100,7 @@ import com.threerings.util.MessageManager;
|
|||||||
|
|
||||||
import com.threerings.jme.JmeCanvasApp;
|
import com.threerings.jme.JmeCanvasApp;
|
||||||
import com.threerings.jme.Log;
|
import com.threerings.jme.Log;
|
||||||
|
import com.threerings.jme.camera.CameraHandler;
|
||||||
import com.threerings.jme.model.Model;
|
import com.threerings.jme.model.Model;
|
||||||
import com.threerings.jme.model.TextureProvider;
|
import com.threerings.jme.model.TextureProvider;
|
||||||
|
|
||||||
@@ -254,6 +257,16 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK));
|
KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK));
|
||||||
view.add(new JMenuItem(rlight));
|
view.add(new JMenuItem(rlight));
|
||||||
|
|
||||||
|
Action rcamera = new AbstractAction(_msg.get("m.view_recenter")) {
|
||||||
|
public void actionPerformed (ActionEvent e) {
|
||||||
|
((OrbitCameraHandler)_camhand).recenter();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
rcamera.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_C);
|
||||||
|
rcamera.putValue(Action.ACCELERATOR_KEY,
|
||||||
|
KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK));
|
||||||
|
view.add(new JMenuItem(rcamera));
|
||||||
|
|
||||||
_frame.getContentPane().add(getCanvas(), BorderLayout.CENTER);
|
_frame.getContentPane().add(getCanvas(), BorderLayout.CENTER);
|
||||||
|
|
||||||
JPanel bpanel = new JPanel(new BorderLayout());
|
JPanel bpanel = new JPanel(new BorderLayout());
|
||||||
@@ -336,6 +349,12 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
_canvas.addMouseWheelListener(orbiter);
|
_canvas.addMouseWheelListener(orbiter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override // documentation inherited
|
||||||
|
protected CameraHandler createCameraHandler (Camera camera)
|
||||||
|
{
|
||||||
|
return new OrbitCameraHandler(camera);
|
||||||
|
}
|
||||||
|
|
||||||
@Override // documentation inherited
|
@Override // documentation inherited
|
||||||
protected void initRoot ()
|
protected void initRoot ()
|
||||||
{
|
{
|
||||||
@@ -570,6 +589,10 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
});
|
});
|
||||||
_model.updateRenderState();
|
_model.updateRenderState();
|
||||||
|
|
||||||
|
// recenter the camera
|
||||||
|
_model.updateGeometricState(0f, true);
|
||||||
|
((OrbitCameraHandler)_camhand).recenter();
|
||||||
|
|
||||||
// configure the animation panel
|
// configure the animation panel
|
||||||
String[] anims = _model.getAnimationNames();
|
String[] anims = _model.getAnimationNames();
|
||||||
if (anims.length == 0) {
|
if (anims.length == 0) {
|
||||||
@@ -736,11 +759,14 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
{
|
{
|
||||||
int dx = e.getX() - _mloc.x, dy = e.getY() - _mloc.y;
|
int dx = e.getX() - _mloc.x, dy = e.getY() - _mloc.y;
|
||||||
_mloc.setLocation(e.getX(), e.getY());
|
_mloc.setLocation(e.getX(), e.getY());
|
||||||
if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
|
int mods = e.getModifiers();
|
||||||
|
if ((mods & MouseEvent.BUTTON1_MASK) != 0) {
|
||||||
_camhand.tiltCamera(dy * FastMath.PI / 1000);
|
_camhand.tiltCamera(dy * FastMath.PI / 1000);
|
||||||
_camhand.orbitCamera(-dx * FastMath.PI / 1000);
|
_camhand.orbitCamera(-dx * FastMath.PI / 1000);
|
||||||
|
} else if ((mods & MouseEvent.BUTTON2_MASK) != 0) {
|
||||||
|
_camhand.zoomCamera(dy/8f);
|
||||||
} else {
|
} else {
|
||||||
_camhand.zoomCamera(dy);
|
_camhand.panCamera(-dx/8f, dy/8f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -754,6 +780,54 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
protected Point _mloc = new Point();
|
protected Point _mloc = new Point();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** A camera handler that pans in directions orthogonal to the camera
|
||||||
|
* direction. */
|
||||||
|
protected class OrbitCameraHandler extends CameraHandler
|
||||||
|
{
|
||||||
|
public OrbitCameraHandler (Camera camera)
|
||||||
|
{
|
||||||
|
super(camera);
|
||||||
|
_gpoint = super.getGroundPoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // documentation inherited
|
||||||
|
public void panCamera (float x, float y) {
|
||||||
|
Vector3f offset = _camera.getLeft().mult(-x).addLocal(
|
||||||
|
_camera.getUp().mult(y));
|
||||||
|
getGroundPoint().addLocal(offset);
|
||||||
|
_camera.getLocation().addLocal(offset);
|
||||||
|
_camera.onFrameChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // documentation inherited
|
||||||
|
public Vector3f getGroundPoint ()
|
||||||
|
{
|
||||||
|
return _gpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the ground point to the center of the grid or, if there is
|
||||||
|
* one, the center of the model.
|
||||||
|
*/
|
||||||
|
public void recenter ()
|
||||||
|
{
|
||||||
|
Vector3f target = new Vector3f();
|
||||||
|
if (_model != null) {
|
||||||
|
BoundingVolume bound = (BoundingVolume)_model.getWorldBound();
|
||||||
|
if (bound != null) {
|
||||||
|
bound.getCenter(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Vector3f offset = target.subtract(_gpoint);
|
||||||
|
_camera.getLocation().addLocal(offset);
|
||||||
|
_camera.onFrameChange();
|
||||||
|
_gpoint.set(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The point at which the camera is looking. */
|
||||||
|
protected Vector3f _gpoint;
|
||||||
|
}
|
||||||
|
|
||||||
/** The app configuration. */
|
/** The app configuration. */
|
||||||
protected static Config _config =
|
protected static Config _config =
|
||||||
new Config("com/threerings/jme/tools/ModelViewer");
|
new Config("com/threerings/jme/tools/ModelViewer");
|
||||||
|
|||||||
Reference in New Issue
Block a user