[x3d-public] JSweet translation of X3DJSAIL to JavaScript: need specific design goals first
John Carlson
yottzumm at gmail.com
Thu Apr 9 17:56:09 PDT 2020
You should be able to run tsc.cmd to convert TypeScript to JavaScript, so
I'm not posting the JavaScript transpilation here.
On Thu, Apr 9, 2020 at 6:58 PM John Carlson <yottzumm at gmail.com> wrote:
> 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/3a4187b3/attachment-0001.html>
More information about the x3d-public
mailing list