/* * 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; import javax.vecmath.Vector3f; /** * The ConeSound node object defines a PointSound node whose sound source is * directed along a specific vector in space. A ConeSound source is attenuated * by gain scale factors and filters based on the angle between the vector from * the source to the listener, and the ConeSound's direction vector. This * attenuation is either a single spherical distance gain attenuation (as for * a general PointSound source) or dual front and back distance gain * attenuations defining elliptical attenuation areas. The angular filter and the * active AuralAttribute component filter define what filtering is applied to * the sound source. (See AuralAtttribute class for more details on filtering.) * This node has the same attributes as a PointSound node with the addition of a * direction vector and an array of points each containing: angular distance (in * radians), gain scale factor, and filter (which for now consists of a lowpass * filter cutoff frequency). Similar to the definition of the back distance gain * array for PointSounds, a piece-wise linear curve (defined in terms of * radians from the axis) specifies the slope of these additional attenuation * values. *
* Distance Gain attuation *
* Use PointSound setDistanceGain() method to set the front distance * attenuation array separate from the back distance attenuation array. * A front distance attenuation array defines monotonically-increasing * distances from the sound source origin along the position direction * vector. A back distance attenuation array (if given) defines * monotonically-increasing distances from the sound source origin along the * negative direction vector. The two arrays must be of the same length. * The backDistance[i] gain values must be less than or equal to * the frontDistance[i] gain values. *
* Gain scale factors are associated with distances from the listener to * the sound source via an array of (distance, gain-scale-factor) pairs. * The gain scale factor applied to the sound source is the linear * interpolated gain value between the distance value range that includes * the current distance from the listener to the sound source. *
* The getDistanceGainLength method defined for PointSound returns the length * of the all distance gain attenuation arrays, including the back distance * gain arrays. Arrays passed into getDistanceGain methods should all * be at least this size. *
* Direction Methods *
* Angular Attenuation *
* This attenuation is defined * as a triple of (angular distance, gain-scale-factor, filter). The * distance is measured as the angle in radians between the ConeSound's * direction vector and the vector from the sound source position to the * listener. Both the gain scale factor and filter applied to the sound * source is the linear interpolation of values between the distance value * range that includes the angular distance from the sound source axis. *
* If this is not set, no angular gain attenuation or filtering is performed * (equivalent to using an angular gain scale factor of 1.0 and an angular * filter of Sound.NO_FILTER for all distances). *
* If angular distance from the listener-sound-position vector and a sound's * direction vector is less than the first distance in the array, only the first * gain scale factor and first filter are applied to the sound source. * This creates a conical region around the listener within which the sound * is uniformly attenuated by first gain and first filter in the array. *
* If the distance from the listener-sound-position vector and the sound's * direction vector is greater than the last distance in the array, the last gain * scale factor and last filter are applied to the sound source. *
* Distance elements in this array of points is a monotonically-increasing * set of floating point numbers measured from 0 to p radians. Gain scale * factors elements in this list of points can be any positive floating * point numbers. While for most applications this list of gain scale * factors will usually be monotonically-decreasing, they do not have to be. * The filter (for now) is a single simple frequency cutoff value. *
* The getAngularAttenuationArrayLength method returns the length of the angular * attenuation arrays. Arrays passed into getAngularAttenuation methods * should all be at least this size. *
* Unlike the single distance gain attenuation array for PointSounds which * define spherical areas about the sound source between which gains are * linearly interpolated, this directed ConeSound can have two distance gain * attenuation arrays that define ellipsoidal attenuation areas. See the * setDistanceGain PointSound method for details on how the separate distance * and distanceGain arrays are interpreted. *
* The ConeSound's direction vector and angular measurements are defined in
* the local coordinate system of the node.
* @param soundData sound source data associated with this node
* @param initialGain amplitude scale factor applied to sound
* @param loopCount number of times sound 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 position 3D location of source
* @param frontDistanceAttenuation array of (distance,gain) pairs controlling
* attenuation values along the positive direction axis
* @param backDistanceAttenuation array of (distance,gain) pairs controlling
* attenuation values along the negative direction axis
* @param direction vector defining cones' axii
*/
public ConeSound(MediaContainer soundData,
float initialGain,
int loopCount,
boolean release,
boolean continuous,
boolean enable,
Bounds region,
float priority,
Point3f position,
Point2f[] frontDistanceAttenuation,
Point2f[] backDistanceAttenuation,
Vector3f direction) {
super(soundData, initialGain, loopCount, release, continuous, enable,
region, priority, position, frontDistanceAttenuation );
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
((ConeSoundRetained)this.retained).setBackDistanceGain(
backDistanceAttenuation);
((ConeSoundRetained)this.retained).setDirection(direction);
}
/**
* Constructs a ConeSound node object using the provided parameter values.
* This form uses individual float parameters for the elements of the
* position, direction, and two distance attenuation arrays.
* Unlike the single distance gain attenuation array for PointSounds, which
* define spherical areas about the sound source between which gains are
* linearly interpolated, this directed ConeSound can have two distance
* gain attenuation arrays that define ellipsoidal attenuation areas.
* See the setDistanceGain PointSound method for details on how the
* separate distance and distanceGain arrays are interpreted.
* The ConeSound's direction vector and angular measurements are defined
* in the local coordinate system of the node.
* @param soundData sound source data associated with this node
* @param initialGain amplitude scale factor applied to sound
* @param loopCount number of times sound 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 frontDistance array of front distance values used for attenuation
* @param frontDistanceGain array of front gain scale factors used for attenuation
* @param backDistance array of back distance values used for attenuation
* @param backDistanceGain array of back gain scale factors used for attenuation
* @param dirX x coordinate cones' axii vector
* @param dirY y coordinate cones' axii vector
* @param dirZ z coordinate cones' axii vector
*/
public ConeSound(MediaContainer soundData,
float initialGain,
int loopCount,
boolean release,
boolean continuous,
boolean enable,
Bounds region,
float priority,
float posX, float posY, float posZ,
float[] frontDistance,
float[] frontDistanceGain,
float[] backDistance,
float[] backDistanceGain,
float dirX, float dirY, float dirZ ) {
super(soundData, initialGain, loopCount, release, continuous, enable,
region, priority, posX, posY, posZ,
frontDistance, frontDistanceGain );
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
((ConeSoundRetained)this.retained).setDirection(dirX, dirY, dirZ);
((ConeSoundRetained)this.retained).setBackDistanceGain(
backDistance, backDistanceGain );
}
/**
* Constructs a ConeSound node object using all the provided PointSound
* parameter values, which include a single spherical distance attenuation
* array, but includes an angular attenuation array.
* This form uses points and vectors as input for its position, direction,
* single spherical distanceAttenuation array, and angularAttenuation array.
* It also accepts arrays of points for the distance attenuation and angular
* values. Each Point2f in the distanceAttenuation array contains a distance
* and a gain scale factor. Each Point3f in the angularAttenuation array
* contains an angular distance, a gain scale factor, and a filtering value
* (which is currently defined as a simple cutoff frequency).
* @param soundData sound source data associated with this node
* @param initialGain amplitude scale factor applied to sound
* @param loopCount number of times sound 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 position 3D location of source
* @param distanceAttenuation array of (distance,gain) pairs controlling
* attenuation values along the positive direction axis
* @param direction vector defining cones' axii
* @param angularAttenuation array of tuples defining angular gain/filtering
*/
public ConeSound(MediaContainer soundData,
float initialGain,
int loopCount,
boolean release,
boolean continuous,
boolean enable,
Bounds region,
float priority,
Point3f position,
Point2f[] distanceAttenuation,
Vector3f direction,
Point3f[] angularAttenuation ) {
super(soundData, initialGain, loopCount, release, continuous, enable,
region, priority, position, distanceAttenuation );
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
((ConeSoundRetained)this.retained).setDirection(direction);
((ConeSoundRetained)this.retained).setAngularAttenuation(
angularAttenuation);
}
/**
* Constructs a ConeSound node object using all the provided PointSound
* parameter values, which include a single spherical distance attenuation
* array, but includes an angular attenuation array.
* This form uses individual float parameters for elements of position,
* direction, distanceAttenuation array, and angularAttenuation array.
* It also accepts separate arrays for the distance and gain scale factors
* components of distance attenuation, and separate arrays for the angular
* distance, angular gain, and filtering components of angular attenuation.
* See the setDistanceGain ConeSound method for details on how the separate
* distance and distanceGain arrays are interpreted. See the
* setAngularAttenuation ConeSound method for details on how the separate
* angularDistance, angularGain, and filter arrays are interpreted.
* @param soundData sound source data associated with this node
* @param initialGain amplitude scale factor applied to sound
* @param loopCount number of times sound 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 distance array of front distance values used for attenuation
* @param distanceGain array of front gain scale factors used for attenuation
* @param dirX x coordinate cones' axii vector
* @param dirY y coordinate cones' axii vector
* @param dirZ z coordinate cones' axii vector
* @param angle array of angle radians for angularAttenuation
* @param angularGain array of gain scale factors for angularAttenuation
* @param frequencyCutoff array of lowpass filter values in Hertz
*/
public ConeSound(MediaContainer soundData,
float initialGain,
int loopCount,
boolean release,
boolean continuous,
boolean enable,
Bounds region,
float priority,
float posX, float posY, float posZ,
float[] distance,
float[] distanceGain,
float dirX, float dirY, float dirZ,
float[] angle,
float[] angularGain,
float[] frequencyCutoff) {
super(soundData, initialGain, loopCount, release, continuous, enable,
region, priority, posX, posY, posZ,
distance, distanceGain );
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
((ConeSoundRetained)this.retained).setDirection(dirX, dirY, dirZ);
((ConeSoundRetained)this.retained).setAngularAttenuation(angle,
angularGain, frequencyCutoff);
}
/**
* Constructs and initializes a new Cone Sound node explicitly setting all
* PointSound and ConeSound fields as arguments: the PointSound position,
* front and back distance attenuation Point2f array, and ConeSound
* direction vector and Point3f angular attenuation.
* @param soundData sound source data associated with this node
* @param initialGain amplitude scale factor applied to sound
* @param loopCount number of times sound 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 position 3D location of source
* @param frontDistanceAttenuation array of (distance,gain) pairs controlling
* attenuation values along the positive direction axis
* @param backDistanceAttenuation array of (distance,gain) pairs controlling
* attenuation values along the negative direction axis
* @param direction vector defining cones' axii
* @param angularAttenuation array of tuples defining angular gain/filtering
*/
public ConeSound(MediaContainer soundData,
float initialGain,
int loopCount,
boolean release,
boolean continuous,
boolean enable,
Bounds region,
float priority,
Point3f position,
Point2f[] frontDistanceAttenuation,
Point2f[] backDistanceAttenuation,
Vector3f direction,
Point3f[] angularAttenuation ) {
super(soundData, initialGain, loopCount, release, continuous, enable,
region, priority, position, frontDistanceAttenuation );
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
((ConeSoundRetained)this.retained).setBackDistanceGain(
backDistanceAttenuation);
((ConeSoundRetained)this.retained).setDirection(direction);
((ConeSoundRetained)this.retained).setAngularAttenuation(
angularAttenuation);
}
/**
* Constructs and initializes a new Cone Sound node explicitly setting all
* PointSound and ConeSound fields as arguments but all the vector and point
* arguments are broken into individual float array components.
* @param soundData sound source data associated with this node
* @param initialGain amplitude scale factor applied to sound
* @param loopCount number of times sound 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 frontDistance array of front distance values used for attenuation
* @param frontDistanceGain array of front gain scale factors used for attenuation
* @param backDistance array of back distance values used for attenuation
* @param backDistanceGain array of back gain scale factors used for attenuation
* @param dirX x coordinate cones' axii vector
* @param dirY y coordinate cones' axii vector
* @param dirZ z coordinate cones' axii vector
* @param angle array of angle radians for angularAttenuation
* @param angularGain array of gain scale factors for angularAttenuation
* @param frequencyCutoff array of lowpass filter values in Hertz
*/
public ConeSound(MediaContainer soundData,
float initialGain,
int loopCount,
boolean release,
boolean continuous,
boolean enable,
Bounds region,
float priority,
float posX, float posY, float posZ,
float[] frontDistance,
float[] frontDistanceGain,
float[] backDistance,
float[] backDistanceGain,
float dirX, float dirY, float dirZ,
float[] angle,
float[] angularGain,
float[] frequencyCutoff) {
super(soundData, initialGain, loopCount, release, continuous, enable,
region, priority, posX, posY, posZ,
frontDistance, frontDistanceGain );
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
((ConeSoundRetained)this.retained).setBackDistanceGain(
backDistance, backDistanceGain );
((ConeSoundRetained)this.retained).setDirection(dirX, dirY, dirZ);
((ConeSoundRetained)this.retained).setAngularAttenuation(angle,
angularGain, frequencyCutoff);
}
/**
* Creates the retained mode ConeSoundRetained object that this
* ConeSound object will point to.
*/
@Override
void createRetained() {
this.retained = new ConeSoundRetained();
this.retained.setSource(this);
}
//
// OVERLOADED Sound methods
//
/**
* Sets this sound's distance gain elliptical attenuation -
* where gain scale factor is applied to sound based on distance listener
* is from sound source.
* @param frontAttenuation defined by pairs of (distance,gain-scale-factor)
* @param backAttenuation 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[] frontAttenuation,
Point2f[] backAttenuation ) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DISTANCE_GAIN_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound0"));
((ConeSoundRetained)this.retained).setDistanceGain(frontAttenuation,
backAttenuation);
}
/**
* Sets this sound's distance gain attenuation as an array of Point2fs.
* @param frontDistance array of monotonically-increasing floats
* @param frontGain array of non-negative scale factors
* @param backDistance array of monotonically-increasing floats
* @param backGain 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[] frontDistance, float[] frontGain,
float[] backDistance, float[] backGain) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DISTANCE_GAIN_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound0"));
((ConeSoundRetained)this.retained).setDistanceGain(
frontDistance, frontGain, backDistance, backGain);
}
/**
* Sets this sound's back distance gain attenuation - where gain scale
* factor is applied to sound based on distance listener along the negative
* sound direction axis from sound source.
* @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 setBackDistanceGain(Point2f[] attenuation) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DISTANCE_GAIN_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound0"));
((ConeSoundRetained)this.retained).setBackDistanceGain(attenuation);
}
/**
* Sets this sound's back distance gain attenuation as separate arrays.
* @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 setBackDistanceGain(float[] distance, float[] gain) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DISTANCE_GAIN_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound0"));
((ConeSoundRetained)this.retained).setBackDistanceGain(distance, gain);
}
/**
* Gets this sound's elliptical distance attenuation. The
* attenuation values are copied into the specified arrays.
* The arrays must be large enough to hold all of the
* forward distances and backward distances attenuation values.
* The individual array elements must be allocated by the
* caller. The Point2f x,y values are defined as follows:
* x is the distance, y is the gain.
* @param frontAttenuation arrays containing forward distances
* attenuation pairs
* @param backAttenuation arrays containing backward distances
* 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[] frontAttenuation,
Point2f[] backAttenuation) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DISTANCE_GAIN_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound2"));
((ConeSoundRetained)this.retained).getDistanceGain(
frontAttenuation, backAttenuation);
}
/**
* Gets this sound's elliptical distance gain attenuation values in
* separate arrays. The arrays must be large enough to hold all
* of the values.
* @param frontDistance array of float distances along the sound axis
* @param frontGain array of non-negative scale factors associated with
* front distances
* @param backDistance array of float negative distances along the sound
* axis
* @param backGain array of non-negative scale factors associated with
* back distances
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void getDistanceGain(float[] frontDistance, float[] frontGain,
float[] backDistance, float[] backGain) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DISTANCE_GAIN_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound10"));
((ConeSoundRetained)this.retained).getDistanceGain(
frontDistance, frontGain, backDistance, backGain);
}
/**
* Sets this sound's direction from the vector provided.
* @param direction the new direction
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setDirection(Vector3f direction) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DIRECTION_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound3"));
((ConeSoundRetained)this.retained).setDirection(direction);
}
/**
* Sets this sound's direction from the three values provided.
* @param x the new x direction
* @param y the new y direction
* @param z the new z direction
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setDirection(float x, float y, float z) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DIRECTION_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound3"));
((ConeSoundRetained)this.retained).setDirection(x,y,z);
}
/**
* Retrieves this sound's direction and places it in the
* vector provided.
* @param direction axis of cones; 'direction' of sound
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void getDirection(Vector3f direction) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_DIRECTION_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound5"));
((ConeSoundRetained)this.retained).getDirection(direction);
}
/**
* Sets this sound's angular gain attenuation (not including filter).
* In this form of setAngularAttenuation, only the angular distances
* and angular gain scale factors pairs are given. The filter values for
* these tuples are implicitly set to Sound.NO_FILTER.
* @param attenuation array containing angular distance and gain
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setAngularAttenuation(Point2f[] attenuation) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_ANGULAR_ATTENUATION_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound6"));
((ConeSoundRetained)this.retained).setAngularAttenuation(attenuation);
}
/**
* In the second form of setAngularAttenuation, an array of all three values
* is supplied.
* @param attenuation array containing angular distance, gain, and filter
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setAngularAttenuation(Point3f[] attenuation) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_ANGULAR_ATTENUATION_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound6"));
((ConeSoundRetained)this.retained).setAngularAttenuation(attenuation);
}
/**
* Sets angular attenuation including gain and filter using separate arrays.
* The third form of setAngularAttenuation accepts three separate arrays for
* these angular attenuation values. These arrays should be of the same
* length. If the angularGain or filtering array length is greater than
* angularDistance array length, the array elements beyond the length of
* the angularDistance array are ignored. If the angularGain or filtering
* array is shorter than the angularDistance array, the last value of the
* short array is repeated to fill an array of length equal to
* angularDistance array.
* @param distance array containing angular distance
* @param gain array containing angular gain attenuation
* @param filter array containing angular low-pass frequency cutoff values
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setAngularAttenuation(float[] distance, float[] gain,
float[] filter) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_ANGULAR_ATTENUATION_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound6"));
((ConeSoundRetained)this.retained).setAngularAttenuation(distance,
gain, filter);
}
/**
* Retrieves angular attenuation array length.
* All arrays are forced to same size.
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public int getAngularAttenuationLength() {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_ANGULAR_ATTENUATION_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound9"));
return (((ConeSoundRetained)this.retained).getAngularAttenuationLength());
}
/**
* Copies the array of attenuation values from this sound, including
* gain and filter, 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. The Point3f x,y,z values
* are defined as follows: x is the angular distance, y is
* the angular gain attenuation, and z is the frequency
* cutoff.
* @param attenuation the array to receive the attenuation values
* applied to gain when listener is between cones
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void getAngularAttenuation(Point3f[] attenuation) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_ANGULAR_ATTENUATION_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound9"));
((ConeSoundRetained)this.retained).getAngularAttenuation(attenuation);
}
/**
* Copies the array of attenuation values from this sound,
* including gain and filter, into the separate arrays.
* The arrays must be large enough to hold all of the values.
* @param distance array containing angular distance
* @param gain array containing angular gain attenuation
* @param filter array containing angular low-pass frequency cutoff values
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void getAngularAttenuation(float[] distance, float[] gain,
float[] filter) {
if (isLiveOrCompiled())
if(!this.getCapability(ALLOW_ANGULAR_ATTENUATION_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ConeSound9"));
((ConeSoundRetained)this.retained).getAngularAttenuation(distance,
gain, filter);
}
/**
* 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) {
ConeSound c = new ConeSound();
c.duplicateNode(this, forceDuplicate);
return c;
}
/**
* 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
* ConeSound
*
* @see Node#cloneTree
* @see Node#cloneNode
* @see NodeComponent#setDuplicateOnCloneTree
*/
@Override
public void duplicateNode(Node originalNode, boolean forceDuplicate) {
checkDuplicateNode(originalNode, forceDuplicate);
}
/**
* Copies all ConeSound 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);
ConeSoundRetained orgRetained = (ConeSoundRetained)originalNode.retained;
ConeSoundRetained thisRetained = (ConeSoundRetained)this.retained;
// front distance gain & attenuation is set in super
// set back distance gain only
int len = orgRetained.getDistanceGainLength();
float distance[] = new float[len];
float gain[] = new float[len];
orgRetained.getDistanceGain(null, null,distance, gain);
thisRetained.setBackDistanceGain(distance, gain);
Vector3f v = new Vector3f();
orgRetained.getDirection(v);
thisRetained.setDirection(v);
len = orgRetained.getAngularAttenuationLength();
distance = gain = null;
float angle[] = new float[len];
float angularGain[] = new float[len];
float frequencyCutoff[] = new float[len];
orgRetained.getAngularAttenuation(angle, angularGain,
frequencyCutoff);
thisRetained.setAngularAttenuation(angle, angularGain, frequencyCutoff);
}
}