Added options for showing normals, bounds, and pivot axes.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4056 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -9,6 +9,11 @@ m.file_menu = File
|
|||||||
m.file_load = Load Model...
|
m.file_load = Load Model...
|
||||||
m.file_quit = Quit
|
m.file_quit = Quit
|
||||||
|
|
||||||
|
m.view_menu = View
|
||||||
|
m.view_pivots = Show Pivots
|
||||||
|
m.view_bounds = Show Bounds
|
||||||
|
m.view_normals = Show Normals
|
||||||
|
|
||||||
m.load_title = Select Model to Load
|
m.load_title = Select Model to Load
|
||||||
m.load_filter = Model Files (*.properties, *.dat)
|
m.load_filter = Model Files (*.properties, *.dat)
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import javax.swing.Action;
|
|||||||
import javax.swing.BorderFactory;
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.DefaultComboBoxModel;
|
import javax.swing.DefaultComboBoxModel;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JCheckBoxMenuItem;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
@@ -66,12 +67,17 @@ 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.ColorRGBA;
|
import com.jme.renderer.ColorRGBA;
|
||||||
|
import com.jme.renderer.Renderer;
|
||||||
import com.jme.scene.Line;
|
import com.jme.scene.Line;
|
||||||
|
import com.jme.scene.Node;
|
||||||
|
import com.jme.scene.Spatial;
|
||||||
import com.jme.scene.state.LightState;
|
import com.jme.scene.state.LightState;
|
||||||
import com.jme.scene.state.MaterialState;
|
import com.jme.scene.state.MaterialState;
|
||||||
import com.jme.scene.state.TextureState;
|
import com.jme.scene.state.TextureState;
|
||||||
|
import com.jme.scene.state.ZBufferState;
|
||||||
import com.jme.util.LoggingSystem;
|
import com.jme.util.LoggingSystem;
|
||||||
import com.jme.util.TextureManager;
|
import com.jme.util.TextureManager;
|
||||||
|
import com.jme.util.geom.Debugger;
|
||||||
|
|
||||||
import com.samskivert.swing.GroupLayout;
|
import com.samskivert.swing.GroupLayout;
|
||||||
import com.samskivert.swing.Spacer;
|
import com.samskivert.swing.Spacer;
|
||||||
@@ -144,6 +150,27 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK));
|
KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK));
|
||||||
file.add(quit);
|
file.add(quit);
|
||||||
|
|
||||||
|
JMenu view = new JMenu(_msg.get("m.view_menu"));
|
||||||
|
view.setMnemonic(KeyEvent.VK_V);
|
||||||
|
menu.add(view);
|
||||||
|
_pivots = new JCheckBoxMenuItem(_msg.get("m.view_pivots"));
|
||||||
|
_pivots.setMnemonic(KeyEvent.VK_P);
|
||||||
|
_pivots.setAccelerator(
|
||||||
|
KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK));
|
||||||
|
view.add(_pivots);
|
||||||
|
|
||||||
|
_bounds = new JCheckBoxMenuItem(_msg.get("m.view_bounds"));
|
||||||
|
_bounds.setMnemonic(KeyEvent.VK_B);
|
||||||
|
_bounds.setAccelerator(
|
||||||
|
KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.CTRL_MASK));
|
||||||
|
view.add(_bounds);
|
||||||
|
|
||||||
|
_normals = new JCheckBoxMenuItem(_msg.get("m.view_normals"));
|
||||||
|
_normals.setMnemonic(KeyEvent.VK_N);
|
||||||
|
_normals.setAccelerator(
|
||||||
|
KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
|
||||||
|
view.add(_normals);
|
||||||
|
|
||||||
_frame.getContentPane().add(getCanvas(), BorderLayout.CENTER);
|
_frame.getContentPane().add(getCanvas(), BorderLayout.CENTER);
|
||||||
|
|
||||||
JPanel bpanel = new JPanel(new BorderLayout());
|
JPanel bpanel = new JPanel(new BorderLayout());
|
||||||
@@ -250,6 +277,51 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
grid.setLightCombineMode(LightState.OFF);
|
grid.setLightCombineMode(LightState.OFF);
|
||||||
_ctx.getGeometry().attachChild(grid);
|
_ctx.getGeometry().attachChild(grid);
|
||||||
grid.updateRenderState();
|
grid.updateRenderState();
|
||||||
|
|
||||||
|
// attach a dummy node to draw debugging views
|
||||||
|
_ctx.getGeometry().attachChild(new Node("debug") {
|
||||||
|
public void onDraw (Renderer r) {
|
||||||
|
if (_model == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_pivots.getState()) {
|
||||||
|
drawPivots(_model, r);
|
||||||
|
}
|
||||||
|
if (_bounds.getState()) {
|
||||||
|
Debugger.drawBounds(_model, r);
|
||||||
|
}
|
||||||
|
if (_normals.getState()) {
|
||||||
|
Debugger.drawNormals(_model, r, 5f, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws the pivot axes of the given node and its children.
|
||||||
|
*/
|
||||||
|
protected void drawPivots (Spatial spatial, Renderer r)
|
||||||
|
{
|
||||||
|
if (_axes == null) {
|
||||||
|
_axes = new Line("axes",
|
||||||
|
new Vector3f[] { Vector3f.ZERO, Vector3f.UNIT_X, Vector3f.ZERO,
|
||||||
|
Vector3f.UNIT_Y, Vector3f.ZERO, Vector3f.UNIT_Z }, null,
|
||||||
|
new ColorRGBA[] { ColorRGBA.red, ColorRGBA.red,
|
||||||
|
ColorRGBA.green, ColorRGBA.green, ColorRGBA.blue,
|
||||||
|
ColorRGBA.blue }, null);
|
||||||
|
_axes.setRenderState(r.createZBufferState());
|
||||||
|
}
|
||||||
|
_axes.getRenderState(ZBufferState.RS_ZBUFFER).apply();
|
||||||
|
_axes.getWorldTranslation().set(spatial.getWorldTranslation());
|
||||||
|
_axes.getWorldRotation().set(spatial.getWorldRotation());
|
||||||
|
_axes.draw(r);
|
||||||
|
|
||||||
|
if (spatial instanceof Node) {
|
||||||
|
Node node = (Node)spatial;
|
||||||
|
for (int ii = 0, nn = node.getQuantity(); ii < nn; ii++) {
|
||||||
|
drawPivots(node.getChild(ii), r);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override // documentation inherited
|
@Override // documentation inherited
|
||||||
@@ -427,6 +499,9 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
/** The viewer frame. */
|
/** The viewer frame. */
|
||||||
protected JFrame _frame;
|
protected JFrame _frame;
|
||||||
|
|
||||||
|
/** Debug view switches. */
|
||||||
|
protected JCheckBoxMenuItem _pivots, _bounds, _normals;
|
||||||
|
|
||||||
/** The animation controls. */
|
/** The animation controls. */
|
||||||
protected JPanel _animctrls;
|
protected JPanel _animctrls;
|
||||||
|
|
||||||
@@ -448,6 +523,9 @@ public class ModelViewer extends JmeCanvasApp
|
|||||||
/** The currently loaded model. */
|
/** The currently loaded model. */
|
||||||
protected Model _model;
|
protected Model _model;
|
||||||
|
|
||||||
|
/** Reused to draw pivot axes. */
|
||||||
|
protected Line _axes;
|
||||||
|
|
||||||
/** Enables and disables the stop button when animations start and stop. */
|
/** Enables and disables the stop button when animations start and stop. */
|
||||||
protected Model.AnimationObserver _animobs =
|
protected Model.AnimationObserver _animobs =
|
||||||
new Model.AnimationObserver() {
|
new Model.AnimationObserver() {
|
||||||
|
|||||||
Reference in New Issue
Block a user