X3D Model Documentation: RenderingComponentPrototypes.x3d

  1  <?xml version="1.0" encoding="UTF-8"?>
  2 
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
  3  <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'>
  4       <head>
  5            <meta name='titlecontent='RenderingComponentPrototypes.x3d'/>
  6            <meta name='descriptioncontent='Prototype implementations of X3D Rendering component nodes (IndexedTriangleFanSet IndexedTriangleSet IndexedTriangleStripSet LineSet TriangleFanSet TriangleSet TriangleStripSet) implemented as prototypes for backwards compatibility with VRML 97.'/>
  7            <meta name='infocontent='X3dToVrml97.xslt translation stylesheet automatically invokes these prototypes upon encountering any new Rendering nodes.'/>
  8            <meta name='creatorcontent='Don Brutzman, George Dabrowski, Ken Curtin, Duane Davis, Christos Kalogrias'/>
  9            <meta name='createdcontent='17 November 2003'/>
 10            <meta name='modifiedcontent='9 October 2023'/>
 11            <meta name='referencecontent='RenderingComponentExamples.x3d'/>
 12            <meta name='referencecontent='RenderingComponentExternProtoDefinitions.x3d'/>
 13            <meta name='referencecontent='https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/rendering.html'/>
 14            <meta name='referencecontent='https://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Chapter13-PointsLinesFaces/Figure13.11IndexedLineSetBoxWireframe.x3d'/>
 15            <meta name='subjectcontent='X3D Rendering component nodes (IndexedTriangleFanSet IndexedTriangleSet IndexedTriangleStripSet LineSet TriangleFanSet TriangleSet TriangleStripSet)'/>
 16            <meta name='identifiercontent='https://www.web3d.org/x3d/content/examples/Basic/development/RenderingComponentPrototypes.x3d'/>
 17            <meta name='generatorcontent='X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit'/>
 18            <meta name='licensecontent='../license.html'/>
 19       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top Index for DEF nodes: ColorRGB, ColorRGBAholder, ConvertColorRGBAtoRGB, IndexedTriangleFanSetToIndexedFaceSet, IndexedTriangleSetToIndexedFaceSet, IndexedTriangleStripSetToIndexedFaceSet, LineSetToIndexedLineSet, LinkToExamples, NodesHolderILS, NodesHolderITFS, NodesHolderITS, NodesHolderTFS, NodesHolderTS, NodesHolderTSS, RenderedILS, RenderedITFS, RenderedITS, RenderedTFS, RenderedTS, RenderedTSS, TriangleFanSetToIndexedFaceSet, TriangleSetToIndexedFaceSet, UnrenderedITFS, UnrenderedITS, UnrenderedTFS, UnrenderedTS, UnusedAppearance

Index for ProtoDeclare definitions: ColorRGBA, IndexedTriangleFanSet, IndexedTriangleSet, IndexedTriangleStripSet, LineSet, TriangleFanSet, TriangleSet, TriangleStripSet
-->
 20       <Scene>
 21            <!-- ==================== -->
 22            <WorldInfo title='RenderingComponentPrototypes.x3d'/>
 23            <ProtoDeclare name='ColorRGBAappinfo='ColorRGBA defines a set of RGBA colors. Warning: VRML 97 support does not include alpha values.'>
 24                 <ProtoInterface>
 25                      <field name='colortype='MFRotationaccessType='inputOutput'
                     appinfo='locally override MFColorRGBA type (which is not supported in VRML 97) in order to downgrade to Color RGB'>
 26                           <!-- The color field is a 4-tuple float array, and so we map it to an MFOrientation for backwards compatibility with VRML 97. -->
 27                      </field>
 28                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
 29                           <!-- default initialization is NULL node to match X3D specification -->
 30                      </field>
 31                 </ProtoInterface>
 32                 <ProtoBody>
 33 
                    <!-- Color ColorRGB is a DEF node that has 1 USE node: USE_1 -->
                    <Color DEF='ColorRGBcolor='0.8 0.8 0.8'/>
 34                      <!-- remaining nodes are not rendered -->
 35 
                    <!-- OrientationInterpolator ColorRGBAholder is a DEF node that has 1 USE node: USE_1 -->
                    <OrientationInterpolator DEF='ColorRGBAholder'>
 36                           <IS>
 37                                <connect nodeField='keyValueprotoField='color'/>
 38                           </IS>
 39                      </OrientationInterpolator>
 40                      <Script DEF='ConvertColorRGBAtoRGBdirectOutput='true'>
 41                           <field name='colorRGBAnodetype='SFNodeaccessType='initializeOnly'>
 42                                <OrientationInterpolator USE='ColorRGBAholder'/>
 43                           </field>
 44                           <field name='colorRGBnodetype='SFNodeaccessType='initializeOnly'>
 45                                <Color USE='ColorRGB'/>
 46                           </field>
  <![CDATA[
          
ecmascript:

function initialize () 
{
//	Browser.println ('colorRGBAnode.keyValue.length=' + colorRGBAnode.keyValue.length);
	for (i=0; i<=colorRGBAnode.keyValue.length-1; i++)
	{
		// type conversion of each array element
		// specifically, colorRGBAnode.keyValue[i] is an SFRotation
		// and individual element values are then extracted from that
		nextColor = new SFColor (
			colorRGBAnode.keyValue[i].x,
			colorRGBAnode.keyValue[i].y,
			colorRGBAnode.keyValue[i].z);
		// note colorRGBAnode.keyValue[i].angle holds the alpha value; ignored 
//		Browser.println ('color[' + i + ']=' + nextColor);
		colorRGBnode.color[i] = nextColor;
	}
}

        
]]>
 48                      </Script>
 49                      <Group>
 50                           <MetadataSet>
 51                                <IS>
 52                                     <connect nodeField='metadataprotoField='metadata'/>
 53                                </IS>
 54                           </MetadataSet>
 55                      </Group>
 56                 </ProtoBody>
 57            </ProtoDeclare>
 58            <!-- ==================== -->
 59            <ProtoDeclare name='IndexedTriangleFanSetappinfo='IndexedTriangleFanSet represents a 3D shape composed of triangles that form a fan shape around the first vertex declared in each fan.'>
 60                 <ProtoInterface>
 61                      <field name='ccwtype='SFBoolvalue='trueaccessType='initializeOnly'/>
 62                      <field name='colorPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
 63                      <field name='normalPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
 64                      <field name='solidtype='SFBoolvalue='trueaccessType='initializeOnly'/>
 65                      <field name='set_indextype='MFInt32accessType='inputOnly'
                     appinfo='[0 infinity] or -1'/>
 66                      <field name='indextype='MFInt32accessType='initializeOnly'
                     appinfo='[0 infinity] or -1'>
 67                           <!-- default initialization is NULL array [] to match X3D specification -->
 68                      </field>
 69                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
 70                           <!-- default initialization is NULL node to match X3D specification -->
 71                      </field>
 72                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
 73                           <!-- default initialization is NULL node to match X3D specification -->
 74                      </field>
 75                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
 76                           <!-- default initialization is NULL node to match X3D specification -->
 77                      </field>
 78                      <field name='normaltype='SFNodeaccessType='inputOutput'
                     appinfo='Normal node only'>
 79                           <!-- default initialization is NULL node to match X3D specification -->
 80                      </field>
 81                      <field name='texCoordtype='SFNodeaccessType='inputOutput'
                     appinfo='TextureCoordinate node only'>
 82                           <!-- default initialization is NULL node to match X3D specification -->
 83                      </field>
 84                 </ProtoInterface>
 85                 <ProtoBody>
 86 
                    <!-- IndexedFaceSet RenderedITFS is a DEF node that has 1 USE node: USE_1 -->
                    <IndexedFaceSet DEF='RenderedITFS'>
 87                           <IS>
 88                                <connect nodeField='ccwprotoField='ccw'/>
 89                                <connect nodeField='normalPerVertexprotoField='normalPerVertex'/>
 90                                <connect nodeField='solidprotoField='solid'/>
 91                                <connect nodeField='colorprotoField='color'/>
 92                                <connect nodeField='coordprotoField='coord'/>
 93                                <connect nodeField='normalprotoField='normal'/>
 94                                <connect nodeField='texCoordprotoField='texCoord'/>
 95                           </IS>
 96                      </IndexedFaceSet>
 97                      <Group DEF='UnrenderedITFS'>
 98                           <Shape>
 99                                <!-- is this really needed at all?? -->
