[x3d-public] JSweet translation of X3DJSAIL to JavaScript: need specific design goals first

John Carlson yottzumm at gmail.com
Thu Apr 9 16:58:21 PDT 2020


Typescript Transform (pt 2 of 2)

/* Generated from Java with JSweet 2.3.0-SNAPSHOT - http://www.jsweet.org */
namespace org.web3d.x3d.sai.Grouping {
    /**
     * Transform is a Grouping node that can contain most nodes.
     *
     * <br><br>
     * <i>X3D node tooltip</i>: [X3DGroupingNode] Transform is a Grouping
node that can contain most nodes. Transform translates, orients and scales
child geometry within the local world coordinate system.
     * <ul>
     * <li> <i>Hint:</i> each transformation creates a new coordinate
system relative to the parent coordinate system. </li>
     * <li> <i>Hint:</i> +Y axis is the up direction. (Similarly some
scenes may consider +X is North and +Z is East.) </li>
     * <li> <i>Hint:</i> best authoring approach is to keep +Y axis
pointing towards local up direction, supporting scene composability and
effective navigation response (which is based on gravity direction). </li>
     * <li> <i>Hint:</i> insert a Shape node before adding geometry or
Appearance. </li>
     * <li> <i>Hint:</i> translation/rotation/scaling field attributes can
be defined in any order in the scene. The applied order of
translation/rotation/scaling transformation-matrix operations remains
consistent. </li>
     * <li> <i>Hint:</i> authors can modify order of
translation/rotation/scaling operations by splitting them into separate
nested parent/child Transform nodes. </li>
     * <li> <i>Warning:</i> Transform contained by CADFace can only hold a
single LOD or Shape node. </li>
     * <li> <i>Hint:</i> X3D Scene Authoring Hints, Coordinate Systems <a
href="
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#CoordinateSystems"
target="_blank">
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#CoordinateSystems</a>
</li>
     * <li> <i>Hint:</i> X3D Scene Authoring Hints, Scale Factors and Unit
Conversions <a href="
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Scale"
target="_blank">
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Scale</a>
</li>
     * <li> <i>Hint:</i>  apply containerField='shape' if parent node is
CADFace. </li>
     * </ul>
     * <br>
     * <i>Package hint:</i>  This interface is defined by the X3D Java
Language Binding Specification for the Scene Authoring Interface (SAI).
     * @author Don Brutzman and Roy Walmsley
     * @see <a href="
https://www.web3d.org/documents/specifications/19777-2/V3.3/Part2/concretes.html#Transform"
target="_blank">SAI Java Specification: TODO</a>
     * @see <a href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#Transform"
target="blank">X3D Abstract Specification: Transform</a>
     * @see <a href="
https://www.web3d.org/x3d/tooltips/X3dTooltips.html#Transform"
target="_blank">X3D Tooltips: Transform</a>
     * @see <a href="
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#CoordinateSystems"
target="_blank">X3D Scene Authoring Hints: CoordinateSystems</a>
     * @class
     */
    export interface Transform extends
org.web3d.x3d.sai.Grouping.X3DGroupingNode {
        /**
         * Provide array of 3-tuple float results from initializeOnly
SFVec3f field named <i>bboxCenter</i>.
         * <br><br>
         * <i>Tooltip:</i> Bounding box center accompanies bboxSize and
provides an optional hint for bounding box position offset from origin of
local coordinate system.
         * <ul>
         * <li> <i>Hint:</i> precomputation and inclusion of bounding box
information can speed up the initialization of large detailed models, with
a corresponding cost of increased file size. </li>
         * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
target="_blank">
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
</li>
         * </ul>
         * @return {Array} value of bboxCenter field
         */
        getBboxCenter() : number[];

        /**
         * Accessor method to assign 3-tuple float array to initializeOnly
SFVec3f field named <i>bboxCenter</i>.
         * <br><br>
         * <i>Tooltip:</i> Bounding box center accompanies bboxSize and
provides an optional hint for bounding box position offset from origin of
local coordinate system.
         * <ul>
         * <li> <i>Hint:</i> precomputation and inclusion of bounding box
information can speed up the initialization of large detailed models, with
a corresponding cost of increased file size. </li>
         * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
target="_blank">
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
</li>
         * </ul>
         * @param {Array} newValue is new value for the bboxCenter field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setBboxCenter(newValue : number[]) : Transform;

        /**
         * Provide array of 3-tuple float results within allowed range of
[0,infinity), or default value [-1 -1 -1], from initializeOnly SFVec3f
field named <i>bboxSize</i>.
         * <br><br>
         * <i>Tooltip:</i> Bounding box size is usually omitted, and can
easily be calculated automatically by an X3D player at scene-loading time
with minimal computational cost. Bounding box size can also be defined as
an optional authoring hint that suggests an optimization or constraint.
         * <ul>
         * <li> <i>Hint:</i> can be useful for collision computations or
inverse-kinematics (IK) engines. </li>
         * <li> <i>Hint:</i> precomputation and inclusion of bounding box
information can speed up the initialization of large detailed models, with
a corresponding cost of increased file size. </li>
         * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
target="_blank">
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
</li>
         * </ul>
         * @return {Array} value of bboxSize field
         */
        getBboxSize() : number[];

        /**
         * Accessor method to assign 3-tuple float array to initializeOnly
SFVec3f field named <i>bboxSize</i>.
         * <br><br>
         * <i>Tooltip:</i> Bounding box size is usually omitted, and can
easily be calculated automatically by an X3D player at scene-loading time
with minimal computational cost. Bounding box size can also be defined as
an optional authoring hint that suggests an optimization or constraint.
         * <ul>
         * <li> <i>Hint:</i> can be useful for collision computations or
inverse-kinematics (IK) engines. </li>
         * <li> <i>Hint:</i> precomputation and inclusion of bounding box
information can speed up the initialization of large detailed models, with
a corresponding cost of increased file size. </li>
         * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
target="_blank">
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
</li>
         * </ul>
         * @param {Array} newValue is new value for the bboxSize field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setBboxSize(newValue : number[]) : Transform;

        /**
         * Provide array of 3-tuple float results from inputOutput SFVec3f
field named <i>center</i>.
         * <br><br>
         * <i>Tooltip:</i> Translation offset from origin of local
coordinate system, applied prior to rotation or scaling.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @return {Array} value of center field
         */
        getCenter() : number[];

        /**
         * Accessor method to assign 3-tuple float array to inputOutput
SFVec3f field named <i>center</i>.
         * <br><br>
         * <i>Tooltip:</i> Translation offset from origin of local
coordinate system, applied prior to rotation or scaling.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @param {Array} newValue is new value for the center field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setCenter(newValue : number[]) : Transform;

        /**
         * Provide array of X3DNode results (using an array consisting of
properly typed nodes or ProtoInstanceObjects) from inputOutput MFNode field
<i>children</i>.
         * <br><br>
         * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an ordered
list of children nodes.
         * <ul>
         * <li> <i>Hint:</i> Each grouping node defines a coordinate space
for its children, relative to the coordinate space of its parent node. Thus
transformations accumulate down the scene graph hierarchy. </li>
         * <li> <i>Hint:</i> inputOnly MFNode addChildren field can append
new X3DChildNode nodes via a ROUTE connection, duplicate input nodes (i.e.
matching DEF, USE values) are ignored. </li>
         * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
remove nodes from the children list, unrecognized input nodes (i.e.
nonmatching DEF, USE values) are ignored. </li>
         * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and children
node types, <a href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
target="_blank">
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
</li>
         * </ul>
         * <br><br>
         * <i>Warning:</i> according to X3D Unified Object Model (X3DUOM),
acceptable node types are limited to X3DChildNode.
         * @see org.web3d.x3d.sai.Core.X3DChildNode
         * @return {Array} value of children field
         */
        getChildren() : org.web3d.x3d.sai.Core.X3DNode[];

        /**
         * Accessor method to assign X3DNode array (using an array
consisting of properly typed nodes or ProtoInstanceObjects) to inputOutput
MFNode field <i>children</i>.
         * <br><br>
         * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an ordered
list of children nodes.
         * <ul>
         * <li> <i>Hint:</i> Each grouping node defines a coordinate space
for its children, relative to the coordinate space of its parent node. Thus
transformations accumulate down the scene graph hierarchy. </li>
         * <li> <i>Hint:</i> inputOnly MFNode addChildren field can append
new X3DChildNode nodes via a ROUTE connection, duplicate input nodes (i.e.
matching DEF, USE values) are ignored. </li>
         * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
remove nodes from the children list, unrecognized input nodes (i.e.
nonmatching DEF, USE values) are ignored. </li>
         * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and children
node types, <a href="
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
target="_blank">
https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
</li>
         * </ul>
         * <br><br>
         * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
acceptable node types are limited to X3DChildNode.
         * @param {Array} newValue is new value for the children field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setChildren(newValue? : any) : any;

        /**
         * Add array of children nodes to array of existing nodes (if any).
         * <br><br>
         * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
acceptable node types are limited to X3DChildNode.
         * @param {Array} newValue is new value array to be appended the
children field.
         */
        addChildren(newValue : org.web3d.x3d.sai.Core.X3DNode[]);

        /**
         * Provide X3DMetadataObject instance (using a properly typed node)
from inputOutput SFNode field <i>metadata</i>.
         * @see <a href="
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
         * @return {*} value of metadata field
         */
        getMetadata() : org.web3d.x3d.sai.Core.X3DMetadataObject;

        /**
         * Accessor method to assign X3DMetadataObject instance (using a
properly typed node) to inputOutput SFNode field <i>metadata</i>.
         * @see <a href="
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
         * @param {*} newValue is new value for the metadata field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setMetadata(newValue : org.web3d.x3d.sai.Core.X3DMetadataObject) :
Transform;

        /**
         * Provide array of 4-tuple float results unit axis, angle (in
radians) from inputOutput SFRotation field named <i>rotation</i>.
         * <br><br>
         * <i>Tooltip:</i> Orientation (axis, angle in radians) of children
relative to local coordinate system.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @return {Array} value of rotation field
         */
        getRotation() : number[];

        /**
         * Accessor method to assign 4-tuple float array unit axis, angle
(in radians) to inputOutput SFRotation field named <i>rotation</i>.
         * <br><br>
         * <i>Tooltip:</i> Orientation (axis, angle in radians) of children
relative to local coordinate system.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @param {Array} newValue is new value for the rotation field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setRotation(newValue : number[]) : Transform;

        /**
         * Provide array of 3-tuple float results from inputOutput SFVec3f
field named <i>scale</i>.
         * <br><br>
         * <i>Tooltip:</i> Non-uniform x-y-z scale of child coordinate
system, adjusted by center and scaleOrientation.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @return {Array} value of scale field
         */
        getScale() : number[];

        /**
         * Accessor method to assign 3-tuple float array to inputOutput
SFVec3f field named <i>scale</i>.
         * <br><br>
         * <i>Tooltip:</i> Non-uniform x-y-z scale of child coordinate
system, adjusted by center and scaleOrientation.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @param {Array} newValue is new value for the scale field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setScale(newValue : number[]) : Transform;

        /**
         * Provide array of 4-tuple float results unit axis, angle (in
radians) from inputOutput SFRotation field named <i>scaleOrientation</i>.
         * <br><br>
         * <i>Tooltip:</i> Preliminary rotation of coordinate system before
scaling (to allow scaling around arbitrary orientations).
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @return {Array} value of scaleOrientation field
         */
        getScaleOrientation() : number[];

        /**
         * Accessor method to assign 4-tuple float array unit axis, angle
(in radians) to inputOutput SFRotation field named <i>scaleOrientation</i>.
         * <br><br>
         * <i>Tooltip:</i> Preliminary rotation of coordinate system before
scaling (to allow scaling around arbitrary orientations).
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @param {Array} newValue is new value for the scaleOrientation
field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setScaleOrientation(newValue : number[]) : Transform;

        /**
         * Provide array of 3-tuple float results from inputOutput SFVec3f
field named <i>translation</i>.
         * <br><br>
         * <i>Tooltip:</i> Position (x, y, z in meters) of children
relative to local coordinate system.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @return {Array} value of translation field
         */
        getTranslation() : number[];

        /**
         * Accessor method to assign 3-tuple float array to inputOutput
SFVec3f field named <i>translation</i>.
         * <br><br>
         * <i>Tooltip:</i> Position (x, y, z in meters) of children
relative to local coordinate system.
         * <ul>
         * <li> <i> Hint:</i>  The order of operation is first apply the
center offset, then scaleOrientation and scale, then rotation, then restore
the center offset, then translation. </li>
         * </ul>
         * @param {Array} newValue is new value for the translation field.
         * @return {*} {@link Transform} - namely <i>this</i> same object
to allow sequential method pipelining (i.e. consecutive method invocations
on the same object).
         */
        setTranslation(newValue : number[]) : Transform;
    }
}


On Thu, Apr 9, 2020 at 6:57 PM John Carlson <yottzumm at gmail.com> wrote:

> Typescript Transform (part 1 of 2)
>
> /* Generated from Java with JSweet 2.3.0-SNAPSHOT - http://www.jsweet.org
> */
> namespace org.web3d.x3d.jsail.Grouping {
>     /**
>      * Utility constructor that assigns DEF label after initializing
> member variables with default values.
>      * @param {string} DEFlabel unique DEF name for this X3D node
>      * @class
>      * @extends org.web3d.x3d.jsail.X3DConcreteNode
>      * @author Don Brutzman and Roy Walmsley
>      */
>     export class TransformObject extends
> org.web3d.x3d.jsail.X3DConcreteNode implements
> org.web3d.x3d.sai.Grouping.Transform {
>         /*private*/ bboxCenter : number[];
>
>         /*private*/ bboxSize : number[];
>
>         /*private*/ center : number[];
>
>         /*private*/ children :
> java.util.ArrayList<org.web3d.x3d.sai.Core.X3DNode>;
>
>         /*private*/ IS : org.web3d.x3d.jsail.Core.ISObject;
>
>         /*private*/ metadata : org.web3d.x3d.sai.Core.X3DMetadataObject;
>
>         /*private*/ metadataProtoInstance :
> org.web3d.x3d.jsail.Core.ProtoInstanceObject;
>
>         /*private*/ rotation : number[];
>
>         /*private*/ scale : number[];
>
>         /*private*/ scaleOrientation : number[];
>
>         /*private*/ translation : number[];
>
>         /**
>          * String constant <i>NAME</i> provides name of this element:
> <i>Transform</i>.
>          */
>         public static NAME : string = "Transform";
>
>         /**
>          * Provides name of this element: <i>Transform</i>
>          * @return {string} name of this element
>          */
>         public getElementName() : string {
>             return TransformObject.NAME;
>         }
>
>         /**
>          * String constant <i>COMPONENT</i> defines X3D component for the
> <i>Transform</i> element: <i>Grouping</i>
>          */
>         public static COMPONENT : string = "Grouping";
>
>         /**
>          * Defines X3D component for the <i>Transform</i> element:
> <i>Grouping</i>
>          * @return {string} X3D component for this element
>          */
>         public getComponent() : string {
>             return TransformObject.COMPONENT;
>         }
>
>         /**
>          * Integer constant <i>LEVEL</i> provides default X3D
> <i>Grouping</i> component level for this element: <i>1</i>
>          */
>         public static LEVEL : number = 1;
>
>         /**
>          * Provides default X3D component level for this element: <i>1</i>
>          * @return {number} default X3D component level for this element
>          */
>         public getComponentLevel() : number {
>             return TransformObject.LEVEL;
>         }
>
>         /**
>          * SFVec3f field named <i>bboxCenter</i> has default value
> <i>{0f,0f,0f}</i> (Java syntax) or <i>0 0 0</i> (XML syntax).
>          */
>         public static BBOXCENTER_DEFAULT_VALUE : number[]; public static
> BBOXCENTER_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.BBOXCENTER_DEFAULT_VALUE == null)
> TransformObject.BBOXCENTER_DEFAULT_VALUE = [0.0, 0.0, 0.0]; return
> TransformObject.BBOXCENTER_DEFAULT_VALUE; };
>
>         /**
>          * SFVec3f field named <i>bboxSize</i> has default value
> <i>{-1f,-1f,-1f}</i> (Java syntax) or <i>-1 -1 -1</i> (XML syntax).
>          */
>         public static BBOXSIZE_DEFAULT_VALUE : number[]; public static
> BBOXSIZE_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.BBOXSIZE_DEFAULT_VALUE == null)
> TransformObject.BBOXSIZE_DEFAULT_VALUE = [-1.0, -1.0, -1.0]; return
> TransformObject.BBOXSIZE_DEFAULT_VALUE; };
>
>         /**
>          * SFVec3f field named <i>center</i> has default value
> <i>{0f,0f,0f}</i> (Java syntax) or <i>0 0 0</i> (XML syntax).
>          */
>         public static CENTER_DEFAULT_VALUE : number[]; public static
> CENTER_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.CENTER_DEFAULT_VALUE == null)
> TransformObject.CENTER_DEFAULT_VALUE = [0.0, 0.0, 0.0]; return
> TransformObject.CENTER_DEFAULT_VALUE; };
>
>         /**
>          * SFNode field named <i>IS</i> has default value <i>null</i>
> (Java syntax) or <i>NULL</i> (XML syntax).
>          */
>         public static IS_DEFAULT_VALUE : org.web3d.x3d.jsail.Core.ISObject
> = null;
>
>         /**
>          * SFNode field named <i>metadata</i> has default value
> <i>null</i> (Java syntax) or <i>NULL</i> (XML syntax).
>          */
>         public static METADATA_DEFAULT_VALUE :
> org.web3d.x3d.sai.Core.X3DMetadataObject = null;
>
>         /**
>          * SFRotation field named <i>rotation</i> has default value
> <i>{0f,0f,1f,0f}</i> (Java syntax) or <i>0 0 1 0</i> (XML syntax).
>          */
>         public static ROTATION_DEFAULT_VALUE : number[]; public static
> ROTATION_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.ROTATION_DEFAULT_VALUE == null)
> TransformObject.ROTATION_DEFAULT_VALUE = [0.0, 0.0, 1.0, 0.0]; return
> TransformObject.ROTATION_DEFAULT_VALUE; };
>
>         /**
>          * SFVec3f field named <i>scale</i> has default value
> <i>{1f,1f,1f}</i> (Java syntax) or <i>1 1 1</i> (XML syntax).
>          */
>         public static SCALE_DEFAULT_VALUE : number[]; public static
> SCALE_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.SCALE_DEFAULT_VALUE == null)
> TransformObject.SCALE_DEFAULT_VALUE = [1.0, 1.0, 1.0]; return
> TransformObject.SCALE_DEFAULT_VALUE; };
>
>         /**
>          * SFRotation field named <i>scaleOrientation</i> has default
> value <i>{0f,0f,1f,0f}</i> (Java syntax) or <i>0 0 1 0</i> (XML syntax).
>          */
>         public static SCALEORIENTATION_DEFAULT_VALUE : number[]; public
> static SCALEORIENTATION_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.SCALEORIENTATION_DEFAULT_VALUE == null)
> TransformObject.SCALEORIENTATION_DEFAULT_VALUE = [0.0, 0.0, 1.0, 0.0];
> return TransformObject.SCALEORIENTATION_DEFAULT_VALUE; };
>
>         /**
>          * SFVec3f field named <i>translation</i> has default value
> <i>{0f,0f,0f}</i> (Java syntax) or <i>0 0 0</i> (XML syntax).
>          */
>         public static TRANSLATION_DEFAULT_VALUE : number[]; public static
> TRANSLATION_DEFAULT_VALUE_$LI$() : number[] {
> if(TransformObject.TRANSLATION_DEFAULT_VALUE == null)
> TransformObject.TRANSLATION_DEFAULT_VALUE = [0.0, 0.0, 0.0]; return
> TransformObject.TRANSLATION_DEFAULT_VALUE; };
>
>         /**
>          * Indicate type corresponding to given fieldName.
>          * @param {string} fieldName name of field in this X3D node
>          * @see ConfigurationProperties#ERROR_UNKNOWN_FIELD_TYPE
>          * @return {string} X3D type (SFvec3f etc.), otherwise
> ConfigurationProperties.ERROR_UNKNOWN_FIELD_TYPE if not recognized
>          */
>         public getFieldType(fieldName : string) : string {
>             let result : string;
>             switch((fieldName)) {
>             case "containerField":
>                 result = "SFString";
>                 break;
>             case "addChildren":
>                 result = "MFNode";
>                 break;
>             case "bboxCenter":
>                 result = "SFVec3f";
>                 break;
>             case "bboxSize":
>                 result = "SFVec3f";
>                 break;
>             case "center":
>                 result = "SFVec3f";
>                 break;
>             case "children":
>                 result = "MFNode";
>                 break;
>             case "IS":
>                 result = "SFNode";
>                 break;
>             case "metadata":
>                 result = "SFNode";
>                 break;
>             case "removeChildren":
>                 result = "MFNode";
>                 break;
>             case "rotation":
>                 result = "SFRotation";
>                 break;
>             case "scale":
>                 result = "SFVec3f";
>                 break;
>             case "scaleOrientation":
>                 result = "SFRotation";
>                 break;
>             case "translation":
>                 result = "SFVec3f";
>                 break;
>             case "DEF":
>                 result = "SFString";
>                 break;
>             case "USE":
>                 result = "SFString";
>                 break;
>             case "class":
>                 result = "SFString";
>                 break;
>             default:
>                 {
>                     if(/* startsWith */((str, searchString, position = 0)
> => str.substr(position, searchString.length) ===
> searchString)(fieldName.trim(), "set_")) result =
> this.getFieldType(fieldName.trim().substring(4)); else if(/* endsWith
> */((str, searchString) => { let pos = str.length - searchString.length; let
> lastIndex = str.indexOf(searchString, pos); return lastIndex !== -1 &&
> lastIndex === pos; })(fieldName.trim(), "_changed")) result =
> this.getFieldType(fieldName.trim().substring(0, fieldName.length - 8));
> else result =
> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_UNKNOWN_FIELD_TYPE;
>                 };
>             }
>             return result;
>         }
>
>         /**
>          * Indicate accessType corresponding to given fieldName.
>          * @param {string} fieldName name of field in this X3D node
>          * @see ConfigurationProperties#ERROR_UNKNOWN_FIELD_ACCESSTYPE
>          * @return {string} X3D accessType (inputOnly etc.), otherwise
> ConfigurationProperties.ERROR_UNKNOWN_FIELD_ACCESSTYPE if not recognized
>          */
>         public getAccessType(fieldName : string) : string {
>             let result : string;
>             switch((fieldName)) {
>             case "addChildren":
>                 result = "inputOnly";
>                 break;
>             case "bboxCenter":
>                 result = "initializeOnly";
>                 break;
>             case "bboxSize":
>                 result = "initializeOnly";
>                 break;
>             case "center":
>                 result = "inputOutput";
>                 break;
>             case "children":
>                 result = "inputOutput";
>                 break;
>             case "IS":
>                 result = "inputOutput";
>                 break;
>             case "metadata":
>                 result = "inputOutput";
>                 break;
>             case "removeChildren":
>                 result = "inputOnly";
>                 break;
>             case "rotation":
>                 result = "inputOutput";
>                 break;
>             case "scale":
>                 result = "inputOutput";
>                 break;
>             case "scaleOrientation":
>                 result = "inputOutput";
>                 break;
>             case "translation":
>                 result = "inputOutput";
>                 break;
>             case "DEF":
>                 result = "inputOutput";
>                 break;
>             case "USE":
>                 result = "inputOutput";
>                 break;
>             case "class":
>                 result = "inputOutput";
>                 break;
>             default:
>                 {
>                     if(/* startsWith */((str, searchString, position = 0)
> => str.substr(position, searchString.length) ===
> searchString)(fieldName.trim(), "set_")) result =
> this.getAccessType(fieldName.trim().substring(4)); else if(/* endsWith
> */((str, searchString) => { let pos = str.length - searchString.length; let
> lastIndex = str.indexOf(searchString, pos); return lastIndex !== -1 &&
> lastIndex === pos; })(fieldName.trim(), "_changed")) result =
> this.getAccessType(fieldName.trim().substring(0, fieldName.length - 8));
> else result =
> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_UNKNOWN_FIELD_ACCESSTYPE;
>                 };
>             }
>             return result;
>         }
>
>         /**
>          * containerField describes typical field relationship of a node
> to its parent.
>          * Usage is not ordinarily needed when using this API, default
> value is provided for informational purposes.
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#containerField">X3D
> Scene Authoring Hints: containerField</a>
>          * @see <a href="https://www.web3d.org/specifications/X3DUOM.html">X3D
> Unified Object Model (X3DUOM)</a>
>          */
>         public static containerField_DEFAULT_VALUE : string = "children";
>
>         /**
>          * containerField describes typical field relationship of a node
> to its parent.
>          * Usage is not ordinarily needed when using this API, default
> value is provided for informational purposes.
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#containerField">X3D
> Scene Authoring Hints: containerField</a>
>          * @see <a href="https://www.web3d.org/specifications/X3DUOM.html">X3D
> Unified Object Model (X3DUOM)</a>
>          * @return {string} default containerField value
>          */
>         public getContainerFieldDefault() : string {
>             return TransformObject.containerField_DEFAULT_VALUE;
>         }
>
>         /**
>          * toField ROUTE name for MFNode field named <i>addChildren</i>.
>          */
>         public static toField_ADDCHILDREN : string = "addChildren";
>
>         /**
>          * fromField ROUTE name for SFVec3f field named <i>center</i>.
>          */
>         public static fromField_CENTER : string = "center";
>
>         /**
>          * toField ROUTE name for SFVec3f field named <i>center</i>.
>          */
>         public static toField_CENTER : string = "center";
>
>         /**
>          * fromField ROUTE name for MFNode field named <i>children</i>.
>          */
>         public static fromField_CHILDREN : string = "children";
>
>         /**
>          * toField ROUTE name for MFNode field named <i>children</i>.
>          */
>         public static toField_CHILDREN : string = "children";
>
>         /**
>          * fromField ROUTE name for SFNode field named <i>IS</i>.
>          */
>         public static fromField_IS : string = "IS";
>
>         /**
>          * fromField ROUTE name for SFNode field named <i>metadata</i>.
>          */
>         public static fromField_METADATA : string = "metadata";
>
>         /**
>          * toField ROUTE name for SFNode field named <i>metadata</i>.
>          */
>         public static toField_METADATA : string = "metadata";
>
>         /**
>          * toField ROUTE name for MFNode field named <i>removeChildren</i>.
>          */
>         public static toField_REMOVECHILDREN : string = "removeChildren";
>
>         /**
>          * fromField ROUTE name for SFRotation field named <i>rotation</i>.
>          */
>         public static fromField_ROTATION : string = "rotation";
>
>         /**
>          * toField ROUTE name for SFRotation field named <i>rotation</i>.
>          */
>         public static toField_ROTATION : string = "rotation";
>
>         /**
>          * fromField ROUTE name for SFVec3f field named <i>scale</i>.
>          */
>         public static fromField_SCALE : string = "scale";
>
>         /**
>          * toField ROUTE name for SFVec3f field named <i>scale</i>.
>          */
>         public static toField_SCALE : string = "scale";
>
>         /**
>          * fromField ROUTE name for SFRotation field named
> <i>scaleOrientation</i>.
>          */
>         public static fromField_SCALEORIENTATION : string =
> "scaleOrientation";
>
>         /**
>          * toField ROUTE name for SFRotation field named
> <i>scaleOrientation</i>.
>          */
>         public static toField_SCALEORIENTATION : string =
> "scaleOrientation";
>
>         /**
>          * fromField ROUTE name for SFVec3f field named <i>translation</i>.
>          */
>         public static fromField_TRANSLATION : string = "translation";
>
>         /**
>          * toField ROUTE name for SFVec3f field named <i>translation</i>.
>          */
>         public static toField_TRANSLATION : string = "translation";
>
>         /**
>          * Initialize all member variables to default values.
>          */
>         public initialize() {
>             super.initialize();
>             this.setContainerFieldOverride("");
>             this.containerField_ALTERNATE_VALUES = ["children", "proxy",
> "shape"];
>             this.bboxCenter =
> TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$();
>             this.bboxSize = TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$();
>             this.center = TransformObject.CENTER_DEFAULT_VALUE_$LI$();
>             this.children = <any>(new java.util.ArrayList<any>());
>             this.IS = null;
>             this.metadata = null;
>             this.metadataProtoInstance = null;
>             this.rotation = TransformObject.ROTATION_DEFAULT_VALUE_$LI$();
>             this.scale = TransformObject.SCALE_DEFAULT_VALUE_$LI$();
>             this.scaleOrientation =
> TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$();
>             this.translation =
> TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$();
>         }
>
>         /**
>          * Provide array of 3-tuple float results from initializeOnly
> SFVec3f field named <i>bboxCenter</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Bounding box center accompanies bboxSize and
> provides an optional hint for bounding box position offset from origin of
> local coordinate system.
>          * <ul>
>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
> information can speed up the initialization of large detailed models, with
> a corresponding cost of increased file size. </li>
>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
> href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
> </li>
>          * </ul>
>          * @return {Array} value of bboxCenter field
>          */
>         public getBboxCenter() : number[] {
>             return this.bboxCenter;
>         }
>
>         public setBboxCenter$float_A(newValue : number[]) :
> TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 3) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform bboxCenter
> newValue=" + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) +
> " has length=" + newValue.length + " instead of required length 3");
>             }
>             this.bboxCenter = newValue;
>             return this;
>         }
>
>         public
> setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>             this.setBboxCenter$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setBboxCenter$float$float$float(x : number, y : number, z :
> number) : TransformObject {
>             this.setBboxCenter$float_A([x, y, z]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFVec3f bboxCenter field, similar to {@link
> #setBboxCenter(float[])}.
>          *
>          * @param {number} x first component
>          * @param {number} y second component
>          * @param {number} z third component
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setBboxCenter(x? : any, y? : any, z? : any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setBboxCenter$float$float$float(x, y, z);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setBboxCenter$double$double$double(x, y,
> z);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setBboxCenter$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
> undefined && z === undefined) {
>                 return
> <any>this.setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setBboxCenter$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setBboxCenter$double$double$double(x : number, y : number,
> z : number) : TransformObject {
>             return
> this.setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>         }
>
>         public setBboxCenter$double_A(newArray : number[]) :
> TransformObject {
>             return
> this.setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>         }
>
>         /**
>          * Provide array of 3-tuple float results within allowed range of
> [0,infinity), or default value [-1 -1 -1], from initializeOnly SFVec3f
> field named <i>bboxSize</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Bounding box size is usually omitted, and can
> easily be calculated automatically by an X3D player at scene-loading time
> with minimal computational cost. Bounding box size can also be defined as
> an optional authoring hint that suggests an optimization or constraint.
>          * <ul>
>          * <li> <i>Hint:</i> can be useful for collision computations or
> inverse-kinematics (IK) engines. </li>
>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
> information can speed up the initialization of large detailed models, with
> a corresponding cost of increased file size. </li>
>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
> href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
> </li>
>          * </ul>
>          * @return {Array} value of bboxSize field
>          */
>         public getBboxSize() : number[] {
>             return this.bboxSize;
>         }
>
>         public setBboxSize$float_A(newValue : number[]) : TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 3) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform bboxSize newValue="
> + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
> length=" + newValue.length + " instead of required length 3");
>             }
>             if(((newValue[0] < 0) || (newValue[1] < 0) || (newValue[2] <
> 0)) && !((newValue[0] === -1) && (newValue[1] === -1) && (newValue[2] ===
> -1))) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform bboxSize newValue="
> + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
> negative value but is not equal to sentinel {-1,-1,-1} value.");
>             }
>             this.bboxSize = newValue;
>             return this;
>         }
>
>         public
> setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>             this.setBboxSize$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setBboxSize$float$float$float(x : number, y : number, z :
> number) : TransformObject {
>             this.setBboxSize$float_A([x, y, z]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFVec3f bboxSize field, similar to {@link
> #setBboxSize(float[])}.
>          *
>          * @param {number} x first component
>          * @param {number} y second component
>          * @param {number} z third component
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setBboxSize(x? : any, y? : any, z? : any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setBboxSize$float$float$float(x, y, z);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setBboxSize$double$double$double(x, y, z);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setBboxSize$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
> undefined && z === undefined) {
>                 return
> <any>this.setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setBboxSize$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setBboxSize$double$double$double(x : number, y : number, z
> : number) : TransformObject {
>             return
> this.setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>         }
>
>         public setBboxSize$double_A(newArray : number[]) : TransformObject
> {
>             return
> this.setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>         }
>
>         /**
>          * Provide array of 3-tuple float results from inputOutput SFVec3f
> field named <i>center</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Translation offset from origin of local
> coordinate system, applied prior to rotation or scaling.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of center field
>          */
>         public getCenter() : number[] {
>             return this.center;
>         }
>
>         public setCenter$float_A(newValue : number[]) : TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 3) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform center newValue=" +
> org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
> length=" + newValue.length + " instead of required length 3");
>             }
>             this.center = newValue;
>             return this;
>         }
>
>         public setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue
> : org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>             this.setCenter$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setCenter$float$float$float(x : number, y : number, z :
> number) : TransformObject {
>             this.setCenter$float_A([x, y, z]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFVec3f center field, similar to {@link
> #setCenter(float[])}.
>          *
>          * @param {number} x first component
>          * @param {number} y second component
>          * @param {number} z third component
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setCenter(x? : any, y? : any, z? : any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setCenter$float$float$float(x, y, z);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setCenter$double$double$double(x, y, z);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setCenter$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
> undefined && z === undefined) {
>                 return
> <any>this.setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setCenter$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setCenter$double$double$double(x : number, y : number, z :
> number) : TransformObject {
>             return
> this.setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>         }
>
>         public setCenter$double_A(newArray : number[]) : TransformObject {
>             return
> this.setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>         }
>
>         /**
>          * Provide array of X3DChildNode results (using an array
> consisting of properly typed nodes or ProtoInstanceObjects) from
> inputOutput MFNode field <i>children</i>.
>          * <br><br>
>          * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an
> ordered list of children nodes.
>          * <ul>
>          * <li> <i>Hint:</i> Each grouping node defines a coordinate space
> for its children, relative to the coordinate space of its parent node. Thus
> transformations accumulate down the scene graph hierarchy. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode addChildren field can append
> new X3DChildNode nodes via a ROUTE connection, duplicate input nodes (i.e.
> matching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
> remove nodes from the children list, unrecognized input nodes (i.e.
> nonmatching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and
> children node types, <a href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
> </li>
>          * </ul>
>          * <br><br>
>          * <i>Warning:</i> according to X3D Unified Object Model (X3DUOM),
> acceptable node types are limited to X3DChildNode.
>          * @see org.web3d.x3d.sai.Core.X3DChildNode
>          * @return {Array} value of children field
>          */
>         public getChildren() : org.web3d.x3d.sai.Core.X3DNode[] {
>             let valuesArray : org.web3d.x3d.sai.Core.X3DNode[] = (s => {
> let a=[]; while(s-->0) a.push(null); return a; })(this.children.size());
>             let i : number = 0;
>             for(let
> index3676=this.children.iterator();index3676.hasNext();) {
>                 let arrayElement = index3676.next();
>                 {
>                     valuesArray[i++] = arrayElement;
>                 }
>             }
>             return valuesArray;
>         }
>
>         /**
>          * Utility method to get ArrayList value of MFNode children field,
> similar to {@link #getChildren()}.
>          * @return {java.util.ArrayList} value of children field
>          */
>         public getChildrenList() :
> java.util.ArrayList<org.web3d.x3d.sai.Core.X3DNode> {
>             return this.children;
>         }
>
>         public setChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue :
> org.web3d.x3d.sai.Core.X3DNode[]) : TransformObject {
>             if(newValue == null) {
>                 this.clearChildren();
>                 return this;
>             }
>             this.clearChildren();
>             for(let i : number = 0; i < newValue.length; i++) {{
>                 if((newValue[i] != null && (newValue[i]["__interfaces"] !=
> null &&
> newValue[i]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
> || newValue[i].constructor != null &&
> newValue[i].constructor["__interfaces"] != null &&
> newValue[i].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)) || (newValue[i] != null && newValue[i] instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)) {
>                     this.children.add(newValue[i]);
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue[i]).setParentObject(this);
>                 } else throw new
> org.web3d.x3d.sai.InvalidFieldValueException("X3DNode[] newValue[" + i + "]
> is not instanceof X3DNode or ProtoInstanceObject; array newValue=" +
> java.util.Arrays.toString(newValue));
>             };}
>             return this;
>         }
>
>         /**
>          * Accessor method to assign X3DChildNode array (using an array
> consisting of properly typed nodes or ProtoInstanceObjects) to inputOutput
> MFNode field <i>children</i>.
>          * <br><br>
>          * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an
> ordered list of children nodes.
>          * <ul>
>          * <li> <i>Hint:</i> Each grouping node defines a coordinate space
> for its children, relative to the coordinate space of its parent node. Thus
> transformations accumulate down the scene graph hierarchy. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode addChildren field can append
> new X3DChildNode nodes via a ROUTE connection, duplicate input nodes (i.e.
> matching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
> remove nodes from the children list, unrecognized input nodes (i.e.
> nonmatching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and
> children node types, <a href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
> </li>
>          * </ul>
>          * <br><br>
>          * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
> acceptable node types are limited to X3DChildNode.
>          * @param {Array} newValue is new value for the children field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setChildren(newValue? : any) : any {
>             if(((newValue != null && newValue instanceof <any>Array &&
> (newValue.length==0 || newValue[0] == null ||(newValue[0] != null &&
> (newValue[0]["__interfaces"] != null &&
> newValue[0]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
> || newValue[0].constructor != null &&
> newValue[0].constructor["__interfaces"] != null &&
> newValue[0].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)))) || newValue === null)) {
>                 return
> <any>this.setChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue);
>             } else if(((newValue != null && newValue instanceof
> <any>java.util.ArrayList) || newValue === null)) {
>                 return <any>this.setChildren$java_util_ArrayList(newValue);
>             } else if(((newValue != null && (newValue["__interfaces"] !=
> null && newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0 || newValue.constructor != null &&
> newValue.constructor["__interfaces"] != null &&
> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)) || newValue === null)) {
>                 return
> <any>this.setChildren$org_web3d_x3d_sai_Core_X3DNode(newValue);
>             } else throw new Error('invalid overload');
>         }
>
>         public setChildren$java_util_ArrayList(newValue :
> java.util.ArrayList<org.web3d.x3d.sai.Core.X3DChildNode>) : TransformObject
> {
>             if(newValue == null) {
>                 this.clearChildren();
>                 return this;
>             }
>             if(newValue.isEmpty()) this.clearChildren(); else {
>                 let newArray : org.web3d.x3d.sai.Core.X3DNode[] = (s => {
> let a=[]; while(s-->0) a.push(null); return a; })(newValue.size());
>                 for(let i : number = 0; i < newValue.size(); i++)
> {newArray[i] = newValue.get(i);}
>
> this.setChildren$org_web3d_x3d_sai_Core_X3DNode_A(newArray);
>             }
>             for(let index3677=newValue.iterator();index3677.hasNext();) {
>                 let element = index3677.next();
>                 {
>
> this.children.add(<org.web3d.x3d.sai.Core.X3DNode><any>element);
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).setParentObject(this);
>                 }
>             }
>             return this;
>         }
>
>         public addChildren$org_web3d_x3d_sai_Core_X3DNode(newValue :
> org.web3d.x3d.sai.Core.X3DNode) {
>             if(newValue == null) return;
>             this.children.add(newValue);
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue).setParentObject(this);
>         }
>
>         public
> addChildren$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue :
> org.web3d.x3d.jsail.Core.ProtoInstanceObject) : TransformObject {
>             if(newValue == null) return this;
>             this.children.add(newValue);
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>newValue).setParentObject(this);
>             return this;
>         }
>
>         /**
>          * Add single ProtoInstanceObject (with appropriate node type and
> containerField value) to MFNode array for children field.
>          * <br><br>
>          * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
> acceptable node types are limited to ShaderPart and ProtoInstance.
>          * @param {org.web3d.x3d.jsail.Core.ProtoInstanceObject} newValue
> is new value to be appended the parts field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public addChildren(newValue? : any) : any {
>             if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject) || newValue === null)) {
>                 return
> <any>this.addChildren$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue);
>             } else if(((newValue != null && (newValue["__interfaces"] !=
> null && newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0 || newValue.constructor != null &&
> newValue.constructor["__interfaces"] != null &&
> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)) || newValue === null)) {
>                 return
> <any>this.addChildren$org_web3d_x3d_sai_Core_X3DNode(newValue);
>             } else if(((newValue != null && newValue instanceof <any>Array
> && (newValue.length==0 || newValue[0] == null ||(newValue[0] != null &&
> (newValue[0]["__interfaces"] != null &&
> newValue[0]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
> || newValue[0].constructor != null &&
> newValue[0].constructor["__interfaces"] != null &&
> newValue[0].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)))) || newValue === null)) {
>                 return
> <any>this.addChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue);
>             } else throw new Error('invalid overload');
>         }
>
>         /**
>          * Utility method to add single child element to contained list of
> existing children nodes (if any).
>          * @param {*} newValue is new node value to be appended the
> children field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public addChild(newValue : org.web3d.x3d.sai.Core.X3DChildNode) :
> TransformObject {
>             if(newValue == null) return this;
>             this.children.add(newValue);
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue).setParentObject(this);
>             if(newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)
> (<org.web3d.x3d.jsail.Core.ProtoInstanceObject><any>newValue).setContainerField("children");
>             return this;
>         }
>
>         public addChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue :
> org.web3d.x3d.sai.Core.X3DNode[]) {
>             if(newValue == null) return;
>             for(let i : number = 0; i < newValue.length; i++) {{
>                 if((newValue[i] != null && (newValue[i]["__interfaces"] !=
> null &&
> newValue[i]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
> || newValue[i].constructor != null &&
> newValue[i].constructor["__interfaces"] != null &&
> newValue[i].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)) || (newValue[i] != null && newValue[i] instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)) {
>                     this.children.add(newValue[i]);
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue[i]).setParentObject(this);
>                     if(newValue[i] != null && newValue[i] instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)
> (<org.web3d.x3d.jsail.Core.ProtoInstanceObject><any>newValue[i]).setContainerField("children");
>                 } else throw new
> org.web3d.x3d.sai.InvalidFieldValueException("X3DNode[] newValue[" + i + "]
> is not instanceof X3DNode or ProtoInstanceObject, array newValue=" +
> java.util.Arrays.toString(newValue));
>             };}
>         }
>
>         public setChildren$org_web3d_x3d_sai_Core_X3DNode(newValue :
> org.web3d.x3d.sai.Core.X3DNode) {
>             if(newValue == null) {
>                 this.clearChildren();
>                 return;
>             }
>             if(newValue != null && (newValue["__interfaces"] != null &&
> newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0 ||
> newValue.constructor != null && newValue.constructor["__interfaces"] !=
> null &&
> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
> >= 0)) {
>                 for(let
> index3678=this.children.iterator();index3678.hasNext();) {
>                     let element = index3678.next();
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).clearParentObject()
>                 }
>                 this.clearChildren();
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue).setParentObject(this);
>                 this.children.add(newValue);
>             } else throw new
> org.web3d.x3d.sai.InvalidFieldValueException("X3DNode newValue is not
> instanceof X3DNode; newValue=" + newValue);
>         }
>
>         /**
>          * Utility method to clear MFNode value of children field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive
>          * setAttribute method invocations).
>          */
>         public clearChildren() : TransformObject {
>             for(let
> index3679=this.children.iterator();index3679.hasNext();) {
>                 let element = index3679.next();
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).clearParentObject()
>             }
>             this.children.clear();
>             return this;
>         }
>
>         /**
>          * Indicate whether an object is available for inputOutput MFNode
> field <i>children</i>.
>          * @return {boolean} whether a properly typed node or
> ProtoInstance array or CommentsBlock is available.
>          * @see #getChildren()
>          */
>         public hasChildren() : boolean {
>             return (!this.children.isEmpty());
>         }
>
>         public addComments$java_lang_String(newComment : string) :
> TransformObject {
>             if(newComment == null) return this;
>             this.children.add(new
> org.web3d.x3d.jsail.Core.CommentsBlock(newComment));
>             return this;
>         }
>
>         /**
>          * Add comment as CommentsBlock to children field
>          * @param {string} newComment initial value
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive
>          * setAttribute method invocations).
>          */
>         public addComments(newComment? : any) : any {
>             if(((typeof newComment === 'string') || newComment === null)) {
>                 return <any>this.addComments$java_lang_String(newComment);
>             } else if(((newComment != null && newComment instanceof
> <any>Array && (newComment.length==0 || newComment[0] == null ||(typeof
> newComment[0] === 'string'))) || newComment === null)) {
>                 return
> <any>this.addComments$java_lang_String_A(newComment);
>             } else if(((newComment != null && newComment instanceof
> <any>org.web3d.x3d.jsail.Core.CommentsBlock) || newComment === null)) {
>                 return
> <any>this.addComments$org_web3d_x3d_jsail_Core_CommentsBlock(newComment);
>             } else if(((typeof newComment === 'string') || newComment ===
> null)) {
>                  throw new Error('cannot invoke abstract overloaded
> method... check your argument(s) type(s)');
>             } else if(((newComment != null && newComment instanceof
> <any>Array && (newComment.length==0 || newComment[0] == null ||(typeof
> newComment[0] === 'string'))) || newComment === null)) {
>                 return
> <any>this.addComments$java_lang_String_A(newComment);
>             } else if(((newComment != null && newComment instanceof
> <any>org.web3d.x3d.jsail.Core.CommentsBlock) || newComment === null)) {
>                 return
> <any>this.addComments$org_web3d_x3d_jsail_Core_CommentsBlock(newComment);
>             } else throw new Error('invalid overload');
>         }
>
>         public addComments$java_lang_String_A(newComments : string[]) :
> TransformObject {
>             if(newComments == null) return this;
>             this.children.add(new
> org.web3d.x3d.jsail.Core.CommentsBlock(newComments));
>             return this;
>         }
>
>         public
> addComments$org_web3d_x3d_jsail_Core_CommentsBlock(newCommentsBlock :
> org.web3d.x3d.jsail.Core.CommentsBlock) : TransformObject {
>             if(newCommentsBlock == null) return this;
>             this.children.add(newCommentsBlock);
>             return this;
>         }
>
>         /**
>          * Provide ISObject instance (using a properly typed node) from
> inputOutput SFNode field <i>IS</i>.
>          * @return {org.web3d.x3d.jsail.Core.ISObject} value of IS field
>          */
>         public getIS() : org.web3d.x3d.jsail.Core.ISObject {
>             return this.IS;
>         }
>
>         /**
>          * Accessor method to assign ISObject instance (using a properly
> typed node) to inputOutput SFNode field <i>IS</i>.
>          * @param {org.web3d.x3d.jsail.Core.ISObject} newValue is new
> value for the IS field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setIS(newValue : org.web3d.x3d.jsail.Core.ISObject) :
> TransformObject {
>             this.IS = newValue;
>             if(newValue != null) {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).setParentObject(this);
>             }
>             return this;
>         }
>
>         /**
>          * Utility method to clear SFNode value of IS field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive
>          * setAttribute method invocations).
>          */
>         public clearIS() : TransformObject {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).clearParentObject();
>             this.IS = null;
>             return this;
>         }
>
>         /**
>          * Indicate whether an object is available for inputOutput SFNode
> field <i>IS</i>.
>          * @return {boolean} whether a concrete statement or CommentsBlock
> is available.
>          * @see #getIS()
>          */
>         public hasIS() : boolean {
>             return (this.IS != null);
>         }
>
>         /**
>          * Provide X3DMetadataObject instance (using a properly typed
> node) from inputOutput SFNode field <i>metadata</i>.
>          * @see #getMetadataProtoInstance()
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>          * @return {*} value of metadata field
>          */
>         public getMetadata() : org.web3d.x3d.sai.Core.X3DMetadataObject {
>             return this.metadata;
>         }
>
>         public
> setMetadata$org_web3d_x3d_sai_Core_X3DMetadataObject(newValue :
> org.web3d.x3d.sai.Core.X3DMetadataObject) : TransformObject {
>             this.metadata = newValue;
>             if(newValue != null) {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).setParentObject(this);
>             }
>             if(this.metadataProtoInstance != null) {
>                 this.metadataProtoInstance.setParentObject(null);
>                 this.metadataProtoInstance = null;
>             }
>             return this;
>         }
>
>         /**
>          * Accessor method to assign X3DMetadataObject instance (using a
> properly typed node) to inputOutput SFNode field <i>metadata</i>.
>          * @see #setMetadata(ProtoInstanceObject)
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>          * @param {*} newValue is new value for the metadata field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setMetadata(newValue? : any) : any {
>             if(((newValue != null && (newValue["__interfaces"] != null &&
> newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
> >= 0 || newValue.constructor != null &&
> newValue.constructor["__interfaces"] != null &&
> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
> >= 0)) || newValue === null)) {
>                 return
> <any>this.setMetadata$org_web3d_x3d_sai_Core_X3DMetadataObject(newValue);
>             } else if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject) || newValue === null)) {
>                 return
> <any>this.setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue);
>             } else if(((newValue != null && (newValue["__interfaces"] !=
> null &&
> newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
> >= 0 || newValue.constructor != null &&
> newValue.constructor["__interfaces"] != null &&
> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
> >= 0)) || newValue === null)) {
>                  throw new Error('cannot invoke abstract overloaded
> method... check your argument(s) type(s)');
>             } else if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject) || newValue === null)) {
>                 return
> <any>this.setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue);
>             } else throw new Error('invalid overload');
>         }
>
>         /**
>          * Utility method to clear SFNode value of metadata field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive
>          * setAttribute method invocations).
>          */
>         public clearMetadata() : TransformObject {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).clearParentObject();
>             this.metadata = null;
>             return this;
>         }
>
>         public
> setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue :
> org.web3d.x3d.jsail.Core.ProtoInstanceObject) : TransformObject {
>             if(this.metadataProtoInstance != null) {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).setParentObject(null);
>             }
>             this.metadataProtoInstance = newValue;
>             if(newValue != null) {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).setParentObject(this);
>                 this.metadataProtoInstance.setContainerField("metadata");
>             }
>             if(this.metadata != null) {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).setParentObject(null);
>                 this.metadata = null;
>             }
>             return this;
>         }
>
>         /**
>          * Private utility method to access SFNode ProtoInstance field
>          * @return {org.web3d.x3d.jsail.Core.ProtoInstanceObject}
>          * @private
>          */
>         /*private*/ getMetadataProtoInstance() :
> org.web3d.x3d.jsail.Core.ProtoInstanceObject {
>             return this.metadataProtoInstance;
>         }
>
>         /**
>          * Indicate whether an object is available for inputOutput SFNode
> field <i>metadata</i>.
>          * @return {boolean} whether a properly typed node or
> ProtoInstance or CommentsBlock is available.
>          * @see #getMetadata()
>          * @see #getMetadataProtoInstance()
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>          */
>         public hasMetadata() : boolean {
>             return (this.metadata != null) || (this.metadataProtoInstance
> != null);
>         }
>
>         /**
>          * Provide array of 4-tuple float results unit axis, angle (in
> radians) from inputOutput SFRotation field named <i>rotation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Orientation (axis, angle in radians) of
> children relative to local coordinate system.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of rotation field
>          */
>         public getRotation() : number[] {
>             return this.rotation;
>         }
>
>         public setRotation$float_A(newValue : number[]) : TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 4) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform rotation newValue="
> + org.web3d.x3d.jsail.fields.SFRotationObject.toString(newValue) + " has
> length=" + newValue.length + " instead of required length 4");
>             }
>             this.rotation = newValue;
>             return this;
>         }
>
>         public
> setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(newValue :
> org.web3d.x3d.jsail.fields.SFRotationObject) : TransformObject {
>             this.setRotation$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setRotation$float$float$float$float(x : number, y : number,
> z : number, angleRadians : number) : TransformObject {
>             this.setRotation$float_A([x, y, z, angleRadians]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFRotation rotation field, similar to {@link
> #setRotation(float[])}.
>          *
>          * @param {number} x first component of axis
>          * @param {number} y second component of axis
>          * @param {number} z third component of axis
>          * @param {number} angleRadians fourth component of rotation
> around axis
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setRotation(x? : any, y? : any, z? : any, angleRadians? :
> any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null) &&
> ((typeof angleRadians === 'number') || angleRadians === null)) {
>                 return <any>this.setRotation$float$float$float$float(x, y,
> z, angleRadians);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)
> && ((typeof angleRadians === 'number') || angleRadians === null)) {
>                 return
> <any>this.setRotation$double$double$double$double(x, y, z, angleRadians);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined && angleRadians === undefined) {
>                 return <any>this.setRotation$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFRotationObject) || x === null) && y ===
> undefined && z === undefined && angleRadians === undefined) {
>                 return
> <any>this.setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined && angleRadians === undefined) {
>                 return <any>this.setRotation$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setRotation$double$double$double$double(x : number, y :
> number, z : number, angleRadians : number) : TransformObject {
>             return
> this.setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(new
> org.web3d.x3d.jsail.fields.SFRotationObject(x, y, z, angleRadians));
>         }
>
>         public setRotation$double_A(newArray : number[]) : TransformObject
> {
>             return
> this.setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(new
> org.web3d.x3d.jsail.fields.SFRotationObject(newArray));
>         }
>
>         /**
>          * Provide array of 3-tuple float results from inputOutput SFVec3f
> field named <i>scale</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Non-uniform x-y-z scale of child coordinate
> system, adjusted by center and scaleOrientation.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of scale field
>          */
>         public getScale() : number[] {
>             return this.scale;
>         }
>
>         public setScale$float_A(newValue : number[]) : TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 3) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform scale newValue=" +
> org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
> length=" + newValue.length + " instead of required length 3");
>             }
>             this.scale = newValue;
>             return this;
>         }
>
>         public setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue
> : org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>             this.setScale$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setScale$float$float$float(x : number, y : number, z :
> number) : TransformObject {
>             this.setScale$float_A([x, y, z]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFVec3f scale field, similar to {@link
> #setScale(float[])}.
>          *
>          * @param {number} x first component
>          * @param {number} y second component
>          * @param {number} z third component
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setScale(x? : any, y? : any, z? : any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setScale$float$float$float(x, y, z);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setScale$double$double$double(x, y, z);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setScale$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
> undefined && z === undefined) {
>                 return
> <any>this.setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setScale$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setScale$double$double$double(x : number, y : number, z :
> number) : TransformObject {
>             return
> this.setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>         }
>
>         public setScale$double_A(newArray : number[]) : TransformObject {
>             return
> this.setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>         }
>
>         /**
>          * Provide array of 4-tuple float results unit axis, angle (in
> radians) from inputOutput SFRotation field named <i>scaleOrientation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Preliminary rotation of coordinate system
> before scaling (to allow scaling around arbitrary orientations).
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of scaleOrientation field
>          */
>         public getScaleOrientation() : number[] {
>             return this.scaleOrientation;
>         }
>
>         public setScaleOrientation$float_A(newValue : number[]) :
> TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 4) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform scaleOrientation
> newValue=" + org.web3d.x3d.jsail.fields.SFRotationObject.toString(newValue)
> + " has length=" + newValue.length + " instead of required length 4");
>             }
>             this.scaleOrientation = newValue;
>             return this;
>         }
>
>         public
> setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(newValue :
> org.web3d.x3d.jsail.fields.SFRotationObject) : TransformObject {
>             this.setScaleOrientation$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setScaleOrientation$float$float$float$float(x : number, y :
> number, z : number, angleRadians : number) : TransformObject {
>             this.setScaleOrientation$float_A([x, y, z, angleRadians]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFRotation scaleOrientation field, similar to
> {@link #setScaleOrientation(float[])}.
>          *
>          * @param {number} x first component of axis
>          * @param {number} y second component of axis
>          * @param {number} z third component of axis
>          * @param {number} angleRadians fourth component of rotation
> around axis
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setScaleOrientation(x? : any, y? : any, z? : any,
> angleRadians? : any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null) &&
> ((typeof angleRadians === 'number') || angleRadians === null)) {
>                 return
> <any>this.setScaleOrientation$float$float$float$float(x, y, z,
> angleRadians);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)
> && ((typeof angleRadians === 'number') || angleRadians === null)) {
>                 return
> <any>this.setScaleOrientation$double$double$double$double(x, y, z,
> angleRadians);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined && angleRadians === undefined) {
>                 return <any>this.setScaleOrientation$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFRotationObject) || x === null) && y ===
> undefined && z === undefined && angleRadians === undefined) {
>                 return
> <any>this.setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined && angleRadians === undefined) {
>                 return <any>this.setScaleOrientation$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setScaleOrientation$double$double$double$double(x : number,
> y : number, z : number, angleRadians : number) : TransformObject {
>             return
> this.setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(new
> org.web3d.x3d.jsail.fields.SFRotationObject(x, y, z, angleRadians));
>         }
>
>         public setScaleOrientation$double_A(newArray : number[]) :
> TransformObject {
>             return
> this.setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(new
> org.web3d.x3d.jsail.fields.SFRotationObject(newArray));
>         }
>
>         /**
>          * Provide array of 3-tuple float results from inputOutput SFVec3f
> field named <i>translation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Position (x, y, z in meters) of children
> relative to local coordinate system.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of translation field
>          */
>         public getTranslation() : number[] {
>             return this.translation;
>         }
>
>         public setTranslation$float_A(newValue : number[]) :
> TransformObject {
>             if(newValue == null) newValue = [];
>             if(newValue.length !== 3) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform translation
> newValue=" + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) +
> " has length=" + newValue.length + " instead of required length 3");
>             }
>             this.translation = newValue;
>             return this;
>         }
>
>         public
> setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>             this.setTranslation$float_A(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setTranslation$float$float$float(x : number, y : number, z
> : number) : TransformObject {
>             this.setTranslation$float_A([x, y, z]);
>             return this;
>         }
>
>         /**
>          * Assign values to SFVec3f translation field, similar to {@link
> #setTranslation(float[])}.
>          *
>          * @param {number} x first component
>          * @param {number} y second component
>          * @param {number} z third component
>          *
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setTranslation(x? : any, y? : any, z? : any) : any {
>             if(((typeof x === 'number') || x === null) && ((typeof y ===
> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setTranslation$float$float$float(x, y, z);
>             } else if(((typeof x === 'number') || x === null) && ((typeof
> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>                 return <any>this.setTranslation$double$double$double(x, y,
> z);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setTranslation$float_A(x);
>             } else if(((x != null && x instanceof
> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
> undefined && z === undefined) {
>                 return
> <any>this.setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>             } else if(((x != null && x instanceof <any>Array &&
> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
> && y === undefined && z === undefined) {
>                 return <any>this.setTranslation$double_A(x);
>             } else throw new Error('invalid overload');
>         }
>
>         public setTranslation$double$double$double(x : number, y : number,
> z : number) : TransformObject {
>             return
> this.setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>         }
>
>         public setTranslation$double_A(newArray : number[]) :
> TransformObject {
>             return
> this.setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(new
> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>         }
>
>         /**
>          * Provide String value from inputOutput SFString field named
> <i>DEF</i>.
>          * <br><br>
>          * <i>Tooltip:</i> DEF defines a unique ID name for this node,
> referenceable by other nodes.
>          * <ul>
>          * <li> <i>Hint:</i> descriptive DEF names improve clarity and
> help document a model. </li>
>          * <li> <i>Hint:</i> well-defined names can simplify design and
> debugging through improved author understanding. </li>
>          * <li> <i>Hint:</i>  X3D Scene Authoring Hints, Naming
> Conventions <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions"
> target="_blank">
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions</a>
> </li>
>          * </ul>
>          * @return {string} value of DEF field
>          */
>         public getDEF() : string {
>             return super.getDEF();
>         }
>
>         public setDEF$java_lang_String(newValue : string) :
> TransformObject {
>             if(newValue == null) newValue = <string>new String();
>             if(!/* isEmpty */(newValue.length === 0) &&
> !org.web3d.x3d.jsail.fields.SFStringObject.isNMTOKEN(newValue)) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform DEF newValue=\'" +
> newValue + "\' has illegal name value, cannot be empty and must be defined
> with valid NMTOKEN name string (with legal characters and no embedded
> whitespace).");
>             }
>             this.setConcreteUSE("");
>             this.setConcreteDEF(newValue);
>             return this;
>         }
>
>         /**
>          * Accessor method to assign String value to inputOutput SFString
> field named <i>DEF</i>.
>          * <br><br>
>          * <i>Tooltip:</i> DEF defines a unique ID name for this node,
> referenceable by other nodes.
>          * <ul>
>          * <li> <i>Hint:</i> descriptive DEF names improve clarity and
> help document a model. </li>
>          * <li> <i>Hint:</i> well-defined names can simplify design and
> debugging through improved author understanding. </li>
>          * <li> <i>Hint:</i>  X3D Scene Authoring Hints, Naming
> Conventions <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions"
> target="_blank">
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions</a>
> </li>
>          * </ul>
>          * <br><br>
>          * Note that setting the DEF value clears the USE value.
>          * @param {string} newValue is new value for the DEF field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setDEF(newValue? : any) : any {
>             if(((typeof newValue === 'string') || newValue === null)) {
>                 return <any>this.setDEF$java_lang_String(newValue);
>             } else if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.fields.SFStringObject) || newValue === null)) {
>                 return
> <any>this.setDEF$org_web3d_x3d_jsail_fields_SFStringObject(newValue);
>             } else if(((typeof newValue === 'string') || newValue ===
> null)) {
>                  throw new Error('cannot invoke abstract overloaded
> method... check your argument(s) type(s)');
>             } else throw new Error('invalid overload');
>         }
>
>         public setDEF$org_web3d_x3d_jsail_fields_SFStringObject(newValue :
> org.web3d.x3d.jsail.fields.SFStringObject) : TransformObject {
>             this.setDEF$java_lang_String(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         /**
>          * Provide String value from inputOutput SFString field named
> <i>USE</i>.
>          * <br><br>
>          * <i>Tooltip:</i> USE means reuse an already DEF-ed node ID,
> excluding all child nodes and all other attributes (except for
> containerField, which can have a different value).
>          * <ul>
>          * <li> <i>Hint:</i> USE references to previously defined DEF
> geometry (instead of duplicating nodes) can improve performance. </li>
>          * <li> <i>Warning:</i> do NOT include any child nodes, a DEF
> attribute, or any other attribute values (except for containerField) when
> defining a USE attribute. </li>
>          * <li> <i>Warning:</i>  each USE value must match a corresponding
> DEF value that is defined earlier in the scene. </li>
>          * </ul>
>          * @return {string} value of USE field
>          */
>         public getUSE() : string {
>             return super.getUSE();
>         }
>
>         public setUSE$java_lang_String(newValue : string) :
> TransformObject {
>             if(newValue == null) newValue = <string>new String();
>             if(!/* isEmpty */(newValue.length === 0) &&
> !org.web3d.x3d.jsail.fields.SFStringObject.isNMTOKEN(newValue)) {
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException("Transform USE newValue=\'" +
> newValue + "\' has illegal name value, cannot be empty and must be defined
> with valid NMTOKEN name string (with legal characters and no embedded
> whitespace).");
>             }
>             this.setConcreteDEF("");
>             this.setConcreteUSE(newValue);
>             return this;
>         }
>
>         /**
>          * Accessor method to assign String value to inputOutput SFString
> field named <i>USE</i>.
>          * <br><br>
>          * <i>Tooltip:</i> USE means reuse an already DEF-ed node ID,
> excluding all child nodes and all other attributes (except for
> containerField, which can have a different value).
>          * <ul>
>          * <li> <i>Hint:</i> USE references to previously defined DEF
> geometry (instead of duplicating nodes) can improve performance. </li>
>          * <li> <i>Warning:</i> do NOT include any child nodes, a DEF
> attribute, or any other attribute values (except for containerField) when
> defining a USE attribute. </li>
>          * <li> <i>Warning:</i>  each USE value must match a corresponding
> DEF value that is defined earlier in the scene. </li>
>          * </ul>
>          * <br><br>
>          * <i>Note:</i> each <code>USE</code> node is still an independent
> object, with the <code>USE</code> value matching the <code>DEF</code> value
> in the preceding object.
>          * <br><br>
>          * <i>Warning:</i> invoking the <code>setUSE()</code> method on
> this node resets all other fields to their default values (except for
> containerField) and also releases all child nodes.<br><br>
>          * <i>Warning:</i> no other operations can be performed to modify
> a USE node other than setting an alternate containerField value.
>          * @param {string} newValue is new value for the USE field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setUSE(newValue? : any) : any {
>             if(((typeof newValue === 'string') || newValue === null)) {
>                 return <any>this.setUSE$java_lang_String(newValue);
>             } else if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.fields.SFStringObject) || newValue === null)) {
>                 return
> <any>this.setUSE$org_web3d_x3d_jsail_fields_SFStringObject(newValue);
>             } else if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.Grouping.TransformObject) || newValue === null)) {
>                 return
> <any>this.setUSE$org_web3d_x3d_jsail_Grouping_TransformObject(newValue);
>             } else if(((typeof newValue === 'string') || newValue ===
> null)) {
>                  throw new Error('cannot invoke abstract overloaded
> method... check your argument(s) type(s)');
>             } else throw new Error('invalid overload');
>         }
>
>         public setUSE$org_web3d_x3d_jsail_fields_SFStringObject(newValue :
> org.web3d.x3d.jsail.fields.SFStringObject) : TransformObject {
>             this.setUSE$java_lang_String(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         /**
>          * Provide String value from inputOutput SFString field named
> <i>class</i>.
>          * <br><br>
>          * <i>Tooltip:</i> The class attribute is a space-separated list
> of classes, reserved for use by CSS cascading stylesheets.
>          * <ul>
>          * <li> <i>Warning:</i> currently the class attribute is only
> supported in XML encoding of X3D scenes. </li>
>          * <li> <i>Hint:</i>  W3C Cascading Style Sheets <a href="
> https://www.w3.org/Style/CSS" target="_blank">https://www.w3.org/Style/CSS</a>
> </li>
>          * </ul>
>          * @return {string} value of class field
>          */
>         public getCssClass() : string {
>             return super.getCssClass();
>         }
>
>         public setCssClass$java_lang_String(newValue : string) :
> TransformObject {
>             if(newValue == null) newValue = <string>new String();
>             this.setConcreteCssClass(newValue);
>             return this;
>         }
>
>         /**
>          * Accessor method to assign String value to inputOutput SFString
> field named <i>class</i>.
>          * <br><br>
>          * <i>Tooltip:</i> The class attribute is a space-separated list
> of classes, reserved for use by CSS cascading stylesheets.
>          * <ul>
>          * <li> <i>Warning:</i> currently the class attribute is only
> supported in XML encoding of X3D scenes. </li>
>          * <li> <i>Hint:</i>  W3C Cascading Style Sheets <a href="
> https://www.w3.org/Style/CSS" target="_blank">https://www.w3.org/Style/CSS</a>
> </li>
>          * </ul>
>          * @param {string} newValue is new value for the class field.
>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
> TransformObject} - namely <i>this</i> same object to allow sequential
> method pipelining (i.e. consecutive method invocations on the same object).
>          */
>         public setCssClass(newValue? : any) : any {
>             if(((typeof newValue === 'string') || newValue === null)) {
>                 return <any>this.setCssClass$java_lang_String(newValue);
>             } else if(((newValue != null && newValue instanceof
> <any>org.web3d.x3d.jsail.fields.SFStringObject) || newValue === null)) {
>                 return
> <any>this.setCssClass$org_web3d_x3d_jsail_fields_SFStringObject(newValue);
>             } else if(((typeof newValue === 'string') || newValue ===
> null)) {
>                  throw new Error('cannot invoke abstract overloaded
> method... check your argument(s) type(s)');
>             } else throw new Error('invalid overload');
>         }
>
>         public
> setCssClass$org_web3d_x3d_jsail_fields_SFStringObject(newValue :
> org.web3d.x3d.jsail.fields.SFStringObject) : TransformObject {
>
> this.setCssClass$java_lang_String(newValue.getPrimitiveValue());
>             return this;
>         }
>
>         public setUSE$org_web3d_x3d_jsail_Grouping_TransformObject(DEFnode
> : TransformObject) : TransformObject {
>             if(/* isEmpty */(DEFnode.getDEF().length === 0)) {
>                 let errorNotice : string = "setUSE(DEFnode) invoked on
> TransformObject that has no DEF name defined, thus a copy cannot be
> referenced as a USE node";
>                 this.validationResult.append(errorNotice).append("\n");
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>             }
>             this.setUSE$java_lang_String(DEFnode.getDEF());
>             return this;
>         }
>
>         public constructor(DEFlabel? : any) {
>             if(((typeof DEFlabel === 'string') || DEFlabel === null)) {
>                 let __args = arguments;
>                 super();
>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>                 if(this.bboxSize===undefined) this.bboxSize = null;
>                 if(this.center===undefined) this.center = null;
>                 if(this.IS===undefined) this.IS = null;
>                 if(this.metadata===undefined) this.metadata = null;
>                 if(this.metadataProtoInstance===undefined)
> this.metadataProtoInstance = null;
>                 if(this.rotation===undefined) this.rotation = null;
>                 if(this.scale===undefined) this.scale = null;
>                 if(this.scaleOrientation===undefined)
> this.scaleOrientation = null;
>                 if(this.translation===undefined) this.translation = null;
>                 this.children = <any>(new java.util.ArrayList<any>());
>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>                 if(this.bboxSize===undefined) this.bboxSize = null;
>                 if(this.center===undefined) this.center = null;
>                 if(this.IS===undefined) this.IS = null;
>                 if(this.metadata===undefined) this.metadata = null;
>                 if(this.metadataProtoInstance===undefined)
> this.metadataProtoInstance = null;
>                 if(this.rotation===undefined) this.rotation = null;
>                 if(this.scale===undefined) this.scale = null;
>                 if(this.scaleOrientation===undefined)
> this.scaleOrientation = null;
>                 if(this.translation===undefined) this.translation = null;
>                 (() => {
>                     this.initialize();
>                     this.setDEF$java_lang_String(DEFlabel);
>                 })();
>             } else if(DEFlabel === undefined) {
>                 let __args = arguments;
>                 super();
>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>                 if(this.bboxSize===undefined) this.bboxSize = null;
>                 if(this.center===undefined) this.center = null;
>                 if(this.IS===undefined) this.IS = null;
>                 if(this.metadata===undefined) this.metadata = null;
>                 if(this.metadataProtoInstance===undefined)
> this.metadataProtoInstance = null;
>                 if(this.rotation===undefined) this.rotation = null;
>                 if(this.scale===undefined) this.scale = null;
>                 if(this.scaleOrientation===undefined)
> this.scaleOrientation = null;
>                 if(this.translation===undefined) this.translation = null;
>                 this.children = <any>(new java.util.ArrayList<any>());
>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>                 if(this.bboxSize===undefined) this.bboxSize = null;
>                 if(this.center===undefined) this.center = null;
>                 if(this.IS===undefined) this.IS = null;
>                 if(this.metadata===undefined) this.metadata = null;
>                 if(this.metadataProtoInstance===undefined)
> this.metadataProtoInstance = null;
>                 if(this.rotation===undefined) this.rotation = null;
>                 if(this.scale===undefined) this.scale = null;
>                 if(this.scaleOrientation===undefined)
> this.scaleOrientation = null;
>                 if(this.translation===undefined) this.translation = null;
>                 (() => {
>                     this.initialize();
>                 })();
>             } else throw new Error('invalid overload');
>         }
>
>         public toStringX3D$int(indentLevel : number) : string {
>             let hasAttributes : boolean = true;
>             let hasChild : boolean = (this.IS != null) ||
> (!this.children.isEmpty()) || (this.IS != null) || (this.metadata != null)
> || (this.metadataProtoInstance != null);
>             if(this.isUSE()) hasChild = false;
>             let indent : java.lang.StringBuilder = new
> java.lang.StringBuilder();
>             let indentIncrement : number =
> org.web3d.x3d.jsail.ConfigurationProperties.getIndentIncrement();
>             let indentCharacter : string =
> org.web3d.x3d.jsail.ConfigurationProperties.getIndentCharacter();
>             for(let i : number = 0; i < indentLevel; i++)
> {indent.append(indentCharacter);}
>             let stringX3D : java.lang.StringBuilder = new
> java.lang.StringBuilder();
>             stringX3D.append(indent).append("<Transform");
>             if(hasAttributes) {
>                 if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getDEF(),org.web3d.x3d.jsail.X3DConcreteNode.DEF_DEFAULT_VALUE)) &&
> !this.isUSE()) {
>                     stringX3D.append("
> DEF=\'").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getDEF())).append("\'");
>                 }
>                 if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getUSE(),org.web3d.x3d.jsail.X3DConcreteNode.USE_DEFAULT_VALUE))) {
>                     stringX3D.append("
> USE=\'").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getUSE())).append("\'");
>                 }
>                 if(!/* isEmpty */(this.getContainerFieldOverride().length
> === 0) && !/* equals */(<any>((o1: any, o2: any) => { if(o1 && o1.equals) {
> return o1.equals(o2); } else { return o1 === o2; }
> })(this.getContainerFieldOverride(),this.getContainerFieldDefault()))) {
>                     stringX3D.append("
> containerField=\'").append(this.getContainerFieldOverride()).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getBboxCenter(),
> TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> bboxCenter=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxCenter())).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getBboxSize(),
> TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> bboxSize=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxSize())).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getCenter(),
> TransformObject.CENTER_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> center=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getCenter())).append("\'");
>                 }
>                 if((!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getCssClass(),org.web3d.x3d.jsail.X3DConcreteNode.CLASS_DEFAULT_VALUE))
> || org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes())
> && !this.isUSE()) {
>                     stringX3D.append(" class=\'").append(new
> org.web3d.x3d.jsail.fields.SFStringObject(this.getCssClass()).toStringX3D()).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getRotation(),
> TransformObject.ROTATION_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> rotation=\'").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getRotation())).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getScale(),
> TransformObject.SCALE_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> scale=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getScale())).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getScaleOrientation(),
> TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> scaleOrientation=\'").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getScaleOrientation())).append("\'");
>                 }
>                 if((!java.util.Arrays.equals(this.getTranslation(),
> TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
> !this.isUSE()) {
>                     stringX3D.append("
> translation=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getTranslation())).append("\'");
>                 }
>             }
>             if((hasChild) && !this.isUSE()) {
>                 stringX3D.append(">").append("\n");
>                 if(this.metadata != null) {
>
> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).toStringX3D$int(indentLevel
> + indentIncrement));
>                 } else if(this.metadataProtoInstance != null) {
>
> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).toStringX3D$int(indentLevel
> + indentIncrement));
>                 }
>                 if(this.IS != null) {
>
> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).toStringX3D$int(indentLevel
> + indentIncrement));
>                 }
>                 for(let
> index3680=this.children.iterator();index3680.hasNext();) {
>                     let element = index3680.next();
>                     {
>
> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>element).toStringX3D$int(indentLevel
> + indentIncrement));
>                     }
>                 }
>
> stringX3D.append(indent).append("</Transform>").append("\n");
>             } else {
>                 stringX3D.append("/>").append("\n");
>             }
>             return stringX3D.toString();
>         }
>
>         /**
>          * Recursive method to provide X3D string serialization of this
> model subgraph, utilizing XML encoding and conforming to X3D Canonical Form.
>          * @param {number} indentLevel number of levels of indentation for
> this element
>          * @see X3DObject#FILE_EXTENSION_X3D
>          * @see X3DObject#FILE_EXTENSION_XML
>          * @see X3DObject#toStringXML()
>          * @see X3DObject#toFileXML(String)
>          * @see X3DObject#toFileX3D(String)
>          * @see <a href="
> https://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/X3D_XML.html">X3D
> XML Encoding</a>
>          * @see <a href="
> https://www.web3d.org/documents/specifications/19776-3/V3.3/Part03/concepts.html#X3DCanonicalForm"
> target="blank">X3D Compressed Binary Encoding: X3D Canonical Form</a>
>          * @see <a href="
> https://www.web3d.org/x3d/tools/canonical/doc/x3dTools.htm">X3D
> Canonicalization (C14N) Tool</a>
>          * @return {string} X3D string
>          */
>         public toStringX3D(indentLevel? : any) : any {
>             if(((typeof indentLevel === 'number') || indentLevel ===
> null)) {
>                 return <any>this.toStringX3D$int(indentLevel);
>             } else if(indentLevel === undefined) {
>                 return <any>this.toStringX3D$();
>             } else throw new Error('invalid overload');
>         }
>
>         public toStringClassicVRML$int(indentLevel : number) : string {
>             let stringClassicVRML : java.lang.StringBuilder = new
> java.lang.StringBuilder();
>             let hasAttributes : boolean = true;
>             let hasChild : boolean = (this.IS != null) ||
> (!this.children.isEmpty()) || (this.IS != null) || (this.metadata != null)
> || (this.metadataProtoInstance != null);
>             if(this.isUSE()) {
>                 hasAttributes = false;
>                 hasChild = false;
>             }
>             let indent : java.lang.StringBuilder = new
> java.lang.StringBuilder();
>             let indentCharacter : string =
> org.web3d.x3d.jsail.ConfigurationProperties.getIndentCharacter();
>             let indentIncrement : number =
> org.web3d.x3d.jsail.ConfigurationProperties.getIndentIncrement();
>             for(let i : number = 0; i < indentLevel; i++)
> {indent.append(indentCharacter);}
>             if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getDEF(),org.web3d.x3d.jsail.X3DConcreteNode.DEF_DEFAULT_VALUE))) {
>                 stringClassicVRML.append("DEF
> ").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getDEF())).append("
> ");
>             }
>             if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getUSE(),org.web3d.x3d.jsail.X3DConcreteNode.USE_DEFAULT_VALUE))) {
>                 stringClassicVRML.append("USE
> ").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getUSE())).append("\n");
>             } else {
>                 stringClassicVRML.append("Transform").append(" { ");
>                 if(hasAttributes || hasChild) {
>
> stringClassicVRML.append("\n").append(indent).append(indentCharacter);
>                 }
>                 if(hasAttributes) {
>                     let hasISconnect : boolean = (this.getIS() != null) &&
> !this.getIS().getConnectList().isEmpty();
>                     if(hasISconnect) {
>                         for(let
> index3681=this.getIS().getConnectList().iterator();index3681.hasNext();) {
>                             let element = index3681.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"bboxCenter"))) {
>
> stringClassicVRML.append(indentCharacter).append("bboxCenter").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else
> if(!java.util.Arrays.equals(this.getBboxCenter(),
> TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("bboxCenter
> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxCenter())).append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3682=this.getIS().getConnectList().iterator();index3682.hasNext();) {
>                             let element = index3682.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"bboxSize"))) {
>
> stringClassicVRML.append(indentCharacter).append("bboxSize").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else if(!java.util.Arrays.equals(this.getBboxSize(),
> TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("bboxSize
> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxSize())).append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3683=this.getIS().getConnectList().iterator();index3683.hasNext();) {
>                             let element = index3683.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"center"))) {
>
> stringClassicVRML.append(indentCharacter).append("center").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else if(!java.util.Arrays.equals(this.getCenter(),
> TransformObject.CENTER_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("center
> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getCenter())).append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3684=this.getIS().getConnectList().iterator();index3684.hasNext();) {
>                             let element = index3684.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"class"))) {
>
> stringClassicVRML.append(indentCharacter).append("class").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else if(!/* equals */(<any>((o1: any, o2: any) => {
> if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getCssClass(),org.web3d.x3d.jsail.X3DConcreteNode.CLASS_DEFAULT_VALUE))
> || org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("# class
> ").append("\"").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getCssClass())).append("\"").append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3685=this.getIS().getConnectList().iterator();index3685.hasNext();) {
>                             let element = index3685.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"rotation"))) {
>
> stringClassicVRML.append(indentCharacter).append("rotation").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else if(!java.util.Arrays.equals(this.getRotation(),
> TransformObject.ROTATION_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("rotation
> ").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getRotation())).append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3686=this.getIS().getConnectList().iterator();index3686.hasNext();) {
>                             let element = index3686.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"scale"))) {
>
> stringClassicVRML.append(indentCharacter).append("scale").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else if(!java.util.Arrays.equals(this.getScale(),
> TransformObject.SCALE_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("scale
> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getScale())).append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3687=this.getIS().getConnectList().iterator();index3687.hasNext();) {
>                             let element = index3687.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"scaleOrientation"))) {
>
> stringClassicVRML.append(indentCharacter).append("scaleOrientation").append("
> IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else
> if(!java.util.Arrays.equals(this.getScaleOrientation(),
> TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("scaleOrientation
> ").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getScaleOrientation())).append("\n").append(indent).append(indentCharacter);
>                     }
>                     if(hasISconnect) {
>                         for(let
> index3688=this.getIS().getConnectList().iterator();index3688.hasNext();) {
>                             let element = index3688.next();
>                             {
>                                 if(/* equals */(<any>((o1: any, o2: any)
> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
> } })(element.getNodeField(),"translation"))) {
>
> stringClassicVRML.append(indentCharacter).append("translation").append(" IS
> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>                                 }
>                             }
>                         }
>                     } else
> if(!java.util.Arrays.equals(this.getTranslation(),
> TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$()) ||
> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>                         stringClassicVRML.append("translation
> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getTranslation())).append("\n").append(indent).append(indentCharacter);
>                     }
>                 }
>             }
>             if(hasChild) {
>                 if(this.metadata != null) {
>
> stringClassicVRML.append(indentCharacter).append("metadata").append(" ");
>
> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).toStringClassicVRML$int(indentLevel
> + indentIncrement));
>                     stringClassicVRML.append(indent);
>                 } else if(this.metadataProtoInstance != null) {
>
> stringClassicVRML.append(indentCharacter).append("metadata").append(" ");
>
> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).toStringClassicVRML$int(indentLevel
> + indentIncrement));
>                     stringClassicVRML.append(indent);
>                 }
>                 if(this.IS != null) {
>
> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).toStringClassicVRML$int(indentLevel));
>                 }
>                 if(this.children.size() > 0) {
>
> stringClassicVRML.append(indentCharacter).append(indentCharacter).append("children").append("
> [").append("\n").append(indent).append(indentCharacter).append(indentCharacter);
>                     for(let
> index3689=this.children.iterator();index3689.hasNext();) {
>                         let element = index3689.next();
>                         {
>
> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>element).toStringClassicVRML$int(indentLevel
> + indentIncrement + indentIncrement));
>                         }
>                     }
>
> stringClassicVRML.append(indent).append(indentCharacter).append(indentCharacter).append("]").append("\n").append(indent);
>                 }
>             }
>             if(hasAttributes || hasChild) {
>                 stringClassicVRML.append("}").append("\n");
>             }
>             return stringClassicVRML.toString();
>         }
>
>         /**
>          * Recursive method to provide ClassicVRML string serialization.
>          * @param {number} indentLevel number of levels of indentation for
> this element
>          * @see X3DObject#FILE_EXTENSION_CLASSICVRML
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dResources.html#VRML">X3D
> Resources: Virtual Reality Modeling Language (VRML) 97</a>
>          * @see <a href="
> https://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/X3D_ClassicVRML.html">Extensible
> 3D (X3D) encodings Part 2: Classic VRML encoding</a>
>          * @see <a href="
> https://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/grammar.html">Extensible
> 3D (X3D) encodings Part 2: Classic VRML encoding, Annex A: Grammar</a>
>          * @return {string} ClassicVRML string
>          */
>         public toStringClassicVRML(indentLevel? : any) : any {
>             if(((typeof indentLevel === 'number') || indentLevel ===
> null)) {
>                 return <any>this.toStringClassicVRML$int(indentLevel);
>             } else if(indentLevel === undefined) {
>                 return <any>this.toStringClassicVRML$();
>             } else throw new Error('invalid overload');
>         }
>
>         public toStringVRML97$int(indentLevel : number) : string {
>             return this.toStringClassicVRML$int(indentLevel);
>         }
>
>         /**
>          * Recursive method to provide VRML97 string serialization.
>          * @param {number} indentLevel number of levels of indentation for
> this element
>          * @see X3DObject#FILE_EXTENSION_VRML97
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dResources.html#VRML">X3D
> Resources: Virtual Reality Modeling Language (VRML) 97</a>
>          * @see <a href="
> https://www.web3d.org/documents/specifications/14772/V2.0/index.html">Virtual
> Reality Modeling Language (VRML) 97 specification</a>
>          * @see <a href="
> https://www.web3d.org/documents/specifications/14772-1/V2.1/index.html">VRML
> 97 v2.1 Amendment</a>
>          * @return {string} VRML97 string
>          */
>         public toStringVRML97(indentLevel? : any) : any {
>             if(((typeof indentLevel === 'number') || indentLevel ===
> null)) {
>                 return <any>this.toStringVRML97$int(indentLevel);
>             } else if(indentLevel === undefined) {
>                 return <any>this.toStringVRML97$();
>             } else throw new Error('invalid overload');
>         }
>
>         public findElementByNameValue$java_lang_String(nameValue : string)
> : org.web3d.x3d.jsail.X3DConcreteElement {
>             return
> this.findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> "");
>         }
>
>         public
> findElementByNameValue$java_lang_String$java_lang_String(nameValue :
> string, elementName : string) : org.web3d.x3d.jsail.X3DConcreteElement {
>             if((nameValue == null) || /* isEmpty */(nameValue.length ===
> 0)) {
>                 let errorNotice : string = "findElementByNameValue(\"\", "
> + elementName + ") cannot use empty string to find a name attribute";
>                 this.validationResult.append(errorNotice).append("\n");
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>             }
>             let referenceElement : org.web3d.x3d.jsail.X3DConcreteElement;
>             for(let
> index3690=this.children.iterator();index3690.hasNext();) {
>                 let element = index3690.next();
>                 {
>                     if(element != null && element instanceof
> <any>org.web3d.x3d.jsail.X3DConcreteElement) {
>                         referenceElement =
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> elementName);
>                         if(referenceElement != null) return
> referenceElement;
>                     }
>                 }
>             }
>             if(this.IS != null) {
>                 referenceElement =
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> elementName);
>                 if(referenceElement != null) return referenceElement;
>             }
>             if(this.metadata != null) {
>                 referenceElement =
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> elementName);
>                 if(referenceElement != null) return referenceElement;
>             }
>             if(this.metadataProtoInstance != null) {
>                 referenceElement =
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> elementName);
>                 if(referenceElement != null) return referenceElement;
>             }
>             return null;
>         }
>
>         /**
>          * Recursive method to provide object reference to node or
> statement by name attribute, if found as part of this element or in a
> contained element.
>          * Elements with name fields include meta, Metadata* nodes,
> field/fieldValue, ProtoDeclare/ExternProtoDeclare/ProtoInstance, CAD and
> HAnim nodes.
>          * <br ><br >
>          * <i>Warning:</i> first start with findAncestorSceneObject() to
> check entire scene graph, or findAncestorX3DObject() to check entire model
> document.
>          * <br ><br >
>          * <i>Warning:</i> more than one element may be found that has the
> same name, this method does not handle that case.
>          * @see #findNodeByDEF(String)
>          * @see X3DConcreteElement#hasAncestorSceneObject()
>          * @see
> org.web3d.x3d.jsail.X3DConcreteElement#findAncestorX3DObject()
>          * @param {string} nameValue is value of the name field being
> searched for in this element and child elements(if any)
>          * @param {string} elementName identifies the element of interest
> (meta MetadataString ProtoDeclare CADassembly ProtoInstance HAnimHumanoid
> etc.)
>          * @return {org.web3d.x3d.jsail.X3DConcreteElement} object
> reference to found element, null otherwise
>          */
>         public findElementByNameValue(nameValue? : any, elementName? :
> any) : any {
>             if(((typeof nameValue === 'string') || nameValue === null) &&
> ((typeof elementName === 'string') || elementName === null)) {
>                 return
> <any>this.findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> elementName);
>             } else if(((typeof nameValue === 'string') || nameValue ===
> null) && elementName === undefined) {
>                 return
> <any>this.findElementByNameValue$java_lang_String(nameValue);
>             } else throw new Error('invalid overload');
>         }
>
>         /**
>          * Recursive method to determine whether node or statement with
> given name attribute is found, meaning both objects are attached to same
> scene graph.
>          * @param {string} nameValue is value of the name field being
> searched for in this element and child elements(if any)
>          * @param {string} elementName identifies the element of interest
> (meta MetadataString ProtoDeclare CADassembly ProtoInstance HAnimHumanoid
> etc.)
>          * @see #findElementByNameValue(String, String)
>          * @return {boolean} whether node is found
>          */
>         public hasElementByNameValue(nameValue : string, elementName :
> string) : boolean {
>             return
> (this.findElementByNameValue$java_lang_String$java_lang_String(nameValue,
> elementName) != null);
>         }
>
>         /**
>          * Recursive method to provide object reference to node by DEF, if
> found as this node or in a contained node.
>          * <br ><br >
>          * <i>Warning:</i> first start with findAncestorSceneObject() to
> check entire scene graph, or findAncestorX3DObject() to check entire model
> document.
>          * <br ><br >
>          * <i>Warning:</i> more than one element may be found that has the
> same DEF, this method does not handle that case.
>          * @see #findElementByNameValue(String)
>          * @see X3DConcreteElement#hasAncestorSceneObject()
>          * @see
> org.web3d.x3d.jsail.X3DConcreteElement#findAncestorX3DObject()
>          * @param {string} DEFvalue is value of the name field being
> searched for in this element and child elements(if any)
>          * @return {org.web3d.x3d.jsail.X3DConcreteNode} object reference
> to found node, null otherwise
>          */
>         public findNodeByDEF(DEFvalue : string) :
> org.web3d.x3d.jsail.X3DConcreteNode {
>             if((DEFvalue == null) || /* isEmpty */(DEFvalue.length === 0))
> {
>                 let errorNotice : string = "findNodeByDEF(\"\") cannot use
> empty string to find a name";
>                 this.validationResult.append(errorNotice).append("\n");
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>             }
>             if(/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
> })(this.getDEF(),DEFvalue))) return this;
>             let referenceNode : org.web3d.x3d.jsail.X3DConcreteNode;
>             for(let
> index3691=this.children.iterator();index3691.hasNext();) {
>                 let element = index3691.next();
>                 {
>                     if(element != null && element instanceof
> <any>org.web3d.x3d.jsail.X3DConcreteNode) {
>                         referenceNode =
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).findNodeByDEF(DEFvalue);
>                         if(referenceNode != null) return referenceNode;
>                     }
>                 }
>             }
>             if(this.IS != null) {
>                 referenceNode =
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).findNodeByDEF(DEFvalue);
>                 if(referenceNode != null) return referenceNode;
>             }
>             if(this.metadata != null) {
>                 referenceNode =
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).findNodeByDEF(DEFvalue);
>                 if(referenceNode != null) return referenceNode;
>             }
>             if(this.metadataProtoInstance != null) {
>                 referenceNode =
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).findNodeByDEF(DEFvalue);
>                 if(referenceNode != null) return referenceNode;
>             }
>             return null;
>         }
>
>         /**
>          * Recursive method to determine whether node with DEFvalue is
> found, meaning both objects are attached to same scene graph.
>          * @param {string} DEFvalue is value of the name field being
> searched for in this element and child elements(if any)
>          * @see #findNodeByDEF(String)
>          * @return {boolean} whether node is found
>          */
>         public hasNodeByDEF(DEFvalue : string) : boolean {
>             return (this.findNodeByDEF(DEFvalue) != null);
>         }
>
>         /**
>          * Recursive method to validate this element plus all contained
> nodes and statements,
>          * using both datatype-specification value checks and regular
> expression (regex) checking of corresponding string values.
>          * @return {string} validation results (if any)
>          */
>         public validate() : string {
>             this.validationResult = new java.lang.StringBuilder();
>             this.setBboxCenter$float_A(this.getBboxCenter());
>             this.setBboxSize$float_A(this.getBboxSize());
>             this.setCenter$float_A(this.getCenter());
>             this.setRotation$float_A(this.getRotation());
>             this.setScale$float_A(this.getScale());
>             this.setScaleOrientation$float_A(this.getScaleOrientation());
>             this.setTranslation$float_A(this.getTranslation());
>             if(!this.isUSE()) this.setDEF$java_lang_String(this.getDEF());
>             if(this.isUSE()) this.setUSE$java_lang_String(this.getUSE());
>             this.setCssClass$java_lang_String(this.getCssClass());
>             for(let
> index3692=this.children.iterator();index3692.hasNext();) {
>                 let element = index3692.next();
>                 {
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).validate();
>
> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>element).getValidationResult());
>                 }
>             }
>
> this.setChildren$org_web3d_x3d_sai_Core_X3DNode_A(this.getChildren());
>             if(this.isUSE() && this.hasChildren()) {
>                 let errorNotice : string = "Transform USE=\'" +
> this.getUSE() + "\' is not allowed to have contained MFNode children";
>                 this.validationResult.append(errorNotice);
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>             }
>             if(this.IS != null) {
>                 this.setIS(this.getIS());
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).validate();
>
> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).getValidationResult());
>             }
>             if(this.isUSE() && this.hasIS()) {
>                 let errorNotice : string = "Transform USE=\'" +
> this.getUSE() + "\' is not allowed to have contained SFNode IS";
>                 this.validationResult.append(errorNotice);
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>             }
>             if(this.metadata != null) {
>
> this.setMetadata$org_web3d_x3d_sai_Core_X3DMetadataObject(this.getMetadata());
>
> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).validate();
>
> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).getValidationResult());
>             }
>             if(this.metadataProtoInstance != null) {
>
> this.setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(this.getMetadataProtoInstance());
>
> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).validate();
>
> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).getValidationResult());
>             }
>             if((this.metadata != null) && (this.metadataProtoInstance !=
> null)) {
>                 let errorNotice : string = "Internal X3DJSAIL error:
> incorrect handling of contained SFNode field, both metadata and
> metadataProtoInstance are set simultaneously";
>                 this.validationResult.append(errorNotice);
>                 throw new
> org.web3d.x3d.sai.InvalidProtoException(errorNotice);
>             }
>             if(this.isUSE() && this.hasMetadata()) {
>                 let errorNotice : string = "Transform USE=\'" +
> this.getUSE() + "\' is not allowed to have contained SFNode metadata";
>                 this.validationResult.append(errorNotice);
>                 throw new
> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>             }
>             if(this.getIS() != null) {
>                 if(this.getIS().getConnectList().isEmpty()) {
>                     let errorNotice : string = "IS statement present, but
> contains no connect statements";
>                     this.validationResult.append(errorNotice).append("\n");
>                     throw new
> org.web3d.x3d.sai.InvalidProtoException(errorNotice);
>                 }
>             }
>             if(!/* isEmpty */(this.getContainerFieldOverride().length ===
> 0) &&
> !java.util.Arrays.asList<any>(this.containerField_ALTERNATE_VALUES).contains(this.getContainerFieldOverride()))
> {
>                 let errorNotice : string =
> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_ILLEGAL_VALUE + ":
> illegal value encountered, containerField=\'" +
> this.getContainerFieldOverride() + "\' but allowed values are
> containerField_ALTERNATE_VALUES=\'" + new
> org.web3d.x3d.jsail.fields.MFStringObject(this.containerField_ALTERNATE_VALUES).toStringX3D()
> + "\'.";
>                 this.validationResult.append(errorNotice).append("\n");
>                 throw new
> org.web3d.x3d.sai.InvalidFieldException(errorNotice);
>             }
>             if(this.findAncestorX3DObject() != null) {
>                 let modelProfile : string =
> this.findAncestorX3DObject().getProfile();
>                 let hasSatisfactorySupport : boolean =
> this.findAncestorX3DObject().supportsX3dComponent(TransformObject.COMPONENT,
> TransformObject.LEVEL);
>                 if(!hasSatisfactorySupport) {
>                     let errorNotice : string =
> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_ILLEGAL_VALUE + "
> insufficient X3D profile=\'" + modelProfile + "\' for parent X3D model
> containing \'Transform\' node, add head statement <component
> name=\'Grouping\' level=\'1\'/>\nor Java source-code assignment:
>  findAncestorX3DObject().getHead().addComponent(\"Grouping\").setLevel(1);";
>                     this.validationResult.append(errorNotice).append("\n");
>                     throw new
> org.web3d.x3d.sai.InvalidFieldException(errorNotice);
>                 }
>             }
>             return this.validationResult.toString();
>         }
>     }
>     TransformObject["__class"] =
> "org.web3d.x3d.jsail.Grouping.TransformObject";
>     TransformObject["__interfaces"] =
> ["org.web3d.x3d.sai.Grouping.Transform","org.web3d.x3d.sai.Core.X3DNode","org.web3d.x3d.sai.Grouping.X3DBoundedObject","org.web3d.x3d.sai.Grouping.X3DGroupingNode","org.web3d.x3d.sai.Core.X3DChildNode"];
>
>
> }
>
>
>
> org.web3d.x3d.jsail.Grouping.TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$();
>
>
> org.web3d.x3d.jsail.Grouping.TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$();
>
> org.web3d.x3d.jsail.Grouping.TransformObject.SCALE_DEFAULT_VALUE_$LI$();
>
> org.web3d.x3d.jsail.Grouping.TransformObject.ROTATION_DEFAULT_VALUE_$LI$();
>
> org.web3d.x3d.jsail.Grouping.TransformObject.CENTER_DEFAULT_VALUE_$LI$();
>
> org.web3d.x3d.jsail.Grouping.TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$();
>
>
> org.web3d.x3d.jsail.Grouping.TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$();
>
> On Thu, Apr 9, 2020 at 6:52 PM John Carlson <yottzumm at gmail.com> wrote:
>
>> Matrix transform class implementation in different toolkits:
>>
>> X3DOM:
>> https://github.com/x3dom/x3dom/blob/master/src/nodes/Grouping/Transform.js
>>
>> X_ITE:
>> https://github.com/create3000/x_ite/blob/master/src/x_ite/Components/Grouping/Transform.js
>>
>> Three.js:
>> https://threejs.org/docs/#manual/en/introduction/Matrix-transformations
>>
>> TypeScript: TBD, not checked in.  Cannot unpack zip on my server.
>>
>>
>> On Thu, Apr 9, 2020 at 12:07 AM John Carlson <yottzumm at gmail.com> wrote:
>>
>>> Trying to understand why SAI is so difficult to take out of X_ITE and
>>> put in X3DOM.
>>>
>>> Under x3dom, there's:
>>>
>>> ~/x3dom/src/nodes (master)
>>> $ ls
>>> BVHRefiner/            Geometry3D/     Navigation/            Sound/
>>> CADGeometry/           Geometry3DExt/  Networking/            Text/
>>> Core/                  Geospatial/     NURBS/                 Texturing/
>>> CubeMapTexturing/      Grouping/       PointingDeviceSensor/
>>>  Texturing3D/
>>> EnvironmentalEffects/  H-Anim/         Rendering/             Time/
>>> EventUtilities/        Interpolation/  RigidBodyPhysics/
>>>  VolumeRendering/
>>> Followers/             Layout/         Shaders/
>>> Geometry2D/            Lighting/       Shape/
>>>
>>> Under X_ITE, there's:
>>>
>>> ~/x_ite/src/x_ite (master)
>>> $ ls Browser/ Components
>>> Browser/:
>>> Core/                  Navigation/            Sound/
>>> EnvironmentalEffects/  Networking/            Text/
>>> Followers/             NURBS/                 Texturing/
>>> Geometry2D/            ParticleSystems/       Texturing3D/
>>> Geometry3D/            Picking/               Time/
>>> Geospatial/            PointingDeviceSensor/  VERSION.js
>>> Interpolation/         Rendering/             VolumeRendering/
>>> KeyDeviceSensor/       RigidBodyPhysics/      X3DBrowser.js
>>> Layering/              Scripting/             X3DBrowserContext.js
>>> Layout/                Shaders/
>>> Lighting/              Shape/
>>>
>>> Components:
>>> Annotation/              H-Anim/                    Rendering/
>>> CADGeometry/             Interpolation/             Rendering.js
>>> Core/                    Interpolation.js           RigidBodyPhysics/
>>> Core.js                  KeyDeviceSensor/           Scripting/
>>> CubeMapTexturing/        Layering/                  Shaders/
>>> DIS/                     Layering.js                Shaders.js
>>> EnvironmentalEffects/    Layout/                    Shape/
>>> EnvironmentalEffects.js  Lighting/                  Shape.js
>>> EnvironmentalSensor/     Lighting.js                Sound/
>>> EnvironmentalSensor.js   Navigation/                Sound.js
>>> EventUtilities/          Navigation.js              Text/
>>> Followers/               Networking/                Text.js
>>> Followers.js             Networking.js              Texturing/
>>> Geometry2D/              NURBS/                     Texturing.js
>>> Geometry3D/              ParticleSystems/           Texturing3D/
>>> Geometry3D.js            Picking/                   Time/
>>> Geospatial/              PointingDeviceSensor/      Time.js
>>> Grouping/                PointingDeviceSensor.js    VolumeRendering/
>>> Grouping.js              ProjectiveTextureMapping/  X_ITE/
>>>
>>>
>>> Suggestion:  We create test cases with X3dToES5.xslt (or similar)
>>> targeting X_ITE's SAI.  Once we have that working satisfactorily, we go
>>> ahead and write either an XSLT file or Python file to generate additional
>>> classes not currently covered by X_ITE.
>>>
>>> I think that Holger would appreciate the additional help on testing and
>>> fleshing out the X_ITE SAI.
>>>
>>> This seems like a good thing to do, and I am accepting of it.
>>>
>>> John
>>>
>>>
>>>
>>> On Wed, Mar 25, 2020 at 8:47 AM Andreas Plesch <andreasplesch at gmail.com>
>>> wrote:
>>>
>>>> Hi John, Don,
>>>>
>>>> I am trying to follow the discussion somewhat but have quite limited
>>>> availability now.
>>>>
>>>> Here are some considerations, unfortunately quite unconnected.
>>>>
>>>> Ecmascript best practices
>>>>
>>>> It is not clear that there are commonly accepted standards since the
>>>> language is forgiving having evolved so much. But here are perhaps
>>>> some guides. An often encountered viewpoint is that the language is
>>>> not very OO oriented but rather functional in nature. So OO principles
>>>> do not necessarily apply but could be used anyways. There are now
>>>> classes in Ecmascript although my understanding is that they are
>>>> largely considered syntactical sugar. Another principle is that since
>>>> it is a largely interpreted language which relies on garbage
>>>> collection, object reuse is favored over object creation and
>>>> destruction. Three.js, for example, is very strict about this, and
>>>> part of the reason why it is performing well. x3dom is not very strict
>>>> about this on the other hand, and still does ok. As node.js is a
>>>> target one needs to be careful to distinguish between DOM/browser
>>>> features and language features. Node.js natively does not have DOM
>>>> methods but a DOM and methods can be added with a library. Also, keep
>>>> in mind that currently there is no X3D runtime for node.js.
>>>> x3dom/x_ite cannot be run in node.js. So one, expensive, experiment
>>>> would be to try to extract a node compatible runtime by separating the
>>>> rendering and input controls out of these engines.
>>>>
>>>> Scene Authoring/Construction versus Scene Access
>>>>
>>>> Ecmascript differs from Python or Java in that it is the primary
>>>> language for X3D scripts used internally in scenes, and externally to
>>>> access scenes in running browsers. This is what the current SAI spec.
>>>> defines, and what I understand to be Scene Access. This includes but
>>>> is not limited to constructing new nodes and entire scenes
>>>> programmatically. In addition to construction, SAI also allows for
>>>> controling a browser, and modifying a running scene. In contrast,
>>>> X3DJ/PSAIL is limited to constructing and authoring a scene which can
>>>> eventually be serialized as xml or json, and be used to load into X3D
>>>> browser. It seems perhaps prudent for now to parallel X3DJSAIL and
>>>> just focus on scene authoring, and not be concerned about live scene
>>>> control and modification.
>>>>
>>>> JSON
>>>>
>>>> Since the X3D JSON encoding now exists, a useful and specific question
>>>> is if the Ecmascript JSON.parse() function
>>>> (
>>>> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
>>>> )
>>>> should return a value which can be immediately used by the envisioned
>>>> library given a JSON encoded string. Conversely, should the Ecmascript
>>>> JSON.stringify() function generate directly X3D JSON encoding if given
>>>> a library generated object ?
>>>>
>>>> -Andreas
>>>>
>>>>
>>>>
>>>> On Tue, Mar 24, 2020 at 9:20 AM Don Brutzman <brutzman at nps.edu> wrote:
>>>> >
>>>> > John, certainly we need to pay attention to "how" a library
>>>> conversion is performed.  JSweet is promising, and we have a number of
>>>> conversion approached demonstrated already.
>>>> >
>>>> > But that is distracting and confusing way to solve a problem and
>>>> leads to "fire, ready, aim!" implementation pathologies.
>>>> >
>>>> > A further risk might be that JSweet might carry through unnecessary
>>>> Java programming idioms, but presumably they have sorted through that well
>>>> already.
>>>> >
>>>> > First things first, please.  Let's begin with defining design goals.
>>>> That's how we accomplished creating Java and Python programming-language
>>>> bindings for X3D.
>>>> >
>>>> > What we really need to understand is "what" a sharable X3D JavaScript
>>>> library looks like, and how JavaScript programmers might then use it to
>>>> author interactive X3D models.
>>>> >
>>>> > Authoring use-case environments are
>>>> > 1. Script inside X3D scene graph,
>>>> > 2. Script in outer HTML5 web page,
>>>> > 3. Standalone programmatic use in node.js
>>>> >
>>>> > Now get specific.  Recommend listing pseudocode and design patterns
>>>> for JavaScript Transform class and JavaScript X3D types, comparing:
>>>> >
>>>> > a. X3D ECMAScript specification,
>>>> > b. X3D Script code fields (class variables) and methods,
>>>> > c. good general-practice OO design pattern(s) in common use,
>>>> > d. current X3D JSON approach, is it OK or improvable further?
>>>> > e. compare/contrast Transform approach with X3DJSONLD,
>>>> > f. compare/contrast Transform approach with X_ITE,
>>>> > g. compare/contrast Transform approach with X3DOM,
>>>> > h. compare/contrast Transform approach with three.js,
>>>> > j. compare/contrast Transform approach with any other javascript
>>>> libraries of interest,
>>>> > i. compatibility of Transform approach with Angular, React, jquery,
>>>> other common JavaScript frameworks for HTML.
>>>> >
>>>> > We did this kind of comparison for X3D JSON design and it helped make
>>>> a confusing understandable, eventually leading to good design decisions.
>>>> >
>>>> > If interested parties prepare this kind of comparison, and understand
>>>> "what" we want that has general appeal, then progress refinement will be
>>>> straightforward.
>>>> >
>>>> > Many people use JavaScript these days, especially with node.js -
>>>> check whether they like the result.
>>>> >
>>>> > When you have solid patterns then we convert 4,000 X3D example scenes
>>>> (from .x3d -> .js) to match, providing unit tests.  Lather, rinse, repeat...
>>>> >
>>>> > Hope this outline helps.  Good luck out there!  8)
>>>> >
>>>> > all the best, Don
>>>> > --
>>>> > Don Brutzman  Naval Postgraduate School, Code USW/Br
>>>> brutzman at nps.edu
>>>> > Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA
>>>>  +1.831.656.2149
>>>> > X3D graphics, virtual worlds, navy robotics
>>>> http://faculty.nps.edu/brutzman
>>>>
>>>>
>>>>
>>>> --
>>>> Andreas Plesch
>>>> Waltham, MA 02453
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20200409/b5a02156/attachment-0001.html>


More information about the x3d-public mailing list