<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F3D%2FUtilities</id>
		<title>Java/3D/Utilities - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F3D%2FUtilities"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/Utilities&amp;action=history"/>
		<updated>2026-04-21T16:07:42Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/3D/Utilities&amp;diff=6475&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/Utilities&amp;diff=6475&amp;oldid=prev"/>
				<updated>2010-06-01T06:15:07Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:15, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/3D/Utilities&amp;diff=6474&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/Utilities&amp;diff=6474&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 3D Math utilities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * $RCSfile: Math3D.java,v $&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 * - Redistribution of source code must retain the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 * - Redistribution in binary form must reproduce the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer in&lt;br /&gt;
 *   the documentation and/or other materials provided with the&lt;br /&gt;
 *   distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * Neither the name of Sun Microsystems, Inc. or the names of&lt;br /&gt;
 * contributors may be used to endorse or promote products derived&lt;br /&gt;
 * from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any&lt;br /&gt;
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND&lt;br /&gt;
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY&lt;br /&gt;
 * EXCLUDED. SUN MICROSYSTEMS, INC. (&amp;quot;SUN&amp;quot;) AND ITS LICENSORS SHALL&lt;br /&gt;
 * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF&lt;br /&gt;
 * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS&lt;br /&gt;
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR&lt;br /&gt;
 * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,&lt;br /&gt;
 * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND&lt;br /&gt;
 * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR&lt;br /&gt;
 * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
 *&lt;br /&gt;
 * You acknowledge that this software is not designed, licensed or&lt;br /&gt;
 * intended for use in the design, construction, operation or&lt;br /&gt;
 * maintenance of any nuclear facility.&lt;br /&gt;
 *&lt;br /&gt;
 * $Revision: 1.6 $&lt;br /&gt;
 * $Date: 2007/08/28 16:42:24 $&lt;br /&gt;
 * $State: Exp $&lt;br /&gt;
 */&lt;br /&gt;
import javax.vecmath.Point3f;&lt;br /&gt;
import javax.vecmath.Vector3f;&lt;br /&gt;
import javax.vecmath.Vector3d;&lt;br /&gt;
import javax.vecmath.Tuple3f;&lt;br /&gt;
import javax.vecmath.Matrix3d;&lt;br /&gt;
import javax.vecmath.Point3d;&lt;br /&gt;
import javax.vecmath.Vector3d;&lt;br /&gt;
import javax.media.j3d.BoundingBox;&lt;br /&gt;
import javax.media.j3d.BoundingSphere;&lt;br /&gt;
import javax.media.j3d.Bounds;&lt;br /&gt;
/**&lt;br /&gt;
 * 3D Math utilities&lt;br /&gt;
 *&lt;br /&gt;
 * @author Paul&lt;br /&gt;
 */;&lt;br /&gt;