100 
                              <!-- IndexedFaceSet NodesHolderITFS is a DEF node that has 1 USE node: USE_1 -->
                              <IndexedFaceSet DEF='NodesHolderITFS'>
101                                     <IS>
102                                          <connect nodeField='colorprotoField='color'/>
103                                          <connect nodeField='coordprotoField='coord'/>
104                                          <connect nodeField='normalprotoField='normal'/>
105                                          <connect nodeField='texCoordprotoField='texCoord'/>
106                                     </IS>
107                                </IndexedFaceSet>
108                           </Shape>
109                           <Script DEF='IndexedTriangleFanSetToIndexedFaceSetdirectOutput='true'>
110                                <field name='indextype='MFInt32accessType='initializeOnly'/>
111                                <field name='set_indextype='MFInt32accessType='inputOnly'/>
112                                <field name='renderedITFStype='SFNodeaccessType='initializeOnly'>
113                                     <IndexedFaceSet USE='RenderedITFS'/>
114                                </field>
115                                <field name='nodesHoldertype='SFNodeaccessType='initializeOnly'>
116                                     <IndexedFaceSet USE='NodesHolderITFS'/>
117                                </field>
118                                <field name='localTraceEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
119                                <field name='coordIndexNewtype='MFInt32accessType='initializeOnly'>
120                                     <!-- constructed during initialization -->
121                                </field>
122                                <IS>
123                                     <connect nodeField='indexprotoField='index'/>
124                                     <connect nodeField='set_indexprotoField='set_index'/>
125                                </IS>
  <![CDATA[
            
ecmascript:

function initialize()
{
	// index is an array of triangle indices that form a fan shape
	// around the first vertex declared in each fan. The ordering of
	// the vertices is ccw (counter-clockwise).

	// ensure terminated by -1
	if (index[index.length-1] != -1) index[index.length] = -1;

	// ensure legal index values
	for (i=0; i <= index.length-1; i++)
	{
	  if (index[i] < -1)
	  {
		alwaysPrint ('error, index[' + i + ']=' + index[i] +
' is illegal value, treated as -1');
		index[i] = -1;
	  }
	}
	tracePrint ('index.length=' + index.length);
	tracePrint ('index=' + index);

	if (index.length < 4) 
	{
		alwaysPrint ('warning, index.length=' + index.length + 
' insufficient to construct a triangle, ITFS ignored');
		return;
	}
	j = 0; // coordIndexNew counter
	coordIndexNew = new MFInt32 ();

	// i walks through index array,
	// goal is to initialize coordIndexNew list to match triangles
	for (i=2; i <= index.length-1; i++)
	{
		if ((index[i] == index[i-1]) || (index[i] == index[i-2]) || (index[i-1] == index[i-2]))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, pair of equal indices in triangle');
			return;
		}
	  if (index[i] >= 0) 
	  {
		// add another triangle from latest 3 points of fan set to IFS
		// swap order to ensure normal is ccw, i.e. in correct halfplane direction
		coordIndexNew [coordIndexNew.length] = 0;
		coordIndexNew [coordIndexNew.length] = index[i];
		coordIndexNew [coordIndexNew.length] = index[i-1];
		coordIndexNew [coordIndexNew.length] = -1; // terminate
	  }
	  else if (index[i] == -1) // finish current triangle, fan
	  {
		// ensure done, or sufficient points remain to build another triangle
		if (	(i!=index.length-1) && (index.length - i < 2))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, insufficient index values after' +
	'index[' + i + ']=-1');
			return;
		}
		// ensure done, or enough legal index values remain to build another triangle
		if (	(i!=index.length-1) &&
			((index[i+1] == -1) || (index[i+2] == -1) || (index[i+3] == -1)))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, insufficient non-negative-one index values after' +
	'index[' + i + ']=-1');
			return;
		}
		tracePrint ('encountered -1 in index array');
		// skip ahead to build next fan set, no effect if done
		if (i!=index.length-1) i = i + 2; 
	  }
	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	}
	renderedITFS.set_coordIndex = coordIndexNew;
	tracePrint ('renderedITFS.coordIndex=' + renderedITFS.coordIndex);
	// match colorIndex if any Color node exists
	if (nodesHolder.color)
	{
	  if (nodesHolder.color.color.length > 0)
	  {
		renderedITFS.set_colorIndex = coordIndexNew;
		tracePrint ('set_colorIndex=' + coordIndexNew);
	  }
	}
}
function set_index (value, timestamp)
{
	index = value;
	initialize ();
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	Browser.println ('[IndexedTriangleFanSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[IndexedTriangleFanSet]' + outputString);
}

          
]]>
127                           </Script>
128                           <Group>
129                                <MetadataString>
130                                     <IS>
131                                          <connect nodeField='metadataprotoField='metadata'/>
132                                     </IS>
133                                </MetadataString>
134                           </Group>
135                      </Group>
136                 </ProtoBody>
137            </ProtoDeclare>
138            <!-- ==================== -->
139            <ProtoDeclare name='IndexedTriangleSetappinfo='IndexedTriangleSet represents a 3D shape composed of a collection of individual triangles.'>
140                 <ProtoInterface>
141                      <field name='ccwtype='SFBoolvalue='trueaccessType='initializeOnly'/>
142                      <field name='colorPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
143                      <field name='normalPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
144                      <field name='solidtype='SFBoolvalue='trueaccessType='initializeOnly'/>
145                      <field name='set_indextype='MFInt32accessType='inputOnly'
                     appinfo='[0 infinity] or -1'/>
