<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D profile='Immersive' version='3.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.0.xsd'>
  <head>
    <component level='4' name='NURBS'/>
    <meta content='NurbsPrototypes.x3d' name='title'/>
    <meta content='Non-Uniform Rational B-Spline (NURBS) prototype definitions.' name='description'/>
    <meta content='Original blaxxun definitions heavily modified, X3D specification revisions by Don Brutzman, Charles Adams, Jeffrey Weekley and Alan Shaffer NPS.' name='creator'/>
    <meta content='Don Brutzman' name='translator'/>
    <meta content='1 January 2000' name='created'/>
    <meta content='18 March 2002' name='translated'/>
    <meta content='20 October 2019' name='modified'/>
    <meta content='Under development for final version of X3D NURBS nodes' name='warning'/>
    <meta content='Not all NURBS nodes are prototyped here, and these implementations are not yet fully demonstrated.' name='warning'/>
    <meta content='https://www.web3d.org/files/specifications/19775-1/V3.3/Part01/components/nurbs.html' name='reference'/>
    <meta content='http://www.blaxxun.com/vrml/protos/nurbs.wrl' name='reference'/>
    <meta content='NurbsPrototypesOriginal.x3d.txt' name='reference'/>
    <meta content='javadoc/index.html' name='reference'/>
    <meta content='NURBS Prototypes' name='subject'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsPrototypes.x3d' name='identifier'/>
    <meta content='Vrml97ToX3dNist, http://ovrt.nist.gov/v2_x3d.html' name='generator'/>
    <meta content='X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit' name='generator'/>
    <meta content='../../license.html' name='license'/>
  </head>
  <Scene>
    <WorldInfo title='NurbsPrototypes.x3d'/>
    <ProtoDeclare appinfo='Contour2D groups a set of curve segments to a composite contour Children segments form a closed loop with first point of first child repeated as last point of last child and last point of segment repeated as first point of consecutive segment Children segments are type NurbsCurve2D or Polyline2D enumerated in consecutive order of contour topology.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#Contour2D' name='Contour2D'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='[NurbsCurve|ContourPolyline2D]' name='addChildren' type='MFNode'/>
        <field accessType='inputOnly' appinfo='[NurbsCurve|ContourPolyline2D]' name='removeChildren' type='MFNode'/>
        <field accessType='initializeOnly' appinfo='[NurbsCurve|ContourPolyline2D]' name='children' type='MFNode'>
          <!-- default is empty node array -->
        </field>
        <field accessType='inputOnly' name='set_children' type='MFNode'/>
        <field accessType='outputOnly' name='children_changed' type='MFNode'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <Group DEF='Contour2DGroup'>
          <IS>
            <connect nodeField='addChildren' protoField='addChildren'/>
            <connect nodeField='removeChildren' protoField='removeChildren'/>
            <connect nodeField='children' protoField='children'/>
            <connect nodeField='set_children' protoField='set_children'/>
            <connect nodeField='children_changed' protoField='children_changed'/>
          </IS>
        </Group>
        <!-- consider adding a Script here to check that the children nodes are solely of type NurbsCurve2D and/or ContourPolyline2D -->
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='ContourPolyline2D defines a linear curve segment as part of a trimming contour in u-v domain of a surface.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#ContourPolyline2D' name='ContourPolyline2D'>
      <ProtoInterface>
        <field accessType='initializeOnly' name='point' type='MFVec2f'>
          <!-- Specification definition: MFVec2f [in,out] point [] (-∞,∞) but we cannot match accessType inputOutput since there is no VRML 97 field that is MFVec2f [in,out]. Hence a known limitation. -->
        </field>
        <field accessType='inputOnly' name='set_point' type='MFVec2f'/>
        <field accessType='outputOnly' name='point_changed' type='MFVec2f'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <!-- Typical initial approach: group all body nodes together, since rendering is only affected by first Prototype child. Then, map interface field(s) to dummy-node field(s) so that a Script can USE and then manipulate them. -->
        <Group DEF='ContourPolyline2DGroup'>
          <Switch DEF='HideDummy' whichChoice='-1'>
            <Shape>
              <Extrusion DEF='PointHolder'>
                <IS>
                  <connect nodeField='crossSection' protoField='point'/>
                </IS>
              </Extrusion>
            </Shape>
          </Switch>
          <Script DEF='ScriptContourPolyline2D-missingBody' directOutput='true'>
            <field accessType='initializeOnly' name='PointHolder' type='SFNode'>
              <Extrusion USE='PointHolder'/>
            </field>
          </Script>
        </Group>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='CoordinateDouble builds geometry using a set of 3D coordinates. CoordinateDouble is used by IndexedFaceSet IndexedLineSet LineSet and PointSet. CoordinateDouble is also used by NurbsPositionInterpolator and NurbsOrientationInterpolator.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#CoordinateDouble' name='CoordinateDouble'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='Substitute MFVec3f for MFVec3d to provide VRML 97 support' name='point' type='MFVec3f'>
          <!-- Specification definition: MFVec3d [in,out] point [] (-∞,∞) -->
        </field>
        <field accessType='inputOnly' name='set_point' type='MFVec3f'/>
        <field accessType='outputOnly' name='point_changed' type='MFVec3f'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <Coordinate>
          <IS>
            <connect nodeField='point' protoField='point'/>
            <connect nodeField='set_point' protoField='set_point'/>
            <connect nodeField='point_changed' protoField='point_changed'/>
          </IS>
        </Coordinate>
        <!-- no metadata holder, since there is no exposedField SFNode in VRML 97. metadata SFNode simply sits in the ProtoInterface. Run-time instantiation support may vary. -->
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsCurve is a 3D curve analogous to NurbsPatchSurface. The container controlPoint field is a Coordinate or CoordinateDouble node.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsCurve' name='NurbsCurve'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'>
          <Coordinate containerField='controlPoint'/>
        </field>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='tessellation' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (0,∞)' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' name='closed' type='SFBool' value='false'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='knot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='order' type='SFInt32' value='3'/>
        <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_tessellation' type='SFInt32'/>
        <field accessType='outputOnly' name='tessellation_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedLineSet DEF='NurbsCurveLineSet'>
          <Coordinate DEF='NurbsCurveCoord'/>
        </IndexedLineSet>
        <!-- only first child of ProtoBody renders -->
        <Switch whichChoice='-1'>
          <Shape>
            <IndexedFaceSet>
              <IS>
                <connect nodeField='coord' protoField='controlPoint'/>
              </IS>
            </IndexedFaceSet>
          </Shape>
        </Switch>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsCurveScript' directOutput='true' mustEvaluate='true' url='"NurbsCurve.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsCurve.class"'>
          <field accessType='initializeOnly' name='controlPoint' type='SFNode'/>
          <field accessType='initializeOnly' name='tessellation' type='SFInt32'/>
          <field accessType='initializeOnly' name='weight' type='MFDouble'/>
          <field accessType='initializeOnly' name='closed' type='SFBool'/>
          <field accessType='initializeOnly' name='knot' type='MFDouble'/>
          <field accessType='initializeOnly' name='order' type='SFInt32'/>
          <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
          <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_tessellation' type='SFInt32'/>
          <field accessType='outputOnly' name='tessellation_changed' type='SFInt32'/>
          <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
          <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
          <field accessType='outputOnly' name='point' type='MFVec3f'/>
          <field accessType='outputOnly' name='pointIndex' type='MFInt32'/>
          <IS>
            <connect nodeField='controlPoint' protoField='controlPoint'/>
            <connect nodeField='tessellation' protoField='tessellation'/>
            <connect nodeField='weight' protoField='weight'/>
            <connect nodeField='closed' protoField='closed'/>
            <connect nodeField='knot' protoField='knot'/>
            <connect nodeField='order' protoField='order'/>
            <connect nodeField='set_controlPoint' protoField='set_controlPoint'/>
            <connect nodeField='controlPoint_changed' protoField='controlPoint_changed'/>
            <connect nodeField='set_tessellation' protoField='set_tessellation'/>
            <connect nodeField='tessellation_changed' protoField='tessellation_changed'/>
            <connect nodeField='set_weight' protoField='set_weight'/>
            <connect nodeField='weight_changed' protoField='weight_changed'/>
          </IS>
        </Script>
        <ROUTE fromField='point' fromNode='NurbsCurveScript' toField='set_point' toNode='NurbsCurveCoord'/>
        <ROUTE fromField='pointIndex' fromNode='NurbsCurveScript' toField='set_coordIndex' toNode='NurbsCurveLineSet'/>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsCurve2D defines a trimming segment that is part of trimming contour in u-v domain of surface NurbsCurve2D forming a closed contour may be used as Contour2D node.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsCurve2D' name='NurbsCurve2D'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='controlPoint' type='MFVec2f'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='tessellation' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (0,∞)' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='knot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='order' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' name='closed' type='SFBool' value='false'/>
        <field accessType='inputOnly' name='set_controlPoint' type='MFVec2f'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='MFVec2f'/>
        <field accessType='inputOnly' name='set_tessellation' type='SFInt32'/>
        <field accessType='outputOnly' name='tessellation_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <Group DEF='NurbsCurve2DGroup'/>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsOrientationInterpolator describes a 3D NURBS Curve and outputs interpolated orientation values. The SFNode controlPoint field can contain a single Coordinate or CoordinateDouble node.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsOrientationInterpolator' name='NurbsOrientationInterpolator'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='range (-∞,∞)' name='set_fraction' type='SFFloat'/>
        <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'>
          <Coordinate containerField='controlPoint'/>
        </field>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='knot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range (2,∞)' name='order' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='outputOnly' name='value_changed' type='SFRotation'/>
        <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_knot' type='MFDouble'/>
        <field accessType='outputOnly' name='knot_changed' type='MFDouble'/>
        <field accessType='inputOnly' name='set_order' type='SFInt32'/>
        <field accessType='outputOnly' name='order_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsOrientationInterpolatorScript' directOutput='true' mustEvaluate='true' url='"NurbsOrientationInterpolator.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsOrientationInterpolator.class"'>
          <field accessType='inputOnly' name='set_fraction' type='SFFloat'/>
          <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'/>
          <field accessType='initializeOnly' name='knot' type='MFDouble'/>
          <field accessType='initializeOnly' name='order' type='SFInt32'/>
          <field accessType='initializeOnly' name='weight' type='MFDouble'/>
          <field accessType='outputOnly' name='value_changed' type='SFRotation'/>
          <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
          <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_knot' type='MFDouble'/>
          <field accessType='outputOnly' name='knot_changed' type='MFDouble'/>
          <field accessType='inputOnly' name='set_order' type='SFInt32'/>
          <field accessType='outputOnly' name='order_changed' type='SFInt32'/>
          <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
          <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
          <IS>
            <connect nodeField='set_fraction' protoField='set_fraction'/>
            <connect nodeField='controlPoint' protoField='controlPoint'/>
            <connect nodeField='knot' protoField='knot'/>
            <connect nodeField='order' protoField='order'/>
            <connect nodeField='weight' protoField='weight'/>
            <connect nodeField='value_changed' protoField='value_changed'/>
            <connect nodeField='set_controlPoint' protoField='set_controlPoint'/>
            <connect nodeField='controlPoint_changed' protoField='controlPoint_changed'/>
            <connect nodeField='set_knot' protoField='set_knot'/>
            <connect nodeField='knot_changed' protoField='knot_changed'/>
            <connect nodeField='set_order' protoField='set_order'/>
            <connect nodeField='order_changed' protoField='order_changed'/>
            <connect nodeField='set_weight' protoField='set_weight'/>
            <connect nodeField='weight_changed' protoField='weight_changed'/>
          </IS>
        </Script>
        <!-- Nonrendering holder node for controlPoint Coordinate data -->
        <Shape>
          <PointSet>
            <IS>
              <connect nodeField='coord' protoField='controlPoint'/>
            </IS>
          </PointSet>
        </Shape>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsPatchSurface defines a contiguous 3D Non- rational Uniform B-Spline (NURBS) Surface.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsPatchSurface' name='NurbsPatchSurface'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'>
          <Coordinate containerField='controlPoint'/>
        </field>
        <field accessType='initializeOnly' name='texCoord' type='SFNode'>
          <TextureCoordinate/>
        </field>
        <field accessType='initializeOnly' name='uTessellation' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' name='vTessellation' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' name='solid' type='SFBool' value='true'/>
        <field accessType='initializeOnly' name='uClosed' type='SFBool' value='false'/>
        <field accessType='initializeOnly' name='uDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' name='uKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' name='uOrder' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' name='vClosed' type='SFBool' value='false'/>
        <field accessType='initializeOnly' name='vDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' name='vKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' name='vOrder' type='SFInt32' value='3'/>
        <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_texCoord' type='SFNode'/>
        <field accessType='outputOnly' name='texCoord_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_uTessellation' type='SFInt32'/>
        <field accessType='outputOnly' name='uTessellation_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_vTessellation' type='SFInt32'/>
        <field accessType='outputOnly' name='vTessellation_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedFaceSet DEF='NurbsPatchSurfaceFaceSet' creaseAngle='3.14' solid='false'>
          <IS>
            <connect nodeField='texCoord' protoField='texCoord'/>
            <connect nodeField='solid' protoField='solid'/>
          </IS>
          <Coordinate DEF='NurbsPatchSurfaceCoordinate'/>
        </IndexedFaceSet>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsPatchSurfaceScript' directOutput='true' mustEvaluate='true' url='"NurbsPatchSurface.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsPatchSurface.class"'>
          <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'/>
          <field accessType='initializeOnly' name='texCoord' type='SFNode'/>
          <field accessType='initializeOnly' name='uTessellation' type='SFInt32'/>
          <field accessType='initializeOnly' name='vTessellation' type='SFInt32'/>
          <field accessType='initializeOnly' name='weight' type='MFDouble'/>
          <field accessType='initializeOnly' name='solid' type='SFBool'/>
          <field accessType='initializeOnly' name='uClosed' type='SFBool'/>
          <field accessType='initializeOnly' name='uDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='uKnot' type='MFDouble'/>
          <field accessType='initializeOnly' name='uOrder' type='SFInt32'/>
          <field accessType='initializeOnly' name='vClosed' type='SFBool'/>
          <field accessType='initializeOnly' name='vDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='vKnot' type='MFDouble'/>
          <field accessType='initializeOnly' name='vOrder' type='SFInt32'/>
          <field accessType='outputOnly' name='coord' type='MFVec3f'/>
          <field accessType='outputOnly' name='coordIndex' type='MFInt32'/>
          <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
          <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_texCoord' type='SFNode'/>
          <field accessType='outputOnly' name='texCoord_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
          <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
          <field accessType='inputOnly' name='set_uTessellation' type='SFInt32'/>
          <field accessType='outputOnly' name='uTessellation_changed' type='SFInt32'/>
          <field accessType='inputOnly' name='set_vTessellation' type='SFInt32'/>
          <field accessType='outputOnly' name='vTessellation_changed' type='SFInt32'/>
          <IS>
            <connect nodeField='controlPoint' protoField='controlPoint'/>
            <connect nodeField='texCoord' protoField='texCoord'/>
            <connect nodeField='uTessellation' protoField='uTessellation'/>
            <connect nodeField='vTessellation' protoField='vTessellation'/>
            <connect nodeField='weight' protoField='weight'/>
            <connect nodeField='solid' protoField='solid'/>
            <connect nodeField='uClosed' protoField='uClosed'/>
            <connect nodeField='uDimension' protoField='uDimension'/>
            <connect nodeField='uKnot' protoField='uKnot'/>
            <connect nodeField='uOrder' protoField='uOrder'/>
            <connect nodeField='vClosed' protoField='vClosed'/>
            <connect nodeField='vDimension' protoField='vDimension'/>
            <connect nodeField='vKnot' protoField='vKnot'/>
            <connect nodeField='vOrder' protoField='vOrder'/>
            <connect nodeField='set_controlPoint' protoField='set_controlPoint'/>
            <connect nodeField='controlPoint_changed' protoField='controlPoint_changed'/>
            <connect nodeField='set_texCoord' protoField='set_texCoord'/>
            <connect nodeField='texCoord_changed' protoField='texCoord_changed'/>
            <connect nodeField='set_uTessellation' protoField='set_uTessellation'/>
            <connect nodeField='uTessellation_changed' protoField='uTessellation_changed'/>
            <connect nodeField='set_vTessellation' protoField='set_vTessellation'/>
            <connect nodeField='vTessellation_changed' protoField='vTessellation_changed'/>
            <connect nodeField='set_weight' protoField='set_weight'/>
            <connect nodeField='weight_changed' protoField='weight_changed'/>
          </IS>
        </Script>
        <ROUTE fromField='coord' fromNode='NurbsPatchSurfaceScript' toField='set_point' toNode='NurbsPatchSurfaceCoordinate'/>
        <ROUTE fromField='coordIndex' fromNode='NurbsPatchSurfaceScript' toField='set_coordIndex' toNode='NurbsPatchSurfaceFaceSet'/>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsPositionInterpolator describes a 3D NURBS Curve and outputs interpolated position values. The SFNode controlPoint field can contain a single Coordinate or CoordinateDouble node.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsPositionInterpolator' name='NurbsPositionInterpolator'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='range (-∞,∞)' name='set_fraction' type='SFFloat'/>
        <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'>
          <Coordinate containerField='controlPoint'/>
        </field>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='knot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range (2,∞)' name='order' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='outputOnly' name='value_changed' type='SFVec3f'/>
        <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_knot' type='MFDouble'/>
        <field accessType='outputOnly' name='knot_changed' type='MFDouble'/>
        <field accessType='inputOnly' name='set_order' type='SFInt32'/>
        <field accessType='outputOnly' name='order_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsPositionInterpolatorScript' directOutput='true' mustEvaluate='true' url='"NurbsPositionInterpolator.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsPositionInterpolator.class"'>
          <field accessType='inputOnly' name='set_fraction' type='SFFloat'/>
          <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'/>
          <field accessType='initializeOnly' name='knot' type='MFDouble'/>
          <field accessType='initializeOnly' name='order' type='SFInt32'/>
          <field accessType='initializeOnly' name='weight' type='MFDouble'/>
          <field accessType='outputOnly' name='value_changed' type='SFVec3f'/>
          <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
          <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_knot' type='MFDouble'/>
          <field accessType='outputOnly' name='knot_changed' type='MFDouble'/>
          <field accessType='inputOnly' name='set_order' type='SFInt32'/>
          <field accessType='outputOnly' name='order_changed' type='SFInt32'/>
          <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
          <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
          <IS>
            <connect nodeField='set_fraction' protoField='set_fraction'/>
            <connect nodeField='controlPoint' protoField='controlPoint'/>
            <connect nodeField='knot' protoField='knot'/>
            <connect nodeField='order' protoField='order'/>
            <connect nodeField='weight' protoField='weight'/>
            <connect nodeField='value_changed' protoField='value_changed'/>
            <connect nodeField='set_controlPoint' protoField='set_controlPoint'/>
            <connect nodeField='controlPoint_changed' protoField='controlPoint_changed'/>
            <connect nodeField='set_knot' protoField='set_knot'/>
            <connect nodeField='knot_changed' protoField='knot_changed'/>
            <connect nodeField='set_order' protoField='set_order'/>
            <connect nodeField='order_changed' protoField='order_changed'/>
            <connect nodeField='set_weight' protoField='set_weight'/>
            <connect nodeField='weight_changed' protoField='weight_changed'/>
          </IS>
        </Script>
        <!-- Nonrendering holder node for controlPoint Coordinate data -->
        <Shape>
          <PointSet>
            <IS>
              <connect nodeField='coord' protoField='controlPoint'/>
            </IS>
          </PointSet>
        </Shape>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsSet collects a set of NurbsPatchSurface nodes into a common group and treats NurbsPatchSurface set as a unit during tessellation thereby enforcing tessellation continuity along borders.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsSet' name='NurbsSet'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='[NurbsPatchSurface]' name='addGeometry' type='MFNode'/>
        <field accessType='inputOnly' appinfo='[NurbsPatchSurface]' name='removeGeometry' type='MFNode'/>
        <field accessType='initializeOnly' appinfo='[NurbsPatchSurface]' name='geometry' type='MFNode'>
          <!-- default is empty node array -->
        </field>
        <field accessType='initializeOnly' appinfo='range (0,∞)' name='tessellationScale' type='SFFloat' value='1.0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='bboxCenter' type='SFVec3f' value='0 0 0'/>
        <field accessType='initializeOnly' appinfo='range [0,∞); [-1 -1 -1]' name='bboxSize' type='SFVec3f' value='-1 -1 -1'/>
        <field accessType='inputOnly' name='set_geometry' type='MFNode'/>
        <field accessType='outputOnly' name='geometry_changed' type='MFNode'/>
        <field accessType='inputOnly' name='set_tessellationScale' type='SFFloat'/>
        <field accessType='outputOnly' name='tessellationScale_changed' type='SFFloat'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <Group DEF='NurbsSet'>
          <IS>
            <connect nodeField='addGeometry' protoField='addGeometry'/>
            <connect nodeField='removeGeometry' protoField='removeGeometry'/>
            <connect nodeField='geometry' protoField='geometry'/>
            <connect nodeField='bboxCenter' protoField='bboxCenter'/>
            <connect nodeField='bboxSize' protoField='bboxSize'/>
            <connect nodeField='set_geometry' protoField='set_geometry'/>
            <connect nodeField='geometry_changed' protoField='geometry_changed'/>
            <connect nodeField='set_tessellationScale' protoField='set_tessellationScale'/>
            <connect nodeField='tessellationScale_changed' protoField='tessellationScale_changed'/>
          </IS>
        </Group>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsSurfaceInterpolator describes a 3D NURBS Curve and outputs interpolated position and normal values. The SFNode controlPoint field can contain a single Coordinate or CoordinateDouble node.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsSurfaceInterpolator' name='NurbsSurfaceInterpolator'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='range (-∞,∞)' name='set_fraction' type='SFVec2f'/>
        <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'>
          <Coordinate containerField='controlPoint'/>
        </field>
        <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='outputOnly' name='position_changed' type='SFVec3f'/>
        <field accessType='outputOnly' name='normal_changed' type='SFVec3f'/>
        <field accessType='initializeOnly' appinfo='range [0,∞)' name='uDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='uKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='uOrder' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' appinfo='range [0,∞)' name='vDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='vKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='vOrder' type='SFInt32' value='3'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedFaceSet DEF='NurbsSurfaceInterpolatorFaceSet' creaseAngle='3.14' solid='false'>
          <Coordinate DEF='NurbsSurfaceInterpolatorCoordinate'/>
        </IndexedFaceSet>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsSurfaceInterpolatorScript' directOutput='true' mustEvaluate='true' url='"NurbsSurfaceInterpolator.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsSurfaceInterpolator.class"'>
          <field accessType='initializeOnly' name='controlPoint' type='SFNode'/>
          <field accessType='initializeOnly' name='weight' type='MFDouble'/>
          <field accessType='initializeOnly' name='uDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='uKnot' type='MFDouble'/>
          <field accessType='initializeOnly' name='uOrder' type='SFInt32'/>
          <field accessType='initializeOnly' name='vDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='vKnot' type='MFDouble'/>
          <field accessType='initializeOnly' name='vOrder' type='SFInt32'/>
          <field accessType='outputOnly' name='coord' type='MFVec3f'/>
          <field accessType='outputOnly' name='coordIndex' type='MFInt32'/>
          <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
          <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
          <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
          <IS>
            <connect nodeField='controlPoint' protoField='controlPoint'/>
            <connect nodeField='weight' protoField='weight'/>
            <connect nodeField='uDimension' protoField='uDimension'/>
            <connect nodeField='uKnot' protoField='uKnot'/>
            <connect nodeField='uOrder' protoField='uOrder'/>
            <connect nodeField='vDimension' protoField='vDimension'/>
            <connect nodeField='vKnot' protoField='vKnot'/>
            <connect nodeField='vOrder' protoField='vOrder'/>
            <connect nodeField='set_controlPoint' protoField='set_controlPoint'/>
            <connect nodeField='controlPoint_changed' protoField='controlPoint_changed'/>
            <connect nodeField='set_weight' protoField='set_weight'/>
            <connect nodeField='weight_changed' protoField='weight_changed'/>
          </IS>
        </Script>
        <ROUTE fromField='coord' fromNode='NurbsSurfaceInterpolatorScript' toField='set_point' toNode='NurbsSurfaceInterpolatorCoordinate'/>
        <ROUTE fromField='coordIndex' fromNode='NurbsSurfaceInterpolatorScript' toField='set_coordIndex' toNode='NurbsSurfaceInterpolatorFaceSet'/>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsSweptSurface contains a crossSectionCurve [X3DNurbsControlCurveNode] and a trajectoryCurve [NurbsCurve]' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsSweptSurface' name='NurbsSweptSurface'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='[X3DNurbsControlCurveNode]' name='crossSectionCurve' type='SFNode'>
          <!-- put default node here... -->
        </field>
        <field accessType='initializeOnly' appinfo='[NurbsCurve]' name='trajectoryCurve' type='SFNode'>
          <!-- put default node here... -->
        </field>
        <field accessType='initializeOnly' name='ccw' type='SFBool' value='true'/>
        <field accessType='initializeOnly' name='solid' type='SFBool' value='true'/>
        <field accessType='inputOnly' appinfo='[X3DNurbsControlCurveNode]' name='set_crossSectionCurve' type='SFNode'/>
        <field accessType='outputOnly' appinfo='[X3DNurbsControlCurveNode]' name='crossSectionCurve_changed' type='SFNode'/>
        <field accessType='inputOnly' appinfo='[NurbsCurve]' name='set_trajectoryCurve' type='SFNode'/>
        <field accessType='outputOnly' appinfo='[NurbsCurve]' name='trajectoryCurve_changed' type='SFNode'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedFaceSet DEF='NurbsSweptSurfaceFaceSet' creaseAngle='3.14' solid='false'>
          <IS>
            <connect nodeField='ccw' protoField='ccw'/>
            <connect nodeField='solid' protoField='solid'/>
          </IS>
          <Coordinate DEF='NurbsSweptSurfaceCoordinate'/>
        </IndexedFaceSet>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsSweptSurfaceScript' directOutput='true' mustEvaluate='true' url='"NurbsSweptSurface.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbsSweptSurface.class"'>
          <field accessType='initializeOnly' appinfo='[X3DNurbsControlCurveNode]' name='crossSectionCurve' type='SFNode'/>
          <field accessType='initializeOnly' appinfo='[NurbsCurve]' name='trajectoryCurve' type='SFNode'/>
          <field accessType='initializeOnly' name='ccw' type='SFBool'/>
          <field accessType='initializeOnly' name='solid' type='SFBool'/>
          <field accessType='inputOnly' appinfo='[X3DNurbsControlCurveNode]' name='set_crossSectionCurve' type='SFNode'/>
          <field accessType='outputOnly' appinfo='[X3DNurbsControlCurveNode]' name='crossSectionCurve_changed' type='SFNode'/>
          <field accessType='inputOnly' appinfo='[NurbsCurve]' name='set_trajectoryCurve' type='SFNode'/>
          <field accessType='outputOnly' appinfo='[NurbsCurve]' name='trajectoryCurve_changed' type='SFNode'/>
          <IS>
            <connect nodeField='crossSectionCurve' protoField='crossSectionCurve'/>
            <connect nodeField='trajectoryCurve' protoField='trajectoryCurve'/>
            <connect nodeField='ccw' protoField='ccw'/>
            <connect nodeField='solid' protoField='solid'/>
            <connect nodeField='set_crossSectionCurve' protoField='set_crossSectionCurve'/>
            <connect nodeField='crossSectionCurve_changed' protoField='crossSectionCurve_changed'/>
            <connect nodeField='set_trajectoryCurve' protoField='set_trajectoryCurve'/>
            <connect nodeField='trajectoryCurve_changed' protoField='trajectoryCurve_changed'/>
          </IS>
        </Script>
        <ROUTE fromField='crossSectionCurve_changed' fromNode='NurbsSweptSurfaceScript' toField='coord' toNode='NurbsSweptSurfaceFaceSet'/>
        <ROUTE fromField='coordIndex' fromNode='NurbsSweptSurfaceScript' toField='set_coordIndex' toNode='NurbsSweptSurfaceFaceSet'/>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsSwungSurface contains a profileCurve [X3DNurbsControlCurveNode] and a trajectoryCurve [X3DNurbsControlCurveNode]' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsSwungSurface' name='NurbsSwungSurface'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='[X3DNurbsControlCurveNode]' name='profileCurve' type='SFNode'/>
        <field accessType='inputOnly' appinfo='[X3DNurbsControlCurveNode]' name='trajectoryCurve' type='SFNode'/>
        <field accessType='initializeOnly' name='ccw' type='SFBool' value='true'/>
        <field accessType='initializeOnly' name='solid' type='SFBool' value='true'/>
        <field accessType='inputOnly' name='set_profileCurve' type='SFNode'/>
        <field accessType='outputOnly' name='profileCurve_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_trajectoryCurve' type='SFNode'/>
        <field accessType='outputOnly' name='trajectoryCurve_changed' type='SFNode'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedFaceSet DEF='NurbsSwungSurfaceFaceSet' creaseAngle='3.14' solid='false'>
          <IS>
            <connect nodeField='ccw' protoField='ccw'/>
            <connect nodeField='solid' protoField='solid'/>
          </IS>
          <Coordinate DEF='NurbsSwungSurfaceCoordinate'/>
        </IndexedFaceSet>
        <!-- Warning: VRML97-style scripting, not X3D Scene Authoring Interface (SAI) -->
        <Script DEF='NurbsSwungSurfaceScript' directOutput='true' mustEvaluate='true' url='"NurbSwungSurface.class" "https://www.web3d.org/x3d/content/examples/Basic/NURBS/NurbSwungSurface.class"'>
          <field accessType='inputOnly' appinfo='[X3DNurbsControlCurveNode]' name='profileCurve' type='SFNode'/>
          <field accessType='inputOnly' appinfo='[X3DNurbsControlCurveNode]' name='trajectoryCurve' type='SFNode'/>
          <field accessType='initializeOnly' name='ccw' type='SFBool'/>
          <field accessType='initializeOnly' name='solid' type='SFBool'/>
          <field accessType='inputOnly' name='set_profileCurve' type='SFNode'/>
          <field accessType='outputOnly' name='profileCurve_changed' type='SFNode'/>
          <field accessType='inputOnly' name='set_trajectoryCurve' type='SFNode'/>
          <field accessType='outputOnly' name='trajectoryCurve_changed' type='SFNode'/>
          <IS>
            <connect nodeField='profileCurve' protoField='profileCurve'/>
            <connect nodeField='trajectoryCurve' protoField='trajectoryCurve'/>
            <connect nodeField='ccw' protoField='ccw'/>
            <connect nodeField='solid' protoField='solid'/>
            <connect nodeField='set_profileCurve' protoField='set_profileCurve'/>
            <connect nodeField='profileCurve_changed' protoField='profileCurve_changed'/>
            <connect nodeField='set_trajectoryCurve' protoField='set_trajectoryCurve'/>
            <connect nodeField='trajectoryCurve_changed' protoField='trajectoryCurve_changed'/>
          </IS>
        </Script>
        <ROUTE fromField='coord' fromNode='NurbsSwungSurfaceScript' toField='set_point' toNode='NurbsSwungSurfaceCoordinate'/>
        <ROUTE fromField='coordIndex' fromNode='NurbsSwungSurfaceScript' toField='set_coordIndex' toNode='NurbsSwungSurfaceFaceSet'/>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsTextureCoordinate describes a 3D NURBS surface in the parametric domain of its surface host specifying mapping of texture onto the surface. The SFNode controlPoint field can contain a single Coordinate or CoordinateDouble node.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsTextureCoordinate' name='NurbsTextureCoordinate'>
      <ProtoInterface>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='controlPoint' type='MFVec2f'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range (0,∞)' name='weight' type='MFFloat'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [0,∞)' name='uDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='uKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='uOrder' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' appinfo='range [0,∞)' name='vDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='vKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='vOrder' type='SFInt32' value='3'/>
        <field accessType='inputOnly' name='set_controlPoint' type='MFVec2f'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='MFVec2f'/>
        <field accessType='inputOnly' name='set_weight' type='MFFloat'/>
        <field accessType='outputOnly' name='weight_changed' type='MFFloat'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedLineSet DEF='NurbsTextureCoordinateIls' coordIndex='1 2 3 -1 5 6 7 -1'>
          <Coordinate DEF='NurbsTextureCoordinateIlsCoordinate'>
            <IS>
              <connect nodeField='point' protoField='controlPoint'/>
            </IS>
          </Coordinate>
        </IndexedLineSet>
        <Script DEF='NurbsTextureCoordinateScript' directOutput='true'>
          <field accessType='initializeOnly' name='uDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='vDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='ils' type='SFNode'>
            <IndexedLineSet USE='NurbsTextureCoordinateIls'/>
          </field>
          <field accessType='initializeOnly' name='localCoordIndex' type='MFInt32'>
            <!-- local computations array prior to sending completed event -->
          </field>
          <IS>
            <connect nodeField='uDimension' protoField='uDimension'/>
            <connect nodeField='vDimension' protoField='vDimension'/>
          </IS>
          <![CDATA[
ecmascript:
function initialize() {
        //Browser.println ('Sorry, your browser does not support NURBS nodes');
        counter = 0;
        number = 0;
        localCoordIndex = new MFInt32();
        localCoordIndex.length = 2*vDimension * uDimension + uDimension + vDimension;

        for(v=0; v<vDimension;v++)
        {
                for(u=0; u<uDimension;u++)
                {
                        localCoordIndex[counter] = number;
                        counter++;
                        number++;
                }
                localCoordIndex[counter] = -1; counter++;
        }

        for(u=0; u<uDimension;u++)
        {
                for(v=0; v<vDimension;v++)
                {
                        localCoordIndex[counter] = v*uDimension + u;
                        counter++;
                        number++;
                }
                localCoordIndex[counter] = -1; counter++;
        }
        ils.set_coordIndex = localCoordIndex;
}
]]>
        </Script>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoDeclare appinfo='NurbsTrimmedSurface generates texture coordinates from a Non-rational Uniform B-Spline (NURBS) surface.' documentation='https://www.web3d.org/x3d/content/X3dTooltips.html#NurbsTrimmedSurface' name='NurbsTrimmedCoordinate'>
      <ProtoInterface>
        <field accessType='inputOnly' appinfo='Contour2D' name='addTrimmingContour' type='MFNode'/>
        <field accessType='inputOnly' appinfo='Contour2D' name='removeTrimmingContour' type='MFNode'/>
        <field accessType='initializeOnly' appinfo='[X3DCoordinateNode]' name='controlPoint' type='SFNode'>
          <Coordinate containerField='controlPoint'/>
        </field>
        <field accessType='initializeOnly' appinfo='X3DTextureCoordinateNode|NurbsTextureCoordinate' name='texCoord' type='SFNode'>
          <TextureCoordinate/>
        </field>
        <field accessType='initializeOnly' appinfo='Contour2D' name='trimmingContour' type='MFNode'>
          <Contour2D/>
        </field>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='uTessellation' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='vTessellation' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (0,∞)' name='weight' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' name='solid' type='SFBool' value='true'/>
        <field accessType='initializeOnly' name='uClosed' type='SFBool' value='false'/>
        <field accessType='initializeOnly' appinfo='range [0,∞)' name='uDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='uKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='uOrder' type='SFInt32' value='3'/>
        <field accessType='initializeOnly' name='vClosed' type='SFBool' value='false'/>
        <field accessType='initializeOnly' appinfo='range [0,∞)' name='vDimension' type='SFInt32' value='0'/>
        <field accessType='initializeOnly' appinfo='range (-∞,∞)' name='vKnot' type='MFDouble'>
          <!-- default is empty array -->
        </field>
        <field accessType='initializeOnly' appinfo='range [2,∞)' name='vOrder' type='SFInt32' value='3'/>
        <field accessType='inputOnly' name='set_controlPoint' type='SFNode'/>
        <field accessType='outputOnly' name='controlPoint_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_texCoord' type='SFNode'/>
        <field accessType='outputOnly' name='texCoord_changed' type='SFNode'/>
        <field accessType='inputOnly' name='set_trimmingContour' type='MFNode'/>
        <field accessType='outputOnly' name='trimmingContour_changed' type='MFNode'/>
        <field accessType='inputOnly' name='set_uTessellation' type='SFInt32'/>
        <field accessType='outputOnly' name='uTessellation_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_vTessellation' type='SFInt32'/>
        <field accessType='outputOnly' name='vTessellation_changed' type='SFInt32'/>
        <field accessType='inputOnly' name='set_weight' type='MFDouble'/>
        <field accessType='outputOnly' name='weight_changed' type='MFDouble'/>
        <field accessType='inputOutput' appinfo='Metadata node only' name='metadata' type='SFNode'>
          <!-- Specification initialization: NULL node -->
        </field>
        <field accessType='initializeOnly' name='localCoordIndex' type='MFInt32'>
          <!-- local computations array prior to sending completed event -->
        </field>
      </ProtoInterface>
      <ProtoBody>
        <IndexedLineSet DEF='NurbsTextureSurfaceIls' coordIndex='1 2 3 -1 5 6 7 -1'>
          <Coordinate DEF='NurbsTextureSurfaceIlsCoordinate'>
            <IS>
              <connect nodeField='point' protoField='controlPoint'/>
            </IS>
          </Coordinate>
        </IndexedLineSet>
        <Script DEF='NurbsTextureSurfaceScript' directOutput='true'>
          <field accessType='initializeOnly' name='uDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='vDimension' type='SFInt32'/>
          <field accessType='initializeOnly' name='ils' type='SFNode'>
            <IndexedLineSet USE='NurbsTextureSurfaceIls'/>
          </field>
          <IS>
            <connect nodeField='uDimension' protoField='uDimension'/>
            <connect nodeField='vDimension' protoField='vDimension'/>
          </IS>
          <![CDATA[
ecmascript:
function initialize() {
    //Browser.println ('Sorry, your browser does not support NURBS nodes');
    counter = 0;
    number = 0;
    localCoordIndex = new MFInt32();
    localCoordIndexlength = 2*vDimension * uDimension + uDimension + vDimension;

    for(v=0; v<vDimension;v++)
    {
            for(u=0; u<uDimension;u++)
            {
                    localCoordIndex[counter] = number;
                    counter++;
                    number++;
            }
            localCoordIndex[counter] = -1; counter++;
    }
    for(u=0; u<uDimension;u++)
    {
            for(v=0; v<vDimension;v++)
            {
                    localCoordIndex[counter] = v*uDimension + u;
                    counter++;
                    number++;
            }
            localCoordIndex[counter] = -1; counter++;
    }
    ils.set_coordIndex = localCoordIndex;
}
]]>
        </Script>
      </ProtoBody>
    </ProtoDeclare>
    <Shape>
      <Appearance>
        <Material diffuseColor='0.8 0.6 0.2'/>
      </Appearance>
      <Text string='"NurbsPrototypes is a" "developmental file for" "Nurbs implementations."'>
        <FontStyle justify='"MIDDLE" "MIDDLE"' size='0.7'/>
      </Text>
    </Shape>
  </Scene>
</X3D>