Initial commit.
[gravitysimulator.git] / src / edu / mit / ezyang / gravity / GravitySimulatorView.java
blob6b38c388fe19549aa0cd80758cfcf9186d9d8c0f
1 /*
2 * GravitySimulatorView.java
3 */
5 package edu.mit.ezyang.gravity;
7 import org.jdesktop.application.Action;
8 import org.jdesktop.application.SingleFrameApplication;
9 import org.jdesktop.application.FrameView;
10 import javax.swing.JDialog;
12 import javax.swing.JFrame;
13 import com.sun.j3d.utils.behaviors.mouse.*;
14 import com.sun.j3d.utils.geometry.*;
15 import com.sun.j3d.utils.universe.*;
16 import java.util.HashMap;
17 import javax.media.j3d.*;
18 import javax.swing.JPopupMenu;
19 import javax.vecmath.*;
21 /**
22 * The application's main frame.
24 public class GravitySimulatorView extends FrameView {
26 /**
27 * SimpleUniverse controlling everything
29 protected SimpleUniverse universe;
31 /**
32 * Root group node that new elements should be added to.
34 protected BranchGroup universeRoot;
36 /**
37 * 3D transform controlling viewpoint.
39 protected Transform3D viewTransform;
41 protected TransformGroup viewTransformGroup;
43 public GravitySimulatorView(SingleFrameApplication app) {
44 super(app);
46 // make menus heavy
47 JPopupMenu.setDefaultLightWeightPopupEnabled(false);
48 initComponents();
50 // 3D canvas initialization
51 Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
52 universe = new SimpleUniverse(canvas);
54 BranchGroup root = new BranchGroup();
55 TransformGroup rotateGroup = new TransformGroup();
56 universeRoot = new BranchGroup();
57 universeRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
58 universeRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
59 processCommand("add cube");
61 //processCommand("clear");
62 //processCommand("add sphere");
64 rotateGroup.addChild(universeRoot);
65 rotateGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
66 rotateGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
68 BoundingSphere bounding = new BoundingSphere(new Point3d(0f,0f,0f), 1000.0f);
70 DirectionalLight light = new DirectionalLight(new Color3f(1.8f, 0.2f, 0.2f), new Vector3f(4.0f, -7.0f, 7.0f));
71 light.setInfluencingBounds(bounding);
72 rotateGroup.addChild(light);
74 AmbientLight ambLight = new AmbientLight(new Color3f(1f, 1f, 1f));
75 ambLight.setInfluencingBounds(bounding);
76 rotateGroup.addChild(ambLight);
78 Transform3D yAxis = new Transform3D();
79 Alpha rotationAlpha = new Alpha(-1, 4000);
80 RotationInterpolator rotator = new RotationInterpolator(
81 rotationAlpha, rotateGroup, yAxis,
82 0.0f, (float) Math.PI*2.0f);
83 BoundingSphere bounds =
84 new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
85 rotator.setSchedulingBounds(bounds);
86 rotateGroup.addChild(rotator);
88 TransformGroup controlGroup = new TransformGroup();
89 controlGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
90 controlGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
91 MouseRotate behavior = new MouseRotate();
92 behavior.setTransformGroup(controlGroup);
93 behavior.setSchedulingBounds(new BoundingSphere());
94 controlGroup.addChild(behavior);
96 controlGroup.addChild(rotateGroup);
97 root.addChild(controlGroup);
98 universe.addBranchGraph(root);
99 ViewingPlatform platform = universe.getViewingPlatform();
100 platform.setNominalViewingTransform();
101 viewTransformGroup = platform.getMultiTransformGroup().getTransformGroup(0);
102 viewTransform = new Transform3D();
103 viewTransform.setTranslation(new Vector3f(0.0f,0.0f,10.0f));
104 viewTransformGroup.setTransform(viewTransform);
105 //universe.getViewer().getView().setFieldOfView(60f);
106 canvasPanel.add(canvas);
111 * Processes a command from the command line box, modifying Universe.
112 * @param command to execute
114 public void processCommand(String command) {
115 send(command);
116 String[] parts = command.split(" ");
117 if (parts.length == 0 || parts[0].equals("") || parts[0].equals("help")) {
118 send("Commands: add, view, clear");
119 return;
121 if (parts[0].equals("add")) {
122 if (parts.length == 1) {
123 send("Need object to add: sphere, cone, cube or cylinder");
124 return;
126 BranchGroup group = new BranchGroup();
127 group.setCapability(BranchGroup.ALLOW_DETACH);
129 // initialize default "first class" parameters
130 float scale = 0.4f;
131 Vector3f location = new Vector3f(0f, 0f, 0f);
133 // initialize generic params HashMap; this can be used for
134 // any sort of thing you want
135 HashMap<String, String> params = new HashMap<String, String>();
137 // parse the arguments
138 if (parts.length > 2) {
139 String state = null;
140 for (int i = 2; i < parts.length; i++) {
141 if (state == null) {
142 state = parts[i];
143 } else {
144 if (state.equals("scale")) {
145 scale = new Float(parts[i]);
146 } else if (state.equals("at")) {
147 location = vectorize(parts[i]);
148 } else {
149 params.put(state, parts[i]);
151 state = null;
155 // generate the actual primitive
156 Node object;
157 if (parts[1].equals("sphere")) {
158 Sphere sphere = new Sphere(scale);
159 sphere.getAppearance().getMaterial().setAmbientColor(.8f,.2f,.2f);
160 object = sphere;
161 } else if (parts[1].equals("cube")) {
162 object = new ColorCube(scale);
163 } else if (parts[1].equals("cone")) {
164 object = new Cone(scale * 1f, scale * 2f);
165 } else if (parts[1].equals("cylinder")) {
166 object = new Cylinder(scale * 1f, scale * 2f);
167 } else {
168 send("Unknown primitive: " + parts[1]);
169 return;
171 // generate the transform (we do this even if we don't position them
172 // anywhere interesting)
173 Transform3D transform = new Transform3D();
174 TransformGroup transformGroup = new TransformGroup();
175 transform.setTranslation(location);
176 transformGroup.setTransform(transform);
178 transformGroup.addChild(object);
179 group.addChild(transformGroup);
180 universeRoot.addChild(group);
181 } else if (parts[0].equals("view")) {
182 if (parts.length == 1) {
183 send("Need location parameter x,y,z");
184 return;
186 viewTransform.setTranslation(vectorize(parts[1]));
187 viewTransformGroup.setTransform(viewTransform);
188 } else if (parts[0].equals("zoom")) {
189 if (parts.length == 1) {
190 send("Need zoom value z (view 0,0,z)");
191 return;
193 viewTransform.setTranslation(vectorize("0,0," + parts[1]));
194 viewTransformGroup.setTransform(viewTransform);
195 } else if (parts[0].equals("clear")) {
196 universeRoot.removeAllChildren();
197 } else {
198 send("Unknown command: " + parts[0] + ", type help for options");
199 return;
204 * Converts string in form x,y,z to Vector3f
205 * @param input vector in form x,y,z
206 * @return
208 protected Vector3f vectorize(String input) {
209 String[] vectorFields = input.split(",");
210 return new Vector3f(new Float(vectorFields[0]), new Float(vectorFields[1]), new Float(vectorFields[2]));
213 protected void send(String message) {
214 terminal.append(message + "\n");
217 @Action
218 public void showAboutBox() {
219 if (aboutBox == null) {
220 JFrame mainFrame = GravitySimulatorApp.getApplication().getMainFrame();
221 aboutBox = new GravitySimulatorAboutBox(mainFrame);
222 aboutBox.setLocationRelativeTo(mainFrame);
224 GravitySimulatorApp.getApplication().show(aboutBox);
227 /** This method is called from within the constructor to
228 * initialize the form.
229 * WARNING: Do NOT modify this code. The content of this method is
230 * always regenerated by the Form Editor.
232 @SuppressWarnings("unchecked")
233 // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
234 private void initComponents() {
236 mainPanel = new javax.swing.JPanel();
237 canvasPanel = new javax.swing.JPanel();
238 console = new javax.swing.JPanel();
239 commandLine = new javax.swing.JTextField();
240 terminalPane = new javax.swing.JScrollPane();
241 terminal = new javax.swing.JTextArea();
242 menuBar = new javax.swing.JMenuBar();
243 javax.swing.JMenu fileMenu = new javax.swing.JMenu();
244 javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
245 javax.swing.JMenu helpMenu = new javax.swing.JMenu();
246 javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
248 mainPanel.setName("mainPanel"); // NOI18N
249 mainPanel.setLayout(new java.awt.BorderLayout());
251 org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(edu.mit.ezyang.gravity.GravitySimulatorApp.class).getContext().getResourceMap(GravitySimulatorView.class);
252 canvasPanel.setBackground(resourceMap.getColor("canvasPanel.background")); // NOI18N
253 canvasPanel.setName("canvasPanel"); // NOI18N
254 canvasPanel.setLayout(new java.awt.BorderLayout());
255 mainPanel.add(canvasPanel, java.awt.BorderLayout.CENTER);
257 console.setName("console"); // NOI18N
258 console.setLayout(new java.awt.BorderLayout());
260 commandLine.setText(resourceMap.getString("commandLine.text")); // NOI18N
261 commandLine.setName("commandLine"); // NOI18N
262 commandLine.addActionListener(new java.awt.event.ActionListener() {
263 public void actionPerformed(java.awt.event.ActionEvent evt) {
264 commandLineActionPerformed(evt);
267 console.add(commandLine, java.awt.BorderLayout.CENTER);
269 terminalPane.setName("terminalPane"); // NOI18N
271 terminal.setColumns(20);
272 terminal.setEditable(false);
273 terminal.setFont(resourceMap.getFont("terminal.font")); // NOI18N
274 terminal.setRows(5);
275 terminal.setName("terminal"); // NOI18N
276 terminalPane.setViewportView(terminal);
278 console.add(terminalPane, java.awt.BorderLayout.PAGE_START);
280 mainPanel.add(console, java.awt.BorderLayout.PAGE_END);
282 menuBar.setName("menuBar"); // NOI18N
284 fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
285 fileMenu.setName("fileMenu"); // NOI18N
287 javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(edu.mit.ezyang.gravity.GravitySimulatorApp.class).getContext().getActionMap(GravitySimulatorView.class, this);
288 exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
289 exitMenuItem.setName("exitMenuItem"); // NOI18N
290 fileMenu.add(exitMenuItem);
292 menuBar.add(fileMenu);
294 helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
295 helpMenu.setName("helpMenu"); // NOI18N
297 aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
298 aboutMenuItem.setName("aboutMenuItem"); // NOI18N
299 helpMenu.add(aboutMenuItem);
301 menuBar.add(helpMenu);
303 setComponent(mainPanel);
304 setMenuBar(menuBar);
305 }// </editor-fold>//GEN-END:initComponents
307 private void commandLineActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commandLineActionPerformed
308 processCommand(commandLine.getText());
309 commandLine.setText("");
310 }//GEN-LAST:event_commandLineActionPerformed
312 // Variables declaration - do not modify//GEN-BEGIN:variables
313 private javax.swing.JPanel canvasPanel;
314 private javax.swing.JTextField commandLine;
315 private javax.swing.JPanel console;
316 private javax.swing.JPanel mainPanel;
317 private javax.swing.JMenuBar menuBar;
318 private javax.swing.JTextArea terminal;
319 private javax.swing.JScrollPane terminalPane;
320 // End of variables declaration//GEN-END:variables
322 private JDialog aboutBox;