146                      <field name='indextype='MFInt32accessType='initializeOnly'
                     appinfo='[0 infinity] or -1'>
147                           <!-- default initialization is NULL array [] to match X3D specification -->
148                      </field>
149                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
150                           <!-- default initialization is NULL node to match X3D specification -->
151                      </field>
152                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
153                           <!-- default initialization is NULL node to match X3D specification -->
154                      </field>
155                      <field name='normaltype='SFNodeaccessType='inputOutput'
                     appinfo='Normal node only'>
156                           <!-- default initialization is NULL node to match X3D specification -->
157                      </field>
158                      <field name='texCoordtype='SFNodeaccessType='inputOutput'
                     appinfo='TextureCoordinate node only'>
159                           <!-- default initialization is NULL node to match X3D specification -->
160                      </field>
161                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
162                           <!-- default initialization is NULL node to match X3D specification -->
163                      </field>
164                 </ProtoInterface>
165                 <ProtoBody>
166 
                    <!-- IndexedFaceSet RenderedITS is a DEF node that has 1 USE node: USE_1 -->
                    <IndexedFaceSet DEF='RenderedITS'>
167                           <IS>
168                                <connect nodeField='ccwprotoField='ccw'/>
169                                <connect nodeField='normalPerVertexprotoField='normalPerVertex'/>
170                                <connect nodeField='solidprotoField='solid'/>
171                                <connect nodeField='colorprotoField='color'/>
172                                <connect nodeField='coordprotoField='coord'/>
173                                <connect nodeField='normalprotoField='normal'/>
174                                <connect nodeField='texCoordprotoField='texCoord'/>
175                           </IS>
176                      </IndexedFaceSet>
177                      <Group DEF='UnrenderedITS'>
178                           <Shape>
179                                <!-- is this really needed at all?? -->
180 
                              <!-- IndexedFaceSet NodesHolderITS is a DEF node that has 1 USE node: USE_1 -->
                              <IndexedFaceSet DEF='NodesHolderITS'>
181                                     <IS>
182                                          <connect nodeField='colorprotoField='color'/>
183                                          <connect nodeField='coordprotoField='coord'/>
184                                          <connect nodeField='normalprotoField='normal'/>
185                                          <connect nodeField='texCoordprotoField='texCoord'/>
186                                     </IS>
187                                </IndexedFaceSet>
188                           </Shape>
189                           <Script DEF='IndexedTriangleSetToIndexedFaceSetdirectOutput='true'>
190                                <field name='indextype='MFInt32accessType='initializeOnly'/>
191                                <field name='set_indextype='MFInt32accessType='inputOnly'/>
192                                <field name='renderedITStype='SFNodeaccessType='initializeOnly'>
193                                     <IndexedFaceSet USE='RenderedITS'/>
194                                </field>
195                                <field name='nodesHoldertype='SFNodeaccessType='initializeOnly'>
196                                     <IndexedFaceSet USE='NodesHolderITS'/>
197                                </field>
198                                <field name='localTraceEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
199                                <field name='coordIndexNewtype='MFInt32accessType='initializeOnly'>
200                                     <!-- constructed during initialization -->
201                                </field>
202                                <IS>
203                                     <connect nodeField='indexprotoField='index'/>
204                                     <connect nodeField='set_indexprotoField='set_index'/>
205                                </IS>
  <![CDATA[
            
ecmascript:

function initialize()
{
	// index is an array of triangle indices. The ordering of
	// the vertices is ccw (counter-clockwise).

	// ensure legal index values
	for (ii=0; ii <= index.length-1; ii++)
	{
	  if (index[ii] < -1)
	  {
		alwaysPrint ('error, index[' + ii + ']=' + index[ii] +
' is illegal value');
		return;
	  }
	}
	tracePrint ('index.length=' + index.length);
	tracePrint ('index=' + index);

	if (index.length < 3) 
	{
		alwaysPrint ('warning, index.length=' + index.length + 
' insufficient to construct a triangle, ITS ignored');
		return;
	}

	coordIndexNew = new MFInt32 ();

	// ii walks through index array,
	// goal is to initialize coordIndexNew list to match triangles
	for (ii=0; ii <= index.length-1; ii+=3)
	{
		if ((index[ii] == index[ii+1]) || (index[ii] == index[ii+2]) || (index[ii+1] == index[ii+2]))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, pair of equal indices in triangle');
			return;
		}
	  
		if (index[ii] >= 0) 
		{
			// add another triangle from latest 3 points of fan set to ITS
			// order is ccw, i.e. in correct halfplane direction
			coordIndexNew [coordIndexNew.length] = index[ii];
			coordIndexNew [coordIndexNew.length] = index[ii+1];
			coordIndexNew [coordIndexNew.length] = index[ii+2];
			coordIndexNew [coordIndexNew.length] = -1;
		}

		if (index.length % 3 != 0) {
			alwaysPrint ('error, index field does not contain a multiple' +
		'of three coordinate values.');
			alwaysPrint ('The remaining vertices shall be ignored');
			return;
		}


		// ensure done, or sufficient points remain to build another triangle
//		if (	(i!=index.length-1) && (index.length - i < 2))
//		{
//			alwaysPrint ('index=' + index);
//			alwaysPrint ('error, insufficient index values after' +
//	'index[' + i + ']=-1');
//			return;
//		}
		// ensure done, or enough legal index values remain to build another triangle
//		if (	(i!=index.length-1) &&
//			((index[i+1] == -1) || (index[i+2] == -1) || (index[i+3] == -1)))
//		{
//			alwaysPrint ('index=' + index);
//			alwaysPrint ('error, insufficient non-negative-one index values after' +
//	'index[' + i + ']=-1');
//			return;
//		}
	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	}
	renderedITS.coordIndex = coordIndexNew;
	tracePrint ('renderedITS.coordIndex=' + renderedITS.coordIndex);

	// match colorIndex if any Color node exists
	if (nodesHolder.color)
	{
	  if (nodesHolder.color.color.length > 0)
	  {
		renderedITS.set_colorIndex = coordIndexNew;
		tracePrint ('set_colorIndex=' + coordIndexNew);
	  }
	}
}
function set_index (value, timestamp)
{
	index = value;
	initialize ();
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	  Browser.println ('[IndexedTriangleSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[IndexedTriangleSet]' + outputString);
}

          
]]>
207                           </Script>
208                           <Group>
209                                <MetadataString>
210                                     <IS>
211                                          <connect nodeField='metadataprotoField='metadata'/>
212                                     </IS>
213                                </MetadataString>
214                           </Group>
215                      </Group>
216                 </ProtoBody>
217            </ProtoDeclare>
218            <!-- ==================== -->
219            <ProtoDeclare name='IndexedTriangleStripSetappinfo='IndexedTriangleStripSet represents a 3D shape composed of strips of triangles.'>
220                 <ProtoInterface>
221                      <field name='ccwtype='SFBoolvalue='trueaccessType='initializeOnly'/>
222                      <field name='colorPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
223                      <field name='normalPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
224                      <field name='solidtype='SFBoolvalue='trueaccessType='initializeOnly'/>
225                      <field name='set_indextype='MFInt32accessType='inputOnly'/>
226                      <field name='indextype='MFInt32accessType='initializeOnly'>
227                           <!-- default initialization is NULL array [] to match X3D specification -->
228                      </field>
229                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
230                           <!-- default initialization is NULL node to match X3D specification -->
231                      </field>
232                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
233                           <!-- default initialization is NULL node to match X3D specification -->
234                      </field>
235                      <field name='normaltype='SFNodeaccessType='inputOutput'
                     appinfo='Normal node only'>