public class Math3D {&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Calculates the distance of a point from a line.&lt;br /&gt;
     * &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
     *    x1----------------------------x2 &amp;lt;br&amp;gt;&lt;br /&gt;
     *                  |               &amp;lt;br&amp;gt;&lt;br /&gt;
     *                  | distance      &amp;lt;br&amp;gt;&lt;br /&gt;
     *                  |               &amp;lt;br&amp;gt;&lt;br /&gt;
     *                 point            &amp;lt;br&amp;gt;&lt;br /&gt;
     * &amp;lt;/code&amp;gt;&lt;br /&gt;
     * &amp;lt;p&amp;gt;&lt;br /&gt;
     * The formula is &amp;lt;br&amp;gt;&lt;br /&gt;
     * &amp;lt;code&amp;gt;&lt;br /&gt;
     *      d = |(x2-x1) x (x1-p)| &amp;lt;br&amp;gt;&lt;br /&gt;
     *          ------------------ &amp;lt;br&amp;gt;&lt;br /&gt;
     *              |x2-x1|        &amp;lt;br&amp;gt;&lt;br /&gt;
     * &amp;lt;/code&amp;gt;&lt;br /&gt;
     *&lt;br /&gt;
     * Where p=point, lineStart=x1, lineEnd=x2&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public static float pointLineDistance( final Point3f lineStart, &lt;br /&gt;
                                           final Point3f lineEnd, &lt;br /&gt;
                                           final Point3f point ) {&lt;br /&gt;
        Vector3f a = new Vector3f(lineEnd);&lt;br /&gt;
        a.sub(lineStart);&lt;br /&gt;
        &lt;br /&gt;
        Vector3f b = new Vector3f(lineStart);&lt;br /&gt;
        b.sub(point);&lt;br /&gt;
        &lt;br /&gt;
        Vector3f cross = new Vector3f();&lt;br /&gt;
        cross.cross(a,b);&lt;br /&gt;
        &lt;br /&gt;
        return cross.length()/a.length();&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Converts the Matrix into Euler angles (roll, pitch, yaw )&lt;br /&gt;
     */&lt;br /&gt;
    public static void toEuler( Matrix3d matrix, Vector3d euler ) {&lt;br /&gt;
        Vector3d v3d = new Vector3d();&lt;br /&gt;
        &lt;br /&gt;
        Vector3d zAxis = new Vector3d( 0, 0, -1 );&lt;br /&gt;
        Vector3d yAxis = new Vector3d( 0, 1, 0 );&lt;br /&gt;
        Vector3d xAxis = new Vector3d( 1, 0, 0 );&lt;br /&gt;
        v3d.set( xAxis );&lt;br /&gt;
        matrix.transform( v3d );&lt;br /&gt;
        v3d.x = Math.abs( v3d.x );&lt;br /&gt;
        v3d.z = 0;&lt;br /&gt;
        v3d.normalize();&lt;br /&gt;
        euler.x = xAxis.angle( v3d );&lt;br /&gt;
        v3d.set( yAxis );&lt;br /&gt;
        matrix.transform( v3d );&lt;br /&gt;
        v3d.z = Math.abs( v3d.z );&lt;br /&gt;
        v3d.x = 0;&lt;br /&gt;
        v3d.normalize();&lt;br /&gt;
        euler.y = yAxis.angle( v3d );&lt;br /&gt;
        v3d.set( zAxis );&lt;br /&gt;
        matrix.transform( v3d );&lt;br /&gt;
        v3d.y = 0;&lt;br /&gt;
        v3d.normalize();&lt;br /&gt;
        euler.z = zAxis.angle( v3d );&lt;br /&gt;
        if (v3d.x&amp;lt;0)&lt;br /&gt;
            euler.z = 2*Math.PI-euler.z;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
    public static boolean epsilonEquals(float f1, float f2, float epsilon) {&lt;br /&gt;
        float diff;&lt;br /&gt;
        diff = f1 - f2;&lt;br /&gt;
        if ((diff &amp;lt; 0 ? -diff : diff) &amp;gt; epsilon) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
    public static boolean epsilonEquals(Tuple3f t1, Tuple3f t2, float epsilon) {&lt;br /&gt;
        if (epsilonEquals(t1.x, t2.x, epsilon) &amp;amp;&amp;amp;&lt;br /&gt;
            epsilonEquals(t1.y, t2.y, epsilon) &amp;amp;&amp;amp;&lt;br /&gt;
            epsilonEquals(t1.z, t2.z, epsilon))&lt;br /&gt;
            return true;&lt;br /&gt;
        &lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
    public static boolean encloses(Bounds parent, Bounds child) {&lt;br /&gt;
        if (parent instanceof BoundingBox)&lt;br /&gt;
            if (child instanceof BoundingBox)&lt;br /&gt;
                return encloses((BoundingBox)parent, (BoundingBox)child);&lt;br /&gt;
            else if (child instanceof BoundingSphere)&lt;br /&gt;
                return encloses((BoundingBox)parent, (BoundingSphere)child);&lt;br /&gt;
        else if (parent instanceof BoundingSphere)&lt;br /&gt;
            if (child instanceof BoundingBox)&lt;br /&gt;
                return encloses((BoundingSphere)parent, (BoundingBox)child);&lt;br /&gt;
            else if (child instanceof BoundingSphere)&lt;br /&gt;
                return encloses((BoundingSphere)parent, (BoundingSphere)child);&lt;br /&gt;
        throw new UnsupportedOperationException(&amp;quot;Unsupported bounds combination&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns true if the parent bounds fully encloses the child &lt;br /&gt;
     */&lt;br /&gt;
    public static boolean encloses(BoundingBox parent, BoundingSphere child) {&lt;br /&gt;
        Point3d upper = new Point3d();&lt;br /&gt;
        Point3d lower = new Point3d();&lt;br /&gt;
        Point3d center = new Point3d();&lt;br /&gt;
        double radius;&lt;br /&gt;
        parent.getUpper(upper);&lt;br /&gt;
        parent.getLower(lower);&lt;br /&gt;
        child.getCenter(center);&lt;br /&gt;
        radius = child.getRadius();&lt;br /&gt;
        if (center.x+radius &amp;gt; upper.x ||&lt;br /&gt;
            center.y+radius &amp;gt; upper.y ||&lt;br /&gt;
            center.z+radius &amp;gt; upper.z)&lt;br /&gt;
            return false;&lt;br /&gt;
        if (center.x-radius &amp;lt; lower.x ||&lt;br /&gt;
            center.y-radius &amp;lt; lower.y ||&lt;br /&gt;
            center.z-radius &amp;lt; lower.z)&lt;br /&gt;
            return false;&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
     /**&lt;br /&gt;
     * Returns true if the parent bounds fully encloses the child &lt;br /&gt;
     */&lt;br /&gt;
    public static boolean encloses(BoundingBox parent, BoundingBox child) {&lt;br /&gt;
        Point3d pUpper = new Point3d();&lt;br /&gt;
        Point3d pLower = new Point3d();&lt;br /&gt;
        Point3d cUpper = new Point3d();&lt;br /&gt;
        Point3d cLower = new Point3d();&lt;br /&gt;
        parent.getUpper(pUpper);&lt;br /&gt;
        parent.getLower(pLower);&lt;br /&gt;
        child.getUpper(cUpper);&lt;br /&gt;
        child.getLower(cLower);&lt;br /&gt;
        if (cUpper.x &amp;gt; pUpper.x ||&lt;br /&gt;
            cUpper.y &amp;gt; pUpper.y ||&lt;br /&gt;
            cUpper.z &amp;gt; pUpper.z)&lt;br /&gt;
                return false;&lt;br /&gt;
        if (cLower.x &amp;lt; pLower.x ||&lt;br /&gt;
            cLower.y &amp;lt; pLower.y ||&lt;br /&gt;
            cLower.z &amp;lt; pLower.z)&lt;br /&gt;
                return false;&lt;br /&gt;
        &lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns true if the parent bounds fully encloses the child &lt;br /&gt;
     */&lt;br /&gt;
    public static boolean encloses(BoundingSphere parent, BoundingBox child) {&lt;br /&gt;
        // if the distance from the center of the sphere to any corner of&lt;br /&gt;
        // the box is greater than the sphere radius return false&lt;br /&gt;
        Point3d lower = new Point3d();&lt;br /&gt;
        Point3d upper = new Point3d();&lt;br /&gt;
        Point3d parentCenter = new Point3d();&lt;br /&gt;
        child.getLower(lower);&lt;br /&gt;
        child.getUpper(upper);&lt;br /&gt;
        parent.getCenter(parentCenter);&lt;br /&gt;
        double xDim = upper.x - lower.x;&lt;br /&gt;
        double yDim = upper.y - lower.y;&lt;br /&gt;
        double radiusSquared = Math.pow(parent.getRadius(), 2);&lt;br /&gt;
        Vector3d tmp = new Vector3d();&lt;br /&gt;
        tmp.set(lower);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(lower.x+xDim, lower.y, lower.z);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(lower.x, lower.y+yDim, lower.z);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(lower.x+xDim, lower.y+yDim, lower.z);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(upper);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(upper.x-xDim, upper.y, upper.z);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(upper.x, upper.y-yDim, upper.z);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        tmp.set(upper.x-xDim, upper.y-yDim, upper.z);&lt;br /&gt;
        tmp.sub(parentCenter);&lt;br /&gt;
        if (tmp.lengthSquared()&amp;gt;radiusSquared)&lt;br /&gt;
            return false;&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns true if the parent bounds fully encloses the child &lt;br /&gt;
     */&lt;br /&gt;
    public static boolean encloses(BoundingSphere parent, BoundingSphere child) {&lt;br /&gt;
        Point3d childCenter = new Point3d();&lt;br /&gt;
        Point3d parentCenter = new Point3d();&lt;br /&gt;
        child.getCenter(childCenter);&lt;br /&gt;
        parent.getCenter(parentCenter);&lt;br /&gt;
        double childR = child.getRadius();&lt;br /&gt;
        double parentR = parent.getRadius();&lt;br /&gt;
        if (childCenter.x+childR &amp;gt; parentCenter.x+parentR ||&lt;br /&gt;
            childCenter.y+childR &amp;gt; parentCenter.y+parentR ||&lt;br /&gt;
            childCenter.z+childR &amp;gt; parentCenter.z+parentR)&lt;br /&gt;
            return false;&lt;br /&gt;
        &lt;br /&gt;
        if (childCenter.x-childR &amp;lt; parentCenter.x-parentR ||&lt;br /&gt;
            childCenter.y-childR &amp;lt; parentCenter.y-parentR ||&lt;br /&gt;
            childCenter.z-childR &amp;lt; parentCenter.z-parentR)&lt;br /&gt;
            return false;&lt;br /&gt;
            &lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Capability information from a SceneGraph Object ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * $RCSfile: Capabilities.java,v $&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 * - Redistribution of source code must retain the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 * - Redistribution in binary form must reproduce the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer in&lt;br /&gt;
 *   the documentation and/or other materials provided with the&lt;br /&gt;
 *   distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * Neither the name of Sun Microsystems, Inc. or the names of&lt;br /&gt;
 * contributors may be used to endorse or promote products derived&lt;br /&gt;
 * from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any&lt;br /&gt;
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND&lt;br /&gt;
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY&lt;br /&gt;
 * EXCLUDED. SUN MICROSYSTEMS, INC. (&amp;quot;SUN&amp;quot;) AND ITS LICENSORS SHALL&lt;br /&gt;
 * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF&lt;br /&gt;
 * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS&lt;br /&gt;
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR&lt;br /&gt;
 * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,&lt;br /&gt;
 * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND&lt;br /&gt;
 * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR&lt;br /&gt;
 * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
 *&lt;br /&gt;
 * You acknowledge that this software is not designed, licensed or&lt;br /&gt;
 * intended for use in the design, construction, operation or&lt;br /&gt;
 * maintenance of any nuclear facility.&lt;br /&gt;
 *&lt;br /&gt;
 * $Revision: 1.2 $&lt;br /&gt;
 * $Date: 2007/02/09 17:17:00 $&lt;br /&gt;
 * $State: Exp $&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
/** &lt;br /&gt;
 * Convenience class for extracting capability information from a SceneGraph Object&lt;br /&gt;
 *&lt;br /&gt;
 * @author Paul Byrne&lt;br /&gt;
 * @version 1.6, 01/18/02&lt;br /&gt;
 */&lt;br /&gt;
public class Capabilities extends Object {&lt;br /&gt;
 &lt;br /&gt;
  /** Print a list of SET capabilities to stdout, one capability per line&lt;br /&gt;
 * @param obj The Object for which to print the capabilities&lt;br /&gt;
 */&lt;br /&gt;
  public static void printCapabilities( javax.media.j3d.SceneGraphObject obj ) {&lt;br /&gt;
    ArrayList list = new ArrayList();&lt;br /&gt;
    getCapabilities( obj, list );&lt;br /&gt;
    java.util.Iterator it = list.iterator();&lt;br /&gt;
    while(it.hasNext())&lt;br /&gt;
      System.out.println( (String)it.next() );&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  /** Extract the names of all the SET capabilities in the object.&lt;br /&gt;
 * The names (Strings) are appended to the arrayList&lt;br /&gt;
 * @param obj The object for which to extract the capability strings&lt;br /&gt;
 * @param capabilityStrings The ArrayList to which the capability names will be appended&lt;br /&gt;
 */&lt;br /&gt;
  public static void getCapabilities( javax.media.j3d.SceneGraphObject obj,&lt;br /&gt;
                                         java.util.ArrayList capabilityStrings ) {&lt;br /&gt;
    int value;&lt;br /&gt;
    String str;&lt;br /&gt;
    Class cl = obj.getClass();&lt;br /&gt;
    java.lang.reflect.Field[] fields = cl.getFields();&lt;br /&gt;
    try {&lt;br /&gt;
      for(int i=0; i&amp;lt;fields.length; i++) {&lt;br /&gt;
        str = fields[i].getName();&lt;br /&gt;
        value = fields[i].getInt( fields[i] );&lt;br /&gt;
        if (str.indexOf(&amp;quot;ALLOW&amp;quot;) != -1 || str.indexOf(&amp;quot;ENABLE_&amp;quot;)!=-1) {&lt;br /&gt;
          if (obj.getCapability(value))&lt;br /&gt;
          capabilityStrings.add( str );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } catch(Exception e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
      throw new RuntimeException(&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  /**&lt;br /&gt;
   * Return an array of capability bits for the object&lt;br /&gt;
   *&lt;br /&gt;
   * If no capabilities are set then an array of length 0 is returned&lt;br /&gt;
   *&lt;br /&gt;
   * @param obj The object for which to extract the capability bits&lt;br /&gt;
   */&lt;br /&gt;
  public static int[] getCapabilities( javax.media.j3d.SceneGraphObject obj ) {&lt;br /&gt;
      ArrayList bits = new ArrayList();&lt;br /&gt;
      &lt;br /&gt;
    int value;&lt;br /&gt;
    String str;&lt;br /&gt;
    Class cl = obj.getClass();&lt;br /&gt;
    java.lang.reflect.Field[] fields = cl.getFields();&lt;br /&gt;
    try {&lt;br /&gt;
      for(int i=0; i&amp;lt;fields.length; i++) {&lt;br /&gt;
        str = fields[i].getName();&lt;br /&gt;
        value = fields[i].getInt( fields[i] );&lt;br /&gt;
        if (str.indexOf(&amp;quot;ALLOW_&amp;quot;) != -1 || str.indexOf(&amp;quot;ENABLE_&amp;quot;)!=-1 ) {&lt;br /&gt;
          if (obj.getCapability(value))&lt;br /&gt;
            bits.add( new Integer(value) );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } catch(Exception e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
      throw new RuntimeException(&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int[] ret = new int[ bits.size() ];&lt;br /&gt;
    for(int i=0; i&amp;lt;ret.length; i++)&lt;br /&gt;
        ret[i] = ((Integer)bits.get(i)).intValue();&lt;br /&gt;
    &lt;br /&gt;
    return ret;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>