2 * GravitySimulatorView.java
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
.*;
22 * The application's main frame.
24 public class GravitySimulatorView
extends FrameView
{
27 * SimpleUniverse controlling everything
29 protected SimpleUniverse universe
;
32 * Root group node that new elements should be added to.
34 protected BranchGroup universeRoot
;
37 * 3D transform controlling viewpoint.
39 protected Transform3D viewTransform
;
41 protected TransformGroup viewTransformGroup
;
43 public GravitySimulatorView(SingleFrameApplication app
) {
47 JPopupMenu
.setDefaultLightWeightPopupEnabled(false);
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
) {
116 String
[] parts
= command
.split(" ");
117 if (parts
.length
== 0 || parts
[0].equals("") || parts
[0].equals("help")) {
118 send("Commands: add, view, clear");
121 if (parts
[0].equals("add")) {
122 if (parts
.length
== 1) {
123 send("Need object to add: sphere, cone, cube or cylinder");
126 BranchGroup group
= new BranchGroup();
127 group
.setCapability(BranchGroup
.ALLOW_DETACH
);
129 // initialize default "first class" parameters
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) {
140 for (int i
= 2; i
< parts
.length
; i
++) {
144 if (state
.equals("scale")) {
145 scale
= new Float(parts
[i
]);
146 } else if (state
.equals("at")) {
147 location
= vectorize(parts
[i
]);
149 params
.put(state
, parts
[i
]);
155 // generate the actual primitive
157 if (parts
[1].equals("sphere")) {
158 Sphere sphere
= new Sphere(scale
);
159 sphere
.getAppearance().getMaterial().setAmbientColor(.8f
,.2f
,.2f
);
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
);
168 send("Unknown primitive: " + parts
[1]);
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");
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)");
193 viewTransform
.setTranslation(vectorize("0,0," + parts
[1]));
194 viewTransformGroup
.setTransform(viewTransform
);
195 } else if (parts
[0].equals("clear")) {
196 universeRoot
.removeAllChildren();
198 send("Unknown command: " + parts
[0] + ", type help for options");
204 * Converts string in form x,y,z to Vector3f
205 * @param input vector in form x,y,z
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");
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
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
);
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
;