236                           <!-- default initialization is NULL node to match X3D specification -->
237                      </field>
238                      <field name='texCoordtype='SFNodeaccessType='inputOutput'
                     appinfo='TextureCoordinate node only'>
239                           <!-- default initialization is NULL node to match X3D specification -->
240                      </field>
241                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
242                           <!-- default initialization is NULL node to match X3D specification -->
243                      </field>
244                 </ProtoInterface>
245                 <ProtoBody>
246 
                    <!-- IndexedFaceSet RenderedTSS is a DEF node that has 1 USE node: USE_1 -->
                    <IndexedFaceSet DEF='RenderedTSS'>
247                           <IS>
248                                <connect nodeField='ccwprotoField='ccw'/>
249                                <connect nodeField='normalPerVertexprotoField='normalPerVertex'/>
250                                <connect nodeField='solidprotoField='solid'/>
251                                <connect nodeField='colorprotoField='color'/>
252                                <connect nodeField='coordprotoField='coord'/>
253                                <connect nodeField='normalprotoField='normal'/>
254                                <connect nodeField='texCoordprotoField='texCoord'/>
255                           </IS>
256                      </IndexedFaceSet>
257                      <Group>
258                           <Shape>
259                                <!-- is this really needed at all?? -->
260 
                              <!-- IndexedFaceSet NodesHolderTSS is a DEF node that has 1 USE node: USE_1 -->
                              <IndexedFaceSet DEF='NodesHolderTSS'>
