Java tutorial
/* * %Z%%M% %I% %E% %U% * * ************************************************************** "Copyright (c) * 2001 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY * OF SUCH DAMAGES. * * You acknowledge that Software is not designed,licensed or intended for use in * the design, construction, operation or maintenance of any nuclear facility." * * *************************************************************************** */ import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.NumberFormat; import javax.media.j3d.BackgroundSound; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.MediaContainer; import javax.media.j3d.PointSound; import javax.media.j3d.Sound; import javax.media.j3d.Switch; import javax.media.j3d.Transform3D; import javax.media.j3d.View; import javax.swing.ButtonGroup; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.vecmath.AxisAngle4f; import javax.vecmath.Color3f; import javax.vecmath.Point2f; import javax.vecmath.Point3d; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.vp.OrbitBehavior; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.universe.ViewingPlatform; public class SoundBug extends Applet implements ActionListener { // Scene graph items SimpleUniverse u; Switch spheresSwitch; Switch soundSwitch; // temp image grabber boolean isApplication; Canvas3D canvas; View view; // Sound items String soundNoneString = "No sound"; String soundBackgroundString = "Background"; String soundPointString = "Point"; String soundConeString = "Cone"; String soundBackgroundActionString = "SBackground"; String soundPointActionString = "SPoint"; JRadioButton soundNoneButton; JRadioButton soundBackgroundButton; JRadioButton soundPointButton; JRadioButton soundConeButton; BackgroundSound soundBackground; PointSound soundPoint; static final int SOUND_NONE = Switch.CHILD_NONE; static final int SOUND_BACKGROUND = 0; static final int SOUND_POINT = 1; // Temporaries that are reused Transform3D tmpTrans = new Transform3D(); Vector3f tmpVector = new Vector3f(); AxisAngle4f tmpAxisAngle = new AxisAngle4f(); // colors Color3f red = new Color3f(1.0f, 0.0f, 0.0f); Color3f black = new Color3f(0.0f, 0.0f, 0.0f); Color3f white = new Color3f(1.0f, 1.0f, 1.0f); Color3f grey = new Color3f(0.1f, 0.1f, 0.1f); Color3f skyBlue = new Color3f(0.6f, 0.7f, 0.9f); // geometric constant Point3f origin = new Point3f(); Vector3f yAxis = new Vector3f(0.0f, 1.0f, 0.0f); // NumberFormat to print out floats with only two digits NumberFormat nf; /* * Set up the sound switch. The child values are: SOUND_BACKGROUND: * BackgroundSound SOUND_POINT: PointSound */ void setupSounds() { soundSwitch = new Switch(Switch.CHILD_NONE); soundSwitch.setWhichChild(Switch.CHILD_NONE); soundSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE); // set up the BoundingSphere for all the sounds BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0); // Set up the sound media container java.net.URL soundURL = null; String soundFile = "techno_machine.au"; try { java.net.URL codeBase = null; try { codeBase = getCodeBase(); } catch (Exception ex) { // got an exception, probably running as an application, // keep code base null... } if (codeBase != null) { soundURL = new java.net.URL(codeBase.toString() + soundFile); } } catch (java.net.MalformedURLException ex) { System.out.println(ex.getMessage()); System.exit(1); } if (soundURL == null) { // application, try file URL try { soundURL = new java.net.URL("file:./" + soundFile); } catch (java.net.MalformedURLException ex) { System.out.println(ex.getMessage()); System.exit(1); } } System.out.println("soundURL = " + soundURL); MediaContainer soundMC = new MediaContainer(soundURL); // set up the Background Sound soundBackground = new BackgroundSound(); soundBackground.setCapability(Sound.ALLOW_ENABLE_WRITE); soundBackground.setSoundData(soundMC); soundBackground.setSchedulingBounds(bounds); soundBackground.setEnable(true); soundBackground.setLoop(Sound.INFINITE_LOOPS); soundSwitch.addChild(soundBackground); // set up the point sound soundPoint = new PointSound(); soundPoint.setCapability(Sound.ALLOW_ENABLE_WRITE); soundPoint.setSoundData(soundMC); soundPoint.setSchedulingBounds(bounds); soundPoint.setEnable(true); soundPoint.setLoop(Sound.INFINITE_LOOPS); soundPoint.setPosition(-5.0f, -5.0f, 0.0f); Point2f[] distGain = new Point2f[2]; // set the attenuation to linearly decrease volume from max at // source to 0 at a distance of 5m distGain[0] = new Point2f(0.0f, 1.0f); distGain[1] = new Point2f(5.0f, 0.0f); soundPoint.setDistanceGain(distGain); soundSwitch.addChild(soundPoint); } public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); Object source = e.getSource(); if (action == soundNoneString) { soundSwitch.setWhichChild(SOUND_NONE); } else if (action == soundBackgroundActionString) { soundSwitch.setWhichChild(SOUND_BACKGROUND); } else if (action == soundPointActionString) { soundSwitch.setWhichChild(SOUND_POINT); } } BranchGroup createSceneGraph() { // Create the root of the branch graph BranchGroup objRoot = new BranchGroup(); // Add the primitives to the scene setupSounds(); objRoot.addChild(soundSwitch); return objRoot; } public SoundBug(boolean isApplication) { this.isApplication = isApplication; } public SoundBug() { this(false); } public void init() { // set up a NumFormat object to print out float with only 3 fraction // digits nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(3); setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas = null; canvas = new Canvas3D(config); add("Center", canvas); // Create a simple scene and attach it to the virtual universe BranchGroup scene = createSceneGraph(); u = new SimpleUniverse(canvas); // set up sound u.getViewer().createAudioDevice(); // get the view view = u.getViewer().getView(); // Get the viewing platform ViewingPlatform viewingPlatform = u.getViewingPlatform(); // Move the viewing platform back to enclose the -4 -> 4 range double viewRadius = 4.0; // want to be able to see circle // of viewRadius size around origin // get the field of view double fov = u.getViewer().getView().getFieldOfView(); // calc view distance to make circle view in fov float viewDistance = (float) (viewRadius / Math.tan(fov / 2.0)); tmpVector.set(0.0f, 0.0f, viewDistance);// setup offset tmpTrans.set(tmpVector); // set trans to translate // move the view platform viewingPlatform.getViewPlatformTransform().setTransform(tmpTrans); // add an orbit behavior to move the viewing platform OrbitBehavior orbit = new OrbitBehavior(canvas, OrbitBehavior.STOP_ZOOM); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); orbit.setSchedulingBounds(bounds); viewingPlatform.setViewPlatformBehavior(orbit); u.addBranchGraph(scene); add("South", soundPanel()); } JPanel soundPanel() { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(4, 1)); // create the buttons soundNoneButton = new JRadioButton(soundNoneString); soundBackgroundButton = new JRadioButton(soundBackgroundString); soundPointButton = new JRadioButton(soundPointString); //soundConeButton = new JRadioButton(soundConeString); // set up the action commands soundNoneButton.setActionCommand(soundNoneString); soundBackgroundButton.setActionCommand(soundBackgroundActionString); soundPointButton.setActionCommand(soundPointActionString); //soundConeButton.setActionCommand(soundConeString); // add the buttons to a group so that only one can be selected ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(soundNoneButton); buttonGroup.add(soundBackgroundButton); buttonGroup.add(soundPointButton); //buttonGroup.add(soundConeButton); // register the applet as the listener for the buttons soundNoneButton.addActionListener(this); soundBackgroundButton.addActionListener(this); soundPointButton.addActionListener(this); // soundConeButton.addActionListener(this); // add the buttons to the panel panel.add(soundNoneButton); panel.add(soundBackgroundButton); panel.add(soundPointButton); //panel.add(soundConeButton); // set the default soundNoneButton.setSelected(true); return panel; } public void destroy() { u.removeAllLocales(); } // The following allows SoundBug to be run as an application // as well as an applet // public static void main(String[] args) { new MainFrame(new SoundBug(true), 600, 900); } }