From 7a2e20caac9db6f789a7b3fab344b9758af45335 Mon Sep 17 00:00:00 2001 From: Harvey Harrison Date: Sun, 19 Apr 2015 21:02:06 -0700 Subject: j3dcore: flatten the directory structure a bit Signed-off-by: Harvey Harrison --- src/javax/media/j3d/PointSound.java | 580 ++++++++++++++++++++++++++++++++++++ 1 file changed, 580 insertions(+) create mode 100644 src/javax/media/j3d/PointSound.java (limited to 'src/javax/media/j3d/PointSound.java') diff --git a/src/javax/media/j3d/PointSound.java b/src/javax/media/j3d/PointSound.java new file mode 100644 index 0000000..907bf5c --- /dev/null +++ b/src/javax/media/j3d/PointSound.java @@ -0,0 +1,580 @@ +/* + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package javax.media.j3d; + +import javax.vecmath.Point2f; +import javax.vecmath.Point3f; + + +/** + * The PointSound node (a sub-class of the Sound node) defines a spatially + * located sound source whose waves radiate uniformly in all directions from + * a given location in space. It has the same attributes as a Sound object + * with the addition of a location and the specification of distance-based + * gain attenuation for listener positions between an array of distances. + *

+ * A sound's amplitude is attenuated based on the distance between the listener + * and the sound source position. A piecewise linear curve (defined in terms of + * pairs of distance and gain scale factor) specifies the gain scale factor slope. + * + * The PointSound's location and attenuation distances are defined in the local + * coordinate system of the node. + *

+ * Distance Gain Attenuation + *

+ */ + +public class PointSound extends Sound { + // Constants + // + // These flags, when enabled using the setCapability method, allow an + // application to invoke methods that respectively read and write the position + // and the distance gain array. These capability flags are enforced only when + // the node is part of a live or compiled scene graph + + /** + * Specifies that this node allows access to its object's position + * information. + */ + public static final int + ALLOW_POSITION_READ = CapabilityBits.POINT_SOUND_ALLOW_POSITION_READ; + + /** + * Specifies that this node allows writing to its object's position + * information. + */ + public static final int + ALLOW_POSITION_WRITE = CapabilityBits.POINT_SOUND_ALLOW_POSITION_WRITE; + + /** + * Specifies that this node allows access to its object's distance + * gain attenuation information. + */ + public static final int + ALLOW_DISTANCE_GAIN_READ = CapabilityBits.POINT_SOUND_ALLOW_DISTANCE_GAIN_READ; + + /** + * Specifies that this node allows writing to its object's distance + * gain attenuation information. + */ + public static final int + ALLOW_DISTANCE_GAIN_WRITE = CapabilityBits.POINT_SOUND_ALLOW_DISTANCE_GAIN_WRITE; + + + // Array for setting default read capabilities + private static final int[] readCapabilities = { + ALLOW_POSITION_READ, + ALLOW_DISTANCE_GAIN_READ + }; + + /** + * Constructs and initializes a new PointSound node using default + * parameters. The following default values are used: + * + */ + public PointSound() { + // Uses default values defined for Sound and PointSound nodes + super(); + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + } + + /** + * Constructs a PointSound node object using only the provided parameter + * values for sound data, sample gain, and position. The remaining fields + * are set to the above default values. This form uses a point as input for + * its position. + * @param soundData sound data associated with this sound source node + * @param initialGain amplitude scale factor applied to sound source + * @param position 3D location of source + */ + public PointSound(MediaContainer soundData, + float initialGain, + Point3f position) { + super(soundData, initialGain); + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((PointSoundRetained)this.retained).setPosition(position); + } + + /** + * Constructs a PointSound node object using only the provided parameter + * values for sound data, sample gain, and position. The remaining fields + * are set to to the above default values. This form uses individual float + * parameters for the elements of the position point. + * @param soundData sound data associated with this sound source node + * @param initialGain amplitude scale factor applied to sound source data + * @param posX x coordinate of location of source + * @param posY y coordinate of location of source + * @param posZ z coordinate of location of source + */ + public PointSound(MediaContainer soundData, + float initialGain, + float posX, float posY, float posZ ) { + super(soundData, initialGain); + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((PointSoundRetained)this.retained).setPosition(posX,posY,posZ); + } + + // The next four constructors fill all this classes fields with the provided + // arguments values. + // See the header for the setDistanceGain method for details on how the + // those arrays are interpreted. + + /** + * Construct a PointSound object accepting Point3f as input for the position + * and accepting an array of Point2f for the distance attenuation values + * where each pair in the array contains a distance and a gain scale factor. + * @param soundData sound data associated with this sound source node + * @param initialGain amplitude scale factor applied to sound source + * @param loopCount number of times loop is looped + * @param release flag denoting playing sound data to end + * @param continuous denotes that sound silently plays when disabled + * @param enable sound switched on/off + * @param region scheduling bounds + * @param priority playback ranking value + * @param position 3D location of source + * @param distanceGain array of (distance,gain) pairs controling attenuation + */ + public PointSound(MediaContainer soundData, + float initialGain, + int loopCount, + boolean release, + boolean continuous, + boolean enable, + Bounds region, + float priority, + Point3f position, + Point2f[] distanceGain) { + + super(soundData, initialGain, loopCount, release, continuous, + enable, region, priority ); + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((PointSoundRetained)this.retained).setPosition(position); + ((PointSoundRetained)this.retained).setDistanceGain(distanceGain); + } + + /** + * Construct a PointSound object accepting individual float parameters for + * the elements of the position point, and accepting an array of Point2f for + * the distance attenuation values where each pair in the array contains a + * distance and a gain scale factor. + * @param soundData sound data associated with this sound source node + * @param initialGain amplitude scale factor applied to sound source + * @param loopCount number of times loop is looped + * @param release flag denoting playing sound to end + * @param continuous denotes that sound silently plays when disabled + * @param enable sound switched on/off + * @param region scheduling bounds + * @param priority playback ranking value + * @param posX x coordinate of location of source + * @param posY y coordinate of location of source + * @param posZ z coordinate of location of source + * @param distanceGain array of (distance,gain) pairs controling attenuation + */ + public PointSound(MediaContainer soundData, + float initialGain, + int loopCount, + boolean release, + boolean continuous, + boolean enable, + Bounds region, + float priority, + float posX, float posY, float posZ, + Point2f[] distanceGain) { + + super(soundData, initialGain, loopCount, release, + continuous, enable, region, priority ); + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((PointSoundRetained)this.retained).setPosition(posX,posY,posZ); + ((PointSoundRetained)this.retained).setDistanceGain(distanceGain); + } + + /** + * Construct a PointSound object accepting points as input for the position. + * and accepting separate arrays for the distance and gain scale factors + * components of distance attenuation. + * @param soundData sound data associated with this sound source node + * @param initialGain amplitude scale factor applied to sound source + * @param loopCount number of times loop is looped + * @param release flag denoting playing sound data to end + * @param continuous denotes that sound silently plays when disabled + * @param enable sound switched on/off + * @param region scheduling bounds + * @param priority playback ranking value + * @param position 3D location of source + * @param attenuationDistance array of distance values used for attenuation + * @param attenuationGain array of gain scale factors used for attenuation + */ + public PointSound(MediaContainer soundData, + float initialGain, + int loopCount, + boolean release, + boolean continuous, + boolean enable, + Bounds region, + float priority, + Point3f position, + float[] attenuationDistance, + float[] attenuationGain) { + + super(soundData, initialGain, loopCount, release, continuous, + enable, region, priority ); + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((PointSoundRetained)this.retained).setPosition(position); + ((PointSoundRetained)this.retained).setDistanceGain( + attenuationDistance, attenuationGain); + } + + /** + * Construct a PointSound object accepting individual float parameters for + * the elements of the position points, and accepting separate arrays for + * the distance and gain scale factors components of distance attenuation. + * @param soundData sound data associated with this sound source node + * @param initialGain amplitude scale factor applied to sound source + * @param loopCount number of times loop is looped + * @param release flag denoting playing sound to end + * @param continuous denotes that sound silently plays when disabled + * @param enable sound switched on/off + * @param region scheduling bounds + * @param priority playback ranking value + * @param posX x coordinate of location of source + * @param posY y coordinate of location of source + * @param posZ z coordinate of location of source + * @param attenuationDistance array of distance values used for attenuation + * @param attenuationGain array of gain scale factors used for attenuation + */ + public PointSound(MediaContainer soundData, + float initialGain, + int loopCount, + boolean release, + boolean continuous, + boolean enable, + Bounds region, + float priority, + float posX, float posY, float posZ, + float[] attenuationDistance, + float[] attenuationGain) { + + super(soundData, initialGain, loopCount, release, + continuous, enable, region, priority ); + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((PointSoundRetained)this.retained).setPosition(posX,posY,posZ); + ((PointSoundRetained)this.retained).setDistanceGain( + attenuationDistance, attenuationGain); + } + + /** + * Creates the retained mode PointSoundRetained object that this + * PointSound object will point to. + */ + @Override + void createRetained() { + this.retained = new PointSoundRetained(); + this.retained.setSource(this); + } + + /** + * Sets this sound's location from the vector provided. + * @param position the new location + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setPosition(Point3f position) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_POSITION_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound0")); + + ((PointSoundRetained)this.retained).setPosition(position); + } + + /** + * Sets this sound's position from the three values provided. + * @param x the new x position + * @param y the new y position + * @param z the new z position + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setPosition(float x, float y, float z) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_POSITION_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound0")); + + ((PointSoundRetained)this.retained).setPosition(x,y,z); + } + + /** + * Retrieves this sound's direction and places it in the + * vector provided. + * @param position the variable to receive the direction vector + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void getPosition(Point3f position) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_POSITION_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound2")); + + ((PointSoundRetained)this.retained).getPosition(position); + } + + /** + * Sets this sound's distance gain attenuation - where gain scale factor + * is applied to sound based on distance listener is from sound source. + * This form of setDistanceGain takes these pairs of values as an array of + * Point2f. + * @param attenuation defined by pairs of (distance,gain-scale-factor) + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setDistanceGain(Point2f[] attenuation) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DISTANCE_GAIN_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound3")); + + ((PointSoundRetained)this.retained).setDistanceGain(attenuation); + } + + /** + * Sets this sound's distance gain attenuation as an array of Point2fs. + * This form of setDistanceGain accepts two separate arrays for these values. + * The distance and gainScale arrays should be of the same length. If the + * gainScale array length is greater than the distance array length, the + * gainScale array elements beyond the length of the distance array are + * ignored. If the gainScale array is shorter than the distance array, the + * last gainScale array value is repeated to fill an array of length equal + * to distance array. + * @param distance array of monotonically-increasing floats + * @param gain array of non-negative scale factors + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setDistanceGain(float[] distance, float[] gain) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DISTANCE_GAIN_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound3")); + + ((PointSoundRetained)this.retained).setDistanceGain(distance, gain); + } + + /** + * Get the length of this node's distance gain attenuation arrays. + * @return distance gain attenuation array length + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public int getDistanceGainLength() { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DISTANCE_GAIN_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound4")); + + return (((PointSoundRetained)this.retained).getDistanceGainLength()); + } + + /** + * Gets this sound's distance attenuation. The distance attenuation + * pairs are copied into the specified array. + * The array must be large enough to hold all of the points. + * The individual array elements must be allocated by the caller. + * @param attenuation arrays containing distance attenuation pairs + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void getDistanceGain(Point2f[] attenuation) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DISTANCE_GAIN_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound4")); + + ((PointSoundRetained)this.retained).getDistanceGain(attenuation); + } + + /** + * Gets this sound's distance gain attenuation values in separate arrays. + * The arrays must be large enough to hold all of the values. + * @param distance array of float distance from sound source + * @param gain array of non-negative scale factors associated with + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void getDistanceGain(float[] distance, float[] gain) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DISTANCE_GAIN_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("PointSound4")); + + ((PointSoundRetained)this.retained).getDistanceGain(distance,gain); + } + + /** + * Creates a new instance of the node. This routine is called + * by cloneTree to duplicate the current node. + * @param forceDuplicate when set to true, causes the + * duplicateOnCloneTree flag to be ignored. When + * false, the value of each node's + * duplicateOnCloneTree variable determines whether + * NodeComponent data is duplicated or copied. + * + * @see Node#cloneTree + * @see Node#cloneNode + * @see Node#duplicateNode + * @see NodeComponent#setDuplicateOnCloneTree + */ + @Override + public Node cloneNode(boolean forceDuplicate) { + PointSound p = new PointSound(); + p.duplicateNode(this, forceDuplicate); + return p; + } + + /** + * Copies all node information from originalNode into + * the current node. This method is called from the + * cloneNode method which is, in turn, called by the + * cloneTree method. + *

+ * For any NodeComponent objects + * contained by the object being duplicated, each NodeComponent + * object's duplicateOnCloneTree value is used to determine + * whether the NodeComponent should be duplicated in the new node + * or if just a reference to the current node should be placed in the + * new node. This flag can be overridden by setting the + * forceDuplicate parameter in the cloneTree + * method to true. + *
+ * NOTE: Applications should not call this method directly. + * It should only be called by the cloneNode method. + * + * @param originalNode the original node to duplicate. + * @param forceDuplicate when set to true, causes the + * duplicateOnCloneTree flag to be ignored. When + * false, the value of each node's + * duplicateOnCloneTree variable determines whether + * NodeComponent data is duplicated or copied. + * @exception ClassCastException if originalNode is not an instance of + * PointSound + * + * @see Node#cloneTree + * @see Node#cloneNode + * @see NodeComponent#setDuplicateOnCloneTree + */ + @Override + public void duplicateNode(Node originalNode, boolean forceDuplicate) { + checkDuplicateNode(originalNode, forceDuplicate); + } + + + /** + * Copies all PointSound information from + * originalNode into + * the current node. This method is called from the + * cloneNode method which is, in turn, called by the + * cloneTree method.

+ * + * @param originalNode the original node to duplicate. + * @param forceDuplicate when set to true, causes the + * duplicateOnCloneTree flag to be ignored. When + * false, the value of each node's + * duplicateOnCloneTree variable determines whether + * NodeComponent data is duplicated or copied. + * + * @exception RestrictedAccessException if this object is part of a live + * or compiled scenegraph. + * + * @see Node#duplicateNode + * @see Node#cloneTree + * @see NodeComponent#setDuplicateOnCloneTree + */ + @Override + void duplicateAttributes(Node originalNode, boolean forceDuplicate) { + super.duplicateAttributes(originalNode, forceDuplicate); + + PointSoundRetained orgRetained = (PointSoundRetained)originalNode.retained; + PointSoundRetained thisRetained = (PointSoundRetained)this.retained; + + Point3f p = new Point3f(); + orgRetained.getPosition(p); + thisRetained.setPosition(p); + + int len = orgRetained.getDistanceGainLength(); + float distance[] = new float[len]; + float gain[] = new float[len]; + orgRetained.getDistanceGain(distance, gain); + thisRetained.setDistanceGain(distance, gain); + } + +} -- cgit v1.2.3