261                                     <IS>
262                                          <connect nodeField='colorprotoField='color'/>
263                                          <connect nodeField='coordprotoField='coord'/>
264                                          <connect nodeField='normalprotoField='normal'/>
265                                          <connect nodeField='texCoordprotoField='texCoord'/>
266                                     </IS>
267                                </IndexedFaceSet>
268                           </Shape>
269                           <Script DEF='IndexedTriangleStripSetToIndexedFaceSetdirectOutput='true'>
270                                <field name='indextype='MFInt32accessType='initializeOnly'/>
271                                <field name='set_indextype='MFInt32accessType='inputOnly'/>
272                                <field name='renderedTSStype='SFNodeaccessType='initializeOnly'>
273                                     <IndexedFaceSet USE='RenderedTSS'/>
274                                </field>
275                                <field name='nodesHoldertype='SFNodeaccessType='initializeOnly'>
276                                     <IndexedFaceSet USE='NodesHolderTSS'/>
277                                </field>
278                                <field name='localTraceEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
279                                <field name='coordIndexNewtype='MFInt32accessType='initializeOnly'>
280                                     <!-- constructed during initialization -->
281                                </field>
282                                <IS>
283                                     <connect nodeField='indexprotoField='index'/>
284                                     <connect nodeField='set_indexprotoField='set_index'/>
285                                </IS>
  <![CDATA[
            
ecmascript:

function initialize()
{
	// index is an array of triangle indices. The ordering of
	// the vertices is ccw (counter-clockwise).

	// ensure legal index values
	for (ii=0; ii <= index.length-1; ii++)
	{
	  if (index[ii] < -1)
	  {
		alwaysPrint ('error, index[' + ii + ']=' + index[ii] +
' is illegal value');
		return;
	  }
	}
	tracePrint ('index.length=' + index.length);
	tracePrint ('index=' + index);

	if (index.length < 3) 
	{
		alwaysPrint ('warning, index.length=' + index.length + 
' insufficient to construct a triangle, ITS ignored');
		return;
	}

	coordIndexNew = new MFInt32 ();

	// ii walks through index array,
	// goal is to initialize coordIndexNew list to match triangles
	for (ii=2; ii <= index.length-1; ii++)
	{
		if ((index[ii] == index[ii-1]) || (index[ii] == index[ii-2]) || (index[ii-1] == index[ii-2]))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, pair of equal indices in triangle');
			return;
		}
	  
		if (index[ii] >= 0) 
	  {
			// add another triangle from latest 3 points of fan set to ITS
			// order is ccw, i.e. in correct halfplane direction
			coordIndexNew [coordIndexNew.length] = index[ii-2];
			coordIndexNew [coordIndexNew.length] = index[ii-1];
			coordIndexNew [coordIndexNew.length] = index[ii];
			coordIndexNew [coordIndexNew.length] = -1;
	  }

		// ensure done, or sufficient points remain to build another triangle
//		if (	(i!=index.length-1) && (index.length - i < 2))
//		{
//			alwaysPrint ('index=' + index);
//			alwaysPrint ('error, insufficient index values after' +
//	'index[' + i + ']=-1');
//			return;
//		}
		// ensure done, or enough legal index values remain to build another triangle
//		if (	(i!=index.length-1) &&
//			((index[i+1] == -1) || (index[i+2] == -1) || (index[i+3] == -1)))
//		{
//			alwaysPrint ('index=' + index);
//			alwaysPrint ('error, insufficient non-negative-one index values after' +
//	'index[' + i + ']=-1');
//			return;
//		}
	  // incremental trace of array being built
	  tracePrint ('TSScoordIndexNew=' + coordIndexNew);
	}
	renderedTSS.set_coordIndex = coordIndexNew;
	tracePrint ('renderedTSS.coordIndex=' + renderedTSS.coordIndex);
	// match colorIndex if any Color node exists
	if (nodesHolder.color)
	{
	  if (nodesHolder.color.color.length > 0)
	  {
		renderedTSS.set_colorIndex = coordIndexNew;
		tracePrint ('set_colorIndex=' + coordIndexNew);
	  }
	}
}
function set_index (value, timestamp)
{
	index = value;
	initialize ();
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	  Browser.println ('[IndexedTriangleStripSet]' + outputString);
}
function alwaysPrint(outputString)
{
	  Browser.println ('[IndexedTriangleStripSet]' + outputString);
}

          
]]>
287                           </Script>
288                           <Group>
289                                <MetadataString>
290                                     <IS>
291                                          <connect nodeField='metadataprotoField='metadata'/>
292                                     </IS>
293                                </MetadataString>
294                           </Group>
295                      </Group>
296                 </ProtoBody>
297            </ProtoDeclare>
298            <!-- ==================== -->
299            <ProtoDeclare name='LineSetappinfo='LineSet represents a 3D geometry formed by constructing polylines from 3D vertices.'>
300                 <ProtoInterface>
301                      <field name='vertexCounttype='MFInt32accessType='inputOutput'>
302                           <!-- default initialization is NULL array [] to match X3D specification -->
303                      </field>
304                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
305                           <!-- default initialization is NULL node to match X3D specification -->
306                      </field>
307                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
308                           <!-- default initialization is NULL node to match X3D specification -->
309                      </field>
310                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
311                           <!-- default initialization is NULL node to match X3D specification -->
312                      </field>
313                 </ProtoInterface>
314                 <ProtoBody>
315 
                    <!-- IndexedLineSet RenderedILS is a DEF node that has 1 USE node: USE_1 -->
                    <IndexedLineSet DEF='RenderedILS'>
316                           <IS>
317                                <connect nodeField='colorprotoField='color'/>
318                           </IS>
319                      </IndexedLineSet>
320                      <Group>
321                           <Shape>
322 
                              <!-- IndexedLineSet NodesHolderILS is a DEF node that has 1 USE node: USE_1 -->
                              <IndexedLineSet DEF='NodesHolderILS'>
323                                     <IS>
324                                          <connect nodeField='colorprotoField='color'/>
325                                          <connect nodeField='coordprotoField='coord'/>
326                                     </IS>
327                                </IndexedLineSet>
328                                <Appearance DEF='UnusedAppearance'>
329                                     <Material emissiveColor='0.8 0.8 0.8'/>
330                                </Appearance>
331                           </Shape>
332                           <Script DEF='LineSetToIndexedLineSetdirectOutput='true'>
333                                <field name='vertexCounttype='MFInt32accessType='inputOutput'>
334                                     <!-- default initialization is NULL array [] to match X3D specification -->
335                                </field>
336                                <field name='renderedILStype='SFNodeaccessType='initializeOnly'>
337                                     <IndexedLineSet USE='RenderedILS'/>
338                                </field>
339                                <field name='nodesHoldertype='SFNodeaccessType='initializeOnly'>
340                                     <IndexedLineSet USE='NodesHolderILS'/>
341                                </field>
342                                <field name='localTraceEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
343                                <field name='coordIndexNewtype='MFInt32accessType='initializeOnly'>
344                                     <!-- constructed during initialization -->
345                                </field>
346                                <IS>
347                                     <connect nodeField='vertexCountprotoField='vertexCount'/>
348                                </IS>
  <![CDATA[
            
ecmascript:

function initialize()
{
	vertexCountSum = 0;
	tracePrint ('vertexCount=' + vertexCount);
	for (i=0; i < vertexCount.length; i++)
	{
		if (vertexCount[i] < 2)
		{
			alwaysPrint ('error, vertexCount[' + i + ']=' + vertexCount[i] +
	' is illegal value, must be >= 2');
			return;
		}
		vertexCountSum = vertexCountSum + vertexCountSum[i];
	}
	tracePrint ('vertexCountSum=' + vertexCountSum);
	numberPoints = nodesHolder.coord.point.length;

	if (numberPoints < vertexCountSum) 
	{
		alwaysPrint ('warning, Coordinate.point.length=' + numberPoints  + 
' is less than vertexCountSum=' + vertexCountSum + ', LS ignored');
		return;
	}
	coordIndexNew = new MFInt32 ();

	numberSegments = vertexCountSum.length;  // need validity check

	// i walks through array of points to build line-segment indices
	i = 0;
	for (seg=0; seg < numberSegments; seg++)
	{
	  for (j=0; j < vertexCount[seg]; j++)
	  {
		coordIndexNew [coordIndexNew.length] = i;
		i++;
	  }
	  coordIndexNew [coordIndexNew.length] = -1; // terminate current fan

	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	} // repeat for all vertices

	renderedILS.coordIndex = coordIndexNew;
	tracePrint ('renderedILS.coordIndex=' + renderedILS.coordIndex);

	// match colorIndex if any Color node exists
	if (nodesHolder.color)
	{
	  if (nodesHolder.color.color.length > 0)
	  {
		renderedILS.colorIndex = coordIndexNew;
		tracePrint ('set_colorIndex=' + coordIndexNew);
	  }
	}
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	Browser.println ('[TriangleFanSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[TriangleFanSet]' + outputString);
}

          
]]>
350                           </Script>
351                           <Group>
352                                <MetadataString>
353                                     <IS>
354                                          <connect nodeField='metadataprotoField='metadata'/>
355                                     </IS>
356                                </MetadataString>
357                           </Group>
358                      </Group>
359                 </ProtoBody>
360            </ProtoDeclare>
361            <!-- ==================== -->
362            <ProtoDeclare name='TriangleFanSetappinfo='TriangleFanSet represents a 3D shape composed of triangles that form a fan shape around the first vertex declared in each fan.'>
363                 <ProtoInterface>
364                      <field name='fanCounttype='MFInt32accessType='inputOutput'>
365                           <!-- default initialization is NULL array [] to match X3D specification -->
366                      </field>
367                      <field name='ccwtype='SFBoolvalue='trueaccessType='initializeOnly'/>
368                      <field name='colorPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
369                      <field name='normalPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
370                      <field name='solidtype='SFBoolvalue='trueaccessType='initializeOnly'/>
371                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
372                           <!-- default initialization is NULL node to match X3D specification -->
373                      </field>
374                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
375                           <!-- default initialization is NULL node to match X3D specification -->
376                      </field>
377                      <field name='normaltype='SFNodeaccessType='inputOutput'
                     appinfo='Normal node only'>
378                           <!-- default initialization is NULL node to match X3D specification -->
379                      </field>
380                      <field name='texCoordtype='SFNodeaccessType='inputOutput'
                     appinfo='TextureCoordinate node only'>
381                           <!-- default initialization is NULL node to match X3D specification -->
382                      </field>
383                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
384                           <!-- default initialization is NULL node to match X3D specification -->
385                      </field>
386                 </ProtoInterface>
387                 <ProtoBody>
388 
                    <!-- IndexedFaceSet RenderedTFS is a DEF node that has 1 USE node: USE_1 -->
                    <IndexedFaceSet DEF='RenderedTFS'>
389                           <IS>
390                                <connect nodeField='ccwprotoField='ccw'/>
391                                <connect nodeField='colorPerVertexprotoField='colorPerVertex'/>
392                                <connect nodeField='normalPerVertexprotoField='normalPerVertex'/>
393                                <connect nodeField='solidprotoField='solid'/>
394                                <connect nodeField='colorprotoField='color'/>
395                                <connect nodeField='coordprotoField='coord'/>
396                                <connect nodeField='normalprotoField='normal'/>
397                                <connect nodeField='texCoordprotoField='texCoord'/>
398                           </IS>
399                      </IndexedFaceSet>
400                      <Group DEF='UnrenderedTFS'>
401                           <Shape>
402                                <!-- is this really needed at all?? -->
403 
                              <!-- IndexedFaceSet NodesHolderTFS is a DEF node that has 1 USE node: USE_1 -->
                              <IndexedFaceSet DEF='NodesHolderTFS'>
404                                     <IS>
405                                          <connect nodeField='colorprotoField='color'/>
406                                          <connect nodeField='coordprotoField='coord'/>
407                                          <connect nodeField='normalprotoField='normal'/>
408                                          <connect nodeField='texCoordprotoField='texCoord'/>
409                                     </IS>
410                                </IndexedFaceSet>
411                           </Shape>
412                           <Script DEF='TriangleFanSetToIndexedFaceSetdirectOutput='true'>
413                                <field name='fanCounttype='MFInt32accessType='inputOutput'>
414                                     <!-- default initialization is NULL array [] to match X3D specification -->
415                                </field>
416                                <field name='renderedTFStype='SFNodeaccessType='initializeOnly'>
417                                     <IndexedFaceSet USE='RenderedTFS'/>
418                                </field>
419                                <field name='nodesHoldertype='SFNodeaccessType='initializeOnly'>
420                                     <IndexedFaceSet USE='NodesHolderTFS'/>
421                                </field>
422                                <field name='localTraceEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
423                                <field name='coordIndexNewtype='MFInt32accessType='initializeOnly'>
424                                     <!-- constructed during initialization -->
425                                </field>
426                                <IS>
427                                     <connect nodeField='fanCountprotoField='fanCount'/>
428                                </IS>
  <![CDATA[
            
ecmascript:

function initialize()
{
	fanCountSum = 0;
	tracePrint ('fanCount=' + fanCount);
	for (i=0; i < fanCount.length; i++)
	{
		if (fanCount[i] < 3)
		{
			alwaysPrint ('error, fanCount[' + i + ']=' + fanCount[i] +
	' is illegal value, must be >= 3');
			return;
		}
		fanCountSum = fanCountSum + fanCount[i];
	}
	tracePrint ('fanCountSum=' + fanCountSum);
	numberPoints = nodesHolder.coord.point.length;

	if (numberPoints < fanCountSum) 
	{
		alwaysPrint ('warning, Coordinate.point.length=' + numberPoints  + 
' is less than fanCountSum=' + fanCountSum + ', TFS ignored');
		return;
	}
	coordIndexNew = new MFInt32 ();

	numberFans = fanCount.length;  // need validity check

	// i walks through array of points to build polygon indices
	i = 0;
	for (fan=0; fan < numberFans; fan++)
	{
	  for (j=0; j < fanCount[fan]; j++)
	  {
		coordIndexNew [coordIndexNew.length] = i;
		i++;
	  }
	  coordIndexNew [coordIndexNew.length] = -1; // terminate current fan

	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	} // repeat for all fans

	renderedTFS.coordIndex = coordIndexNew;
	tracePrint ('renderedTFS.coordIndex=' + renderedTFS.coordIndex);

	// match colorIndex if any Color node exists
	if (nodesHolder.color)
	{
	  if (nodesHolder.color.color.length > 0)
	  {
		renderedTFS.set_colorIndex = coordIndexNew;
		tracePrint ('set_colorIndex=' + coordIndexNew);
	  }
	}
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	Browser.println ('[TriangleFanSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[TriangleFanSet]' + outputString);
}

          
]]>
430                           </Script>
431                           <Group>
432                                <MetadataString>
433                                     <IS>
434                                          <connect nodeField='metadataprotoField='metadata'/>
435                                     </IS>
436                                </MetadataString>
437                           </Group>
438                      </Group>
439                 </ProtoBody>
440            </ProtoDeclare>
441            <!-- ==================== -->
442            <ProtoDeclare name='TriangleSetappinfo='TriangleSet represents a 3D shape that represents a collection of individual triangles.'>
443                 <ProtoInterface>
444                      <field name='ccwtype='SFBoolvalue='trueaccessType='initializeOnly'/>
445                      <field name='colorPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
446                      <field name='normalPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
447                      <field name='solidtype='SFBoolvalue='trueaccessType='initializeOnly'/>
448                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
449                           <!-- default initialization is NULL node to match X3D specification -->
450                      </field>
451                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
452                           <!-- default initialization is NULL node to match X3D specification -->
453                      </field>
454                      <field name='normaltype='SFNodeaccessType='inputOutput'
                     appinfo='Normal node only'>
455                           <!-- default initialization is NULL node to match X3D specification -->
456                      </field>
457                      <field name='texCoordtype='SFNodeaccessType='inputOutput'
                     appinfo='TextureCoordinate node only'>
458                           <!-- default initialization is NULL node to match X3D specification -->
459                      </field>
460                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
461                           <!-- default initialization is NULL node to match X3D specification -->
462                      </field>
463                 </ProtoInterface>
464                 <ProtoBody>
465 
                    <!-- IndexedFaceSet RenderedTS is a DEF node that has 1 USE node: USE_1 -->
                    <IndexedFaceSet DEF='RenderedTS'>
466                           <IS>
467                                <connect nodeField='ccwprotoField='ccw'/>
468                                <connect nodeField='normalPerVertexprotoField='normalPerVertex'/>
469                                <connect nodeField='solidprotoField='solid'/>
470                                <connect nodeField='colorprotoField='color'/>
471                                <connect nodeField='coordprotoField='coord'/>
472                                <connect nodeField='normalprotoField='normal'/>
473                                <connect nodeField='texCoordprotoField='texCoord'/>
474                           </IS>
475                      </IndexedFaceSet>
476                      <Group DEF='UnrenderedTS'>
477                           <Shape>
478                                <!-- is this really needed at all?? -->
479 
                              <!-- IndexedFaceSet NodesHolderTS is a DEF node that has 1 USE node: USE_1 -->
                              <IndexedFaceSet DEF='NodesHolderTS'>
480                                     <IS>
481                                          <connect nodeField='colorprotoField='color'/>
482                                          <connect nodeField='coordprotoField='coord'/>
483                                          <connect nodeField='normalprotoField='normal'/>
484                                          <connect nodeField='texCoordprotoField='texCoord'/>
485                                     </IS>
486                                </IndexedFaceSet>
487                           </Shape>
488                           <Script DEF='TriangleSetToIndexedFaceSetdirectOutput='true'>
489                                <field name='indextype='MFInt32accessType='initializeOnly'>
490                                     <!-- default initialization is NULL -->
491                                </field>
492                                <field name='set_indextype='MFInt32accessType='inputOnly'/>
493                                <field name='renderedTStype='SFNodeaccessType='initializeOnly'>
494                                     <IndexedFaceSet USE='RenderedTS'/>
495                                </field>
496                                <field name='nodesHoldertype='SFNodeaccessType='initializeOnly'>
497                                     <IndexedFaceSet USE='NodesHolderTS'/>
498                                </field>
499                                <field name='localTraceEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
500                                <field name='coordIndexNewtype='MFInt32accessType='initializeOnly'>
501                                     <!-- constructed during initialization -->
502                                </field>
  <![CDATA[
            
ecmascript:

function initialize()
{
	// index is an array of triangle indices. The ordering of
	// the vertices is ccw (counter-clockwise).

	// ensure legal index values
	for (ii=0; ii <= index.length-1; ii++)
	{
	  if (index[ii] < -1)
	  {
		alwaysPrint ('error, index[' + ii + ']=' + index[ii] +
' is illegal value');
		return;
	  }
	}
	tracePrint ('index.length=' + index.length);
	tracePrint ('index=' + index);

	if (index.length < 3) 
	{
		alwaysPrint ('warning, index.length=' + index.length + 
' insufficient to construct a triangle, ITS ignored');
		return;
	}

	coordIndexNew = new MFInt32 ();

	// ii walks through index array,
	// goal is to initialize coordIndexNew list to match triangles
	for (ii=0; ii <= index.length-1; ii+=3)
	{
		if ((index[ii] == index[ii+1]) || (index[ii] == index[ii+2]) || (index[ii+1] == index[ii+2]))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, pair of equal indices in triangle');
			return;
		}
	  
		if (index[ii] >= 0) 
		{
			// add another triangle from latest 3 points of fan set to ITS
			// order is ccw, i.e. in correct halfplane direction
			coordIndexNew [coordIndexNew.length] = index[ii];
			coordIndexNew [coordIndexNew.length] = index[ii+1];
			coordIndexNew [coordIndexNew.length] = index[ii+2];
			coordIndexNew [coordIndexNew.length] = -1;
		}

		if (index.length % 3 != 0) {
			alwaysPrint ('error, index field does not contain a multiple' +
		'of three coordinate values.');
			alwaysPrint ('The remaining vertices shall be ignored');
			return;
		}


		// ensure done, or sufficient points remain to build another triangle
//		if (	(i!=index.length-1) && (index.length - i < 2))
//		{
//			alwaysPrint ('index=' + index);
//			alwaysPrint ('error, insufficient index values after' +
//	'index[' + i + ']=-1');
//			return;
//		}
		// ensure done, or enough legal index values remain to build another triangle
//		if (	(i!=index.length-1) &&
//			((index[i+1] == -1) || (index[i+2] == -1) || (index[i+3] == -1)))
//		{
//			alwaysPrint ('index=' + index);
//			alwaysPrint ('error, insufficient non-negative-one index values after' +
//	'index[' + i + ']=-1');
//			return;
//		}
	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	}
	renderedITS.set_coordIndex = coordIndexNew;
	tracePrint ('renderedITS.coordIndex=' + renderedITS.coordIndex);
	// match colorIndex if any Color node exists
	if (nodesHolder.color)
	{
	  if (nodesHolder.color.color.length > 0)
	  {
		renderedITS.set_colorIndex = coordIndexNew;
		tracePrint ('set_colorIndex=' + coordIndexNew);
	  }
	}
}
function set_index (value, timestamp)
{
	index = value;
	initialize ();
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	Browser.println ('[IndexedTriangleSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[IndexedTriangleSet]' + outputString);
}

          
]]>
504                           </Script>
505                           <Group>
506                                <MetadataString>
507                                     <IS>
508                                          <connect nodeField='metadataprotoField='metadata'/>
509                                     </IS>
510                                </MetadataString>
511                           </Group>
512                      </Group>
513                 </ProtoBody>
514            </ProtoDeclare>
515            <!-- ==================== -->
516            <ProtoDeclare name='TriangleStripSetappinfo='TriangleStripSet represents a 3D shape composed of strips of triangles.'>
517                 <ProtoInterface>
518                      <field name='stripCounttype='MFInt32accessType='inputOutput'>
519                           <!-- default initialization is NULL array [] to match X3D specification -->
520                      </field>
521                      <field name='ccwtype='SFBoolvalue='trueaccessType='initializeOnly'/>
522                      <field name='colorPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
523                      <field name='normalPerVertextype='SFBoolvalue='trueaccessType='initializeOnly'/>
524                      <field name='solidtype='SFBoolvalue='trueaccessType='initializeOnly'/>
525                      <field name='colortype='SFNodeaccessType='inputOutput'
                     appinfo='Color ColorRGBA node only'>
526                           <!-- default initialization is NULL node to match X3D specification -->
527                      </field>
528                      <field name='coordtype='SFNodeaccessType='inputOutput'
                     appinfo='Coordinate node only'>
529                           <!-- default initialization is NULL node to match X3D specification -->
530                      </field>
531                      <field name='normaltype='SFNodeaccessType='inputOutput'
                     appinfo='Normal node only'>
532                           <!-- default initialization is NULL node to match X3D specification -->
533                      </field>
534                      <field name='texCoordtype='SFNodeaccessType='inputOutput'
                     appinfo='TextureCoordinate node only'>
535                           <!-- default initialization is NULL node to match X3D specification -->
536                      </field>
537                      <field name='metadatatype='SFNodeaccessType='inputOutput'
                     appinfo='Metadata node only'>
538                           <!-- default initialization is NULL node to match X3D specification -->
539                      </field>
540                 </ProtoInterface>
541                 <ProtoBody>
542                      <IndexedFaceSet/>
543                 </ProtoBody>
544            </ProtoDeclare>
545            <!-- ==================== -->
546            <!-- ProtoInstance examples are found in RenderingComponentExamples.x3d -->
547            <Background groundColor='0.2 0.2 0.2skyColor='0.2 0.2 0.2'/>
548            <Anchor DEF='LinkToExamplesdescription='link to examples'   url=' "RenderingComponentExamples.x3d" "https://www.web3d.org/x3d/content/examples/Basic/development/RenderingComponentExamples.x3d" "RenderingComponentExamples.wrl" "https://www.web3d.org/x3d/content/examples/Basic/development/RenderingComponentExamples.wrl" '>
549                 <Shape>
550                      <Appearance>
551                           <Material diffuseColor='1 1 1'/>
552                      </Appearance>
553                      <Text string='"RenderingComponentPrototypes" "is a developmental file." "Click this text to view" "RenderingComponentExamples"'>
554                           <FontStyle justify='"MIDDLE" "MIDDLE"'/>
555                      </Text>
556                 </Shape>
557                 <!-- Selectable Text has transparent Box and TouchSensor description as a tooltip -->
558                 <Shape>
559                      <Box size='12 5 .001'/>
560                      <Appearance>
561                           <Material transparency='0.8'/>
562                      </Appearance>
563                 </Shape>
564            </Anchor>
565       </Scene>
566  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top Index for DEF nodes: ColorRGB, ColorRGBAholder, ConvertColorRGBAtoRGB, IndexedTriangleFanSetToIndexedFaceSet, IndexedTriangleSetToIndexedFaceSet, IndexedTriangleStripSetToIndexedFaceSet, LineSetToIndexedLineSet, LinkToExamples, NodesHolderILS, NodesHolderITFS, NodesHolderITS, NodesHolderTFS, NodesHolderTS, NodesHolderTSS, RenderedILS, RenderedITFS, RenderedITS, RenderedTFS, RenderedTS, RenderedTSS, TriangleFanSetToIndexedFaceSet, TriangleSetToIndexedFaceSet, UnrenderedITFS, UnrenderedITS, UnrenderedTFS, UnrenderedTS, UnusedAppearance

Index for ProtoDeclare definitions: ColorRGBA, IndexedTriangleFanSet, IndexedTriangleSet, IndexedTriangleStripSet, LineSet, TriangleFanSet, TriangleSet, TriangleStripSet
-->
X3D Tooltips element index: Anchor, Appearance, Background, Box, Color, connect, field, FontStyle, Group, head, IndexedFaceSet, IndexedLineSet, IS, Material, meta, MetadataSet, MetadataString, OrientationInterpolator, ProtoBody, ProtoDeclare, ProtoInterface, Scene, Script, Shape, Text, WorldInfo, X3D, plus documentation for accessType definitions, type definitions, XML data types, and field types

-->
<!-- Online at
https://www.web3d.org/x3d/content/examples/Basic/development/RenderingComponentPrototypesIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/development/RenderingComponentPrototypes.x3d -->

<!-- Color-coding legend: X3D terminology <X3dNode  DEF='idNamefield='value'/> matches XML terminology <XmlElement  DEF='idNameattribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
    <ProtoDeclare name='ProtoName'> <field name='fieldName'/> </ProtoDeclare> -->

to top <!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints. -->