Source code: com/trapezium/vrml/grammar/VRML97.java
1 /*
2 * @(#)VRML97.java
3 *
4 * Copyright (c) 1998 by Trapezium Development LLC. All Rights Reserved.
5 *
6 * The information in this file is the property of Trapezium Development LLC
7 * and may be used only in accordance with the terms of the license granted
8 * by Trapezium.
9 *
10 */
11 package com.trapezium.vrml.grammar;
12
13 import com.trapezium.vrml.node.Node;
14 import com.trapezium.vrml.fields.Field;
15 import com.trapezium.vrml.node.NodeType;
16 import com.trapezium.util.ReturnInteger;
17 import com.trapezium.vrml.VrmlElement;
18 import com.trapezium.vrml.ScriptFunction;
19 import com.trapezium.vrml.ScriptFileParsed;
20 import com.trapezium.vrml.RouteDestination;
21 import com.trapezium.vrml.ROUTE;
22 import com.trapezium.vrml.fields.ISField;
23 import com.trapezium.vrml.node.ScriptInstance;
24 import com.trapezium.parse.TokenEnumerator;
25 import java.util.Hashtable;
26 import java.util.Enumeration;
27 import java.util.StringTokenizer;
28
29 /**
30 * Static public methods about the VRML specification.
31 *
32 * This class contains information about all VRML 2.0 nodes, fields, and
33 * default field values. It has static public methods for accessing this
34 * information, and is used mainly by the parser.
35 *
36 * @author Johannes N. Johannsen
37 * @version 1.12, 25 Feb 1998, added Table 7 base profile limits,
38 * added MFTime support
39 * @version 1.1, 8 Jan 1998
40 *
41 * @since 1.1
42 */
43 public class VRML97 {
44 /** found an interface type that isn't field, exposedField, eventIn, or eventOut */
45 static public int UnknownInterfaceType = 0;
46
47 /** field interface constant */
48 static public int field = 1;
49
50 /** exposedField interface constant */
51 static public int exposedField = 2;
52
53 /** eventIn interface constant */
54 static public int eventIn = 3;
55
56 /** eventOut interface constant */
57 static public int eventOut = 4;
58
59 /** Convert an interface type constant into a String */
60 static public String getInterfaceTypeStr( int itype ) {
61 if ( itype == field ) {
62 return( "field" );
63 } else if ( itype == exposedField ) {
64 return( "exposedField" );
65 } else if ( itype == eventIn ) {
66 return( "eventIn" );
67 } else if ( itype == eventOut ) {
68 return( "eventOut" );
69 } else {
70 return( "unknown interface type" );
71 }
72 }
73
74 /** Constants representing built int field types */
75 static public int UnknownType = 99;
76 /** Built in VRML97 data type */
77 static public int SFBool = 100;
78 /** Built in VRML97 data type */
79 static public int SFColor = 101;
80 /** Built in VRML97 data type */
81 static public int MFColor = 102;
82 /** Built in VRML97 data type */
83 static public int SFFloat = 103;
84 /** Built in VRML97 data type */
85 static public int MFFloat = 104;
86 /** Built in VRML97 data type */
87 static public int SFImage = 105;
88 /** Built in VRML97 data type */
89 static public int SFInt32 = 106;
90 /** Built in VRML97 data type */
91 static public int MFInt32 = 107;
92 /** Built in VRML97 data type */
93 static public int SFNode = 108;
94 /** Built in VRML97 data type */
95 static public int MFNode = 109;
96 /** Built in VRML97 data type */
97 static public int SFRotation = 110;
98 /** Built in VRML97 data type */
99 static public int MFRotation = 111;
100 /** Built in VRML97 data type */
101 static public int SFString = 112;
102 /** Built in VRML97 data type */
103 static public int MFString = 113;
104 /** Built in VRML97 data type */
105 static public int SFTime = 114;
106 /** Built in VRML97 data type */
107 static public int MFTime = 115;
108 /** Built in VRML97 data type */
109 static public int SFVec2f = 116;
110 /** Built in VRML97 data type */
111 static public int MFVec2f = 117;
112 /** Built in VRML97 data type */
113 static public int SFVec3f = 118;
114 /** Built in VRML97 data type */
115 static public int MFVec3f = 119;
116 /** Vorlon data type indicating SFVec3f with only positive values */
117 static public int PositiveSFVec3f = 120;
118 /** Vorlon data type indicating bboxSize conventions, all positive or all -1 */
119 static public int BboxSizeSFVec3f = 121;
120
121 /** Convert a field data type constant into its corresponding String.
122 *
123 * @param fieldType a VRML97 field type constant, e.g. SFxxxx or MFxxxx,
124 * or one of the Vorlon extensions.
125 */
126 static public String getFieldTypeString( int fieldType ) {
127 switch( fieldType ) {
128 case 100:
129 return( "SFBool" );
130 case 101:
131 return( "SFColor" );
132 case 102:
133 return( "MFColor" );
134 case 103:
135 return( "SFFloat" );
136 case 104:
137 return( "MFFloat" );
138 case 105:
139 return( "SFImage" );
140 case 106:
141 return( "SFInt32" );
142 case 107:
143 return( "MFInt32" );
144 case 108:
145 return( "SFNode" );
146 case 109:
147 return( "MFNode" );
148 case 110:
149 return( "SFRotation" );
150 case 111:
151 return( "MFRotation" );
152 case 112:
153 return( "SFString" );
154 case 113:
155 return( "MFString" );
156 case 114:
157 return( "SFTime" );
158 case 115:
159 return( "MFTime" );
160 case 116:
161 return( "SFVec2f" );
162 case 117:
163 return( "MFVec2f" );
164 case 118:
165 return( "SFVec3f" );
166 case 119:
167 return( "MFVec3f" );
168 case 120:
169 return( "PositiveSFVec3f" );
170 case 121:
171 return( "BboxSizeSFVec3f" );
172 default:
173 return( null );
174 }
175 }
176
177 static String[] bgUrlFields = {
178 "backUrl", "bottomUrl", "frontUrl", "leftUrl", "rightUrl", "topUrl" };
179 static Hashtable nodesWithUrls = new Hashtable();
180 static {
181 nodesWithUrls.put( "Anchor", "url" );
182 nodesWithUrls.put( "AudioClip", "url" );
183 nodesWithUrls.put( "Background", bgUrlFields );
184 nodesWithUrls.put( "ImageTexture", "url" );
185 nodesWithUrls.put( "Inline", "url" );
186 nodesWithUrls.put( "MovieTexture", "url" );
187 nodesWithUrls.put( "Script", "url" );
188 }
189 static public Object getUrlFieldList( String nodeName ) {
190 return( nodesWithUrls.get( nodeName ));
191 }
192
193 /*
194 The following Hashtables have one Hashtable for each built in VRML
195 node. Each node table has field names for its keys, and a FieldDescriptor
196 object for the corresponding value. The FieldDescriptor contains the
197 interface type (field, exposedField, eventIn, eventOut), field type
198 (MFxxx, SFxxx, etc.), and initial value if any.
199
200 At the end of all this, there is a hash table called "builtInNodes",
201 with keys being node names, and key values being the Hashtable for
202 that node.
203 */
204 static Hashtable anchorFields = new Hashtable();
205 static {
206 anchorFields.put( "addChildren", new FieldDescriptor( eventIn, MFNode ));
207 anchorFields.put( "removeChildren", new FieldDescriptor( eventIn, MFNode ));
208 anchorFields.put( "children", new MFFieldDescriptor( exposedField, MFNode, "[]", Table7.MFNodeLimit, 1 ));
209 anchorFields.put( "description", new FieldDescriptor( exposedField, SFString, "" ));
210 anchorFields.put( "parameter", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.MFStringLimit, 1 ));
211 anchorFields.put( "url", new DEFuserFieldDescriptor( exposedField, MFString, "[]" ));
212 anchorFields.put( "bboxCenter", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
213 anchorFields.put( "bboxSize", new FieldDescriptor( field, BboxSizeSFVec3f, "-1 -1 -1" ));
214 }
215 static Hashtable appearanceFields = new Hashtable();
216 static {
217 appearanceFields.put( "material", new FieldDescriptor( exposedField, SFNode, "NULL" ));
218 appearanceFields.put( "texture", new FieldDescriptor( exposedField, SFNode, "NULL" ));
219 appearanceFields.put( "textureTransform", new FieldDescriptor( exposedField, SFNode, "NULL" ));
220 }
221 static Hashtable audioClipFields = new Hashtable();
222 static {
223 audioClipFields.put( "description", new FieldDescriptor( exposedField, SFString, "" ));
224 audioClipFields.put( "loop", new FieldDescriptor( exposedField, SFBool, "FALSE" ));
225 audioClipFields.put( "pitch", new FieldDescriptor( exposedField, SFFloat, "1.0" ));
226 audioClipFields.put( "startTime", new FieldDescriptor( exposedField, SFTime, "0" ));
227 audioClipFields.put( "stopTime", new FieldDescriptor( exposedField, SFTime, "0" ));
228 audioClipFields.put( "url", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.UrlLimit, 1 ));
229 audioClipFields.put( "duration_changed", new FieldDescriptor( eventOut, SFTime ));
230 audioClipFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
231 }
232 static Hashtable backgroundFields = new Hashtable();
233 static {
234 backgroundFields.put( "set_bind", new FieldDescriptor( eventIn, SFBool ));
235 backgroundFields.put( "groundAngle", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
236 backgroundFields.put( "groundColor", new FieldDescriptor( exposedField, MFColor, "[]" ));
237 backgroundFields.put( "backUrl", new FieldDescriptor( exposedField, MFString, "[]" ));
238 backgroundFields.put( "bottomUrl", new FieldDescriptor( exposedField, MFString, "[]" ));
239 backgroundFields.put( "frontUrl", new FieldDescriptor( exposedField, MFString, "[]" ));
240 backgroundFields.put( "leftUrl", new FieldDescriptor( exposedField, MFString, "[]" ));
241 backgroundFields.put( "rightUrl", new FieldDescriptor( exposedField, MFString, "[]" ));
242 backgroundFields.put( "topUrl", new FieldDescriptor( exposedField, MFString, "[]" ));
243 backgroundFields.put( "skyAngle", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
244 backgroundFields.put( "skyColor", new FieldDescriptor( exposedField, MFColor, "[ 0 0 0 ]" ));
245 backgroundFields.put( "isBound", new FieldDescriptor( eventOut, SFBool ));
246 }
247 static Hashtable billboardFields = new Hashtable();
248 static {
249 billboardFields.put( "addChildren", new FieldDescriptor( eventIn, MFNode ));
250 billboardFields.put( "removeChildren", new FieldDescriptor( eventIn, MFNode ));
251 billboardFields.put( "axisOfRotation", new FieldDescriptor( exposedField, SFVec3f, "0 1 0" ));
252 billboardFields.put( "children", new MFFieldDescriptor( exposedField, MFNode, "[]", Table7.MFNodeLimit, 1 ));
253 billboardFields.put( "bboxCenter", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
254 billboardFields.put( "bboxSize", new FieldDescriptor( field, BboxSizeSFVec3f, "-1 -1 -1" ));
255 }
256 static Hashtable boxFields = new Hashtable();
257 static {
258 boxFields.put( "size", new FieldDescriptor( field, PositiveSFVec3f, "2 2 2" ));
259 }
260 static Hashtable collisionFields = new Hashtable();
261 static {
262 collisionFields.put( "addChildren", new FieldDescriptor( eventIn, MFNode ));
263 collisionFields.put( "removeChildren", new FieldDescriptor( eventIn, MFNode ));
264 collisionFields.put( "children", new MFFieldDescriptor( exposedField, MFNode, "[]", Table7.MFNodeLimit, 1 ));
265 collisionFields.put( "collide", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
266 collisionFields.put( "bboxCenter", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
267 collisionFields.put( "bboxSize", new FieldDescriptor( field, BboxSizeSFVec3f, "-1 -1 -1" ));
268 collisionFields.put( "proxy", new FieldDescriptor( field, SFNode, "NULL" ));
269 collisionFields.put( "collideTime", new FieldDescriptor( eventOut, SFTime ));
270 }
271 static Hashtable colorFields = new Hashtable();
272 static {
273 colorFields.put( "color", new MFFieldDescriptor( exposedField, MFColor, "[]", Table7.MFColorLimit, 3 ));
274 }
275 static Hashtable colorInterpolatorFields = new Hashtable();
276 static {
277 colorInterpolatorFields.put( "set_fraction", new FieldDescriptor( eventIn, SFFloat ));
278 colorInterpolatorFields.put( "key", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
279 colorInterpolatorFields.put( "keyValue", new FieldDescriptor( exposedField, MFColor, "[]" ));
280 colorInterpolatorFields.put( "value_changed", new FieldDescriptor( eventOut, SFColor ));
281 }
282 static Hashtable coneFields = new Hashtable();
283 static {
284 coneFields.put( "bottomRadius", new FieldDescriptor( field, SFFloat, "1" ));
285 coneFields.put( "height", new FieldDescriptor( field, SFFloat, "2" ));
286 coneFields.put( "side", new FieldDescriptor( field, SFBool, "TRUE" ));
287 coneFields.put( "bottom", new FieldDescriptor( field, SFBool, "TRUE" ));
288 }
289 static Hashtable coordinateFields = new Hashtable();
290 static {
291 coordinateFields.put( "point", new MFFieldDescriptor( exposedField, MFVec3f, "[]", Table7.MFVec3fLimit, 3 ));
292 }
293 static Hashtable coordinateInterpolatorFields = new Hashtable();
294 static {
295 coordinateInterpolatorFields.put( "set_fraction", new FieldDescriptor( eventIn, SFFloat ));
296 coordinateInterpolatorFields.put( "key", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
297 coordinateInterpolatorFields.put( "keyValue", new FieldDescriptor( exposedField, MFVec3f, "[]" ));
298 coordinateInterpolatorFields.put( "value_changed", new FieldDescriptor( eventOut, MFVec3f ));
299 }
300 static Hashtable cylinderFields = new Hashtable();
301 static {
302 cylinderFields.put( "bottom", new FieldDescriptor( field, SFBool, "TRUE" ));
303 cylinderFields.put( "height", new FieldDescriptor( field, SFFloat, "2" ));
304 cylinderFields.put( "radius", new FieldDescriptor( field, SFFloat, "1" ));
305 cylinderFields.put( "side", new FieldDescriptor( field, SFBool, "TRUE" ));
306 cylinderFields.put( "top", new FieldDescriptor( field, SFBool, "TRUE" ));
307 }
308 static Hashtable cylinderSensorFields = new Hashtable();
309 static {
310 cylinderSensorFields.put( "autoOffset", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
311 cylinderSensorFields.put( "diskAngle", new FieldDescriptor( exposedField, SFFloat, "0.262" ));
312 cylinderSensorFields.put( "enabled", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
313 cylinderSensorFields.put( "maxAngle", new FieldDescriptor( exposedField, SFFloat, "-1" ));
314 cylinderSensorFields.put( "minAngle", new FieldDescriptor( exposedField, SFFloat, "0" ));
315 cylinderSensorFields.put( "offset", new FieldDescriptor( exposedField, SFFloat, "0" ));
316 cylinderSensorFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
317 cylinderSensorFields.put( "rotation_changed", new FieldDescriptor( eventOut, SFRotation ));
318 cylinderSensorFields.put( "trackPoint_changed", new FieldDescriptor( eventOut, SFVec3f ));
319 }
320 static Hashtable directionalLightFields = new Hashtable();
321 static {
322 directionalLightFields.put( "ambientIntensity", new FieldDescriptor( exposedField, SFFloat, "0" ));
323 directionalLightFields.put( "color", new FieldDescriptor( exposedField, SFColor, "1 1 1" ));
324 directionalLightFields.put( "direction", new FieldDescriptor( exposedField, SFVec3f, "0 0 -1" ));
325 directionalLightFields.put( "intensity", new FieldDescriptor( exposedField, SFFloat, "1" ));
326 directionalLightFields.put( "on", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
327 }
328 static Hashtable elevationGridFields = new Hashtable();
329 static {
330 elevationGridFields.put( "set_height", new FieldDescriptor( eventIn, MFFloat ));
331 elevationGridFields.put( "color", new FieldDescriptor( exposedField, SFNode, "NULL" ));
332 elevationGridFields.put( "normal", new FieldDescriptor( exposedField, SFNode, "NULL" ));
333 elevationGridFields.put( "texCoord", new FieldDescriptor( exposedField, SFNode, "NULL" ));
334 elevationGridFields.put( "height", new MFFieldDescriptor( field, MFFloat, "[]", Table7.ElevationGridHeightLimit, 1 ));
335 elevationGridFields.put( "ccw", new FieldDescriptor( field, SFBool, "TRUE" ));
336 elevationGridFields.put( "colorPerVertex", new FieldDescriptor( field, SFBool, "TRUE" ));
337 elevationGridFields.put( "creaseAngle", new FieldDescriptor( field, SFFloat, "0" ));
338 elevationGridFields.put( "normalPerVertex", new FieldDescriptor( field, SFBool, "TRUE" ));
339 elevationGridFields.put( "solid", new FieldDescriptor( field, SFBool, "TRUE" ));
340 elevationGridFields.put( "xDimension", new FieldDescriptor( field, SFInt32, "0" ));
341 elevationGridFields.put( "xSpacing", new FieldDescriptor( field, SFFloat, "0.0" ));
342 elevationGridFields.put( "zDimension", new FieldDescriptor( field, SFInt32, "0" ));
343 elevationGridFields.put( "zSpacing", new FieldDescriptor( field, SFFloat, "0.0" ));
344 }
345 static Hashtable extrusionFields = new Hashtable();
346 static {
347 extrusionFields.put( "set_crossSection", new FieldDescriptor( eventIn, MFVec2f ));
348 extrusionFields.put( "set_orientation", new FieldDescriptor( eventIn, MFRotation ));
349 extrusionFields.put( "set_scale", new FieldDescriptor( eventIn, MFVec2f ));
350 extrusionFields.put( "set_spine", new FieldDescriptor( eventIn, MFVec3f ));
351 extrusionFields.put( "beginCap", new FieldDescriptor( field, SFBool, "TRUE" ));
352 extrusionFields.put( "ccw", new FieldDescriptor( field, SFBool, "TRUE" ));
353 extrusionFields.put( "convex", new FieldDescriptor( field, SFBool, "TRUE" ));
354 extrusionFields.put( "creaseAngle", new FieldDescriptor( field, SFFloat, "0" ));
355 extrusionFields.put( "crossSection", new FieldDescriptor( field, MFVec2f, "[ 1 1, 1 -1, -1 -1, -1 1, 1 1 ]" ));
356 extrusionFields.put( "endCap", new FieldDescriptor( field, SFBool, "TRUE" ));
357 extrusionFields.put( "orientation", new MFFieldDescriptor( field, MFRotation, "0 0 1 0", Table7.MFRotationLimit, 4 ));
358 extrusionFields.put( "scale", new FieldDescriptor( field, MFVec2f, "1 1" ));
359 extrusionFields.put( "solid", new FieldDescriptor( field, SFBool, "TRUE" ));
360 extrusionFields.put( "spine", new FieldDescriptor( field, MFVec3f, "[ 0 0 0, 0 1 0 ]" ));
361 }
362 static Hashtable fogFields = new Hashtable();
363 static {
364 fogFields.put( "color", new FieldDescriptor( exposedField, SFColor, "1 1 1" ));
365 fogFields.put( "fogType", new FieldDescriptor( exposedField, SFString, "LINEAR" ));
366 fogFields.put( "visibilityRange", new FieldDescriptor( exposedField, SFFloat, "0" ));
367 fogFields.put( "set_bind", new FieldDescriptor( eventIn, SFBool ));
368 fogFields.put( "isBound", new FieldDescriptor( eventOut, SFBool ));
369 }
370 static Hashtable fontStyleFields = new Hashtable();
371 static {
372 fontStyleFields.put( "family", new FieldDescriptor( field, MFString, "\"SERIF\"" ));
373 fontStyleFields.put( "horizontal", new FieldDescriptor( field, SFBool, "TRUE" ));
374 fontStyleFields.put( "justify", new FieldDescriptor( field, MFString, "\"BEGIN\"" ));
375 fontStyleFields.put( "language", new FieldDescriptor( field, SFString, "\"\"" ));
376 fontStyleFields.put( "leftToRight", new FieldDescriptor( field, SFBool, "TRUE" ));
377 fontStyleFields.put( "size", new FieldDescriptor( field, SFFloat, "1.0" ));
378 fontStyleFields.put( "spacing", new FieldDescriptor( field, SFFloat, "1.0" ));
379 fontStyleFields.put( "style", new FieldDescriptor( field, SFString, "\"PLAIN\"" ));
380 fontStyleFields.put( "topToBottom", new FieldDescriptor( field, SFBool, "TRUE" ));
381 }
382 static Hashtable groupFields = new Hashtable();
383 static {
384 groupFields.put( "addChildren", new FieldDescriptor( eventIn, MFNode ));
385 groupFields.put( "removeChildren", new FieldDescriptor( eventIn, MFNode ));
386 groupFields.put( "children", new MFFieldDescriptor( exposedField, MFNode, "[]", Table7.MFNodeLimit, 1 ));
387 groupFields.put( "bboxCenter", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
388 groupFields.put( "bboxSize", new FieldDescriptor( field, BboxSizeSFVec3f, "-1 -1 -1" ));
389 }
390 static Hashtable imageTextureFields = new Hashtable();
391 static {
392 imageTextureFields.put( "url", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.UrlLimit, 1 ));
393 imageTextureFields.put( "repeatS", new FieldDescriptor( field, SFBool, "TRUE" ));
394 imageTextureFields.put( "repeatT", new FieldDescriptor( field, SFBool, "TRUE" ));
395 }
396 static Hashtable indexedFaceSetFields = new Hashtable();
397 static {
398 indexedFaceSetFields.put( "set_colorIndex", new FieldDescriptor( eventIn, MFInt32 ));
399 indexedFaceSetFields.put( "set_coordIndex", new FieldDescriptor( eventIn, MFInt32 ));
400 indexedFaceSetFields.put( "set_normalIndex", new FieldDescriptor( eventIn, MFInt32 ));
401 indexedFaceSetFields.put( "set_texCoordIndex", new FieldDescriptor( eventIn, MFInt32 ));
402 indexedFaceSetFields.put( "color", new FieldDescriptor( exposedField, SFNode, "NULL" ));
403 indexedFaceSetFields.put( "coord", new FieldDescriptor( exposedField, SFNode, "NULL" ));
404 indexedFaceSetFields.put( "normal", new FieldDescriptor( exposedField, SFNode, "NULL" ));
405 indexedFaceSetFields.put( "texCoord", new FieldDescriptor( exposedField, SFNode, "NULL" ));
406 indexedFaceSetFields.put( "ccw", new FieldDescriptor( field, SFBool, "TRUE" ));
407 indexedFaceSetFields.put( "colorIndex", new MFFieldDescriptor( field, MFInt32, "[]", Table7.MFInt32Limit, 1 ));
408 indexedFaceSetFields.put( "colorPerVertex", new FieldDescriptor( field, SFBool, "TRUE" ));
409 indexedFaceSetFields.put( "convex", new FieldDescriptor( field, SFBool, "TRUE" ));
410 indexedFaceSetFields.put( "coordIndex", new MFFieldDescriptor( field, MFInt32, "[]", Table7.MFInt32Limit, 1 ));
411 indexedFaceSetFields.put( "creaseAngle", new FieldDescriptor( field, SFFloat, "0" ));
412 indexedFaceSetFields.put( "normalIndex", new MFFieldDescriptor( field, MFInt32, "[]", Table7.MFInt32Limit, 1 ));
413 indexedFaceSetFields.put( "normalPerVertex", new FieldDescriptor( field, SFBool, "TRUE" ));
414 indexedFaceSetFields.put( "solid", new FieldDescriptor( field, SFBool, "TRUE" ));
415 indexedFaceSetFields.put( "texCoordIndex", new MFFieldDescriptor( field, MFInt32, "[]", Table7.MFInt32Limit, 1 ));
416 }
417 static Hashtable indexedLineSetFields = new Hashtable();
418 static {
419 indexedLineSetFields.put( "set_colorIndex", new FieldDescriptor( eventIn, MFInt32 ));
420 indexedLineSetFields.put( "set_coordIndex", new FieldDescriptor( eventIn, MFInt32 ));
421 indexedLineSetFields.put( "color", new FieldDescriptor( exposedField, SFNode, "NULL" ));
422 indexedLineSetFields.put( "coord", new FieldDescriptor( exposedField, SFNode, "NULL" ));
423 indexedLineSetFields.put( "colorIndex", new MFFieldDescriptor( field, MFInt32, "[]", Table7.ILSIndexLimit, 1 ));
424 indexedLineSetFields.put( "colorPerVertex", new FieldDescriptor( field, SFBool, "TRUE" ));
425 indexedLineSetFields.put( "coordIndex", new MFFieldDescriptor( field, MFInt32, "[]", Table7.ILSIndexLimit, 1 ));
426 }
427 static Hashtable inlineFields = new Hashtable();
428 static {
429 inlineFields.put( "url", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.UrlLimit, 1 ));
430 inlineFields.put( "bboxCenter", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
431 inlineFields.put( "bboxSize", new FieldDescriptor( field, BboxSizeSFVec3f, "-1 -1 -1" ));
432 }
433 static Hashtable LODFields = new Hashtable();
434 static {
435 LODFields.put( "level", new FieldDescriptor( exposedField, MFNode, "[]" ));
436 LODFields.put( "center", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
437 LODFields.put( "range", new MFFieldDescriptor( field, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
438 }
439 static Hashtable materialFields = new Hashtable();
440 static {
441 materialFields.put( "ambientIntensity", new FieldDescriptor( exposedField, SFFloat, "0.2" ));
442 materialFields.put( "diffuseColor", new FieldDescriptor( exposedField, SFColor, "0.8 0.8 0.8" ));
443 materialFields.put( "emissiveColor", new FieldDescriptor( exposedField, SFColor, "0 0 0" ));
444 materialFields.put( "shininess", new FieldDescriptor( exposedField, SFFloat, "0.2" ));
445 materialFields.put( "specularColor", new FieldDescriptor( exposedField, SFColor, "0 0 0" ));
446 materialFields.put( "transparency", new FieldDescriptor( exposedField, SFFloat, "0" ));
447 }
448 static Hashtable movieTextureFields = new Hashtable();
449 static {
450 movieTextureFields.put( "loop", new FieldDescriptor( exposedField, SFBool, "FALSE" ));
451 movieTextureFields.put( "speed", new FieldDescriptor( exposedField, SFFloat, "1" ));
452 movieTextureFields.put( "startTime", new FieldDescriptor( exposedField, SFTime, "0" ));
453 movieTextureFields.put( "stopTime", new FieldDescriptor( exposedField, SFTime, "0" ));
454 movieTextureFields.put( "url", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.UrlLimit, 1 ));
455 movieTextureFields.put( "repeatS", new FieldDescriptor( field, SFBool, "TRUE" ));
456 movieTextureFields.put( "repeatT", new FieldDescriptor( field, SFBool, "TRUE" ));
457 movieTextureFields.put( "duration_changed", new FieldDescriptor( eventOut, SFTime ));
458 movieTextureFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
459 }
460 static Hashtable navigationInfoFields = new Hashtable();
461 static {
462 navigationInfoFields.put( "set_bind", new FieldDescriptor( eventIn, SFBool ));
463 navigationInfoFields.put( "avatarSize", new FieldDescriptor( exposedField, MFFloat, "[ 0.25, 1.6, 0.75 ]" ));
464 navigationInfoFields.put( "headlight", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
465 navigationInfoFields.put( "speed", new FieldDescriptor( exposedField, SFFloat, "1.0" ));
466 navigationInfoFields.put( "type", new FieldDescriptor( exposedField, MFString, "\"WALK\"" ));
467 navigationInfoFields.put( "visibilityLimit", new FieldDescriptor( exposedField, SFFloat, "0.0" ));
468 navigationInfoFields.put( "isBound", new FieldDescriptor( eventOut, SFBool ));
469 }
470 static Hashtable normalFields = new Hashtable();
471 static {
472 normalFields.put( "vector", new MFFieldDescriptor( exposedField, MFVec3f, "[]", Table7.MFVec3fLimit, 3 ));
473 }
474 static Hashtable normalInterpolatorFields = new Hashtable();
475 static {
476 normalInterpolatorFields.put( "set_fraction", new FieldDescriptor( eventIn, SFFloat ));
477 normalInterpolatorFields.put( "key", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
478 normalInterpolatorFields.put( "keyValue", new FieldDescriptor( exposedField, MFVec3f, "[]" ));
479 normalInterpolatorFields.put( "value_changed", new FieldDescriptor( eventOut, MFVec3f ));
480 }
481 static Hashtable orientationInterpolatorFields = new Hashtable();
482 static {
483 orientationInterpolatorFields.put( "set_fraction", new FieldDescriptor( eventIn, SFFloat ));
484 orientationInterpolatorFields.put( "key", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
485 orientationInterpolatorFields.put( "keyValue", new MFFieldDescriptor( exposedField, MFRotation, "[]", Table7.MFRotationLimit, 4 ));
486 orientationInterpolatorFields.put( "value_changed", new FieldDescriptor( eventOut, SFRotation ));
487 }
488 static Hashtable pixelTextureFields = new Hashtable();
489 static {
490 pixelTextureFields.put( "image", new FieldDescriptor( exposedField, SFImage, "0 0 0" ));
491 pixelTextureFields.put( "repeatS", new FieldDescriptor( field, SFBool, "TRUE" ));
492 pixelTextureFields.put( "repeatT", new FieldDescriptor( field, SFBool, "TRUE" ));
493 }
494 static Hashtable planeSensorFields = new Hashtable();
495 static {
496 planeSensorFields.put( "autoOffset", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
497 planeSensorFields.put( "enabled", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
498 planeSensorFields.put( "maxPosition", new FieldDescriptor( exposedField, SFVec2f, "-1 -1" ));
499 planeSensorFields.put( "minPosition", new FieldDescriptor( exposedField, SFVec2f, "0 0" ));
500 planeSensorFields.put( "offset", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
501 planeSensorFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
502 planeSensorFields.put( "trackPoint_changed", new FieldDescriptor( eventOut, SFVec3f ));
503 planeSensorFields.put( "translation_changed", new FieldDescriptor( eventOut, SFVec3f ));
504 }
505 static Hashtable pointLightFields = new Hashtable();
506 static {
507 pointLightFields.put( "ambientIntensity", new FieldDescriptor( exposedField, SFFloat, "0" ));
508 pointLightFields.put( "attenuation", new FieldDescriptor( exposedField, SFVec3f, "1 0 0" ));
509 pointLightFields.put( "color", new FieldDescriptor( exposedField, SFColor, "1 1 1" ));
510 pointLightFields.put( "intensity", new FieldDescriptor( exposedField, SFFloat, "1" ));
511 pointLightFields.put( "location", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
512 pointLightFields.put( "on", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
513 pointLightFields.put( "radius", new FieldDescriptor( exposedField, SFFloat, "100" ));
514 }
515 static Hashtable pointSetFields = new Hashtable();
516 static {
517 pointSetFields.put( "color", new FieldDescriptor( exposedField, SFNode, "NULL" ));
518 pointSetFields.put( "coord", new FieldDescriptor( exposedField, SFNode, "NULL" ));
519 }
520 static Hashtable positionInterpolatorFields = new Hashtable();
521 static {
522 positionInterpolatorFields.put( "set_fraction", new FieldDescriptor( eventIn, SFFloat ));
523 positionInterpolatorFields.put( "key", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
524 positionInterpolatorFields.put( "keyValue", new MFFieldDescriptor( exposedField, MFVec3f, "[]", Table7.MFInterpolatorLimit, 3 ));
525 positionInterpolatorFields.put( "value_changed", new FieldDescriptor( eventOut, SFVec3f ));
526 }
527 static Hashtable proximitySensorFields = new Hashtable();
528 static {
529 proximitySensorFields.put( "center", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
530 proximitySensorFields.put( "size", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
531 proximitySensorFields.put( "enabled", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
532 proximitySensorFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
533 proximitySensorFields.put( "position_changed", new FieldDescriptor( eventOut, SFVec3f ));
534 proximitySensorFields.put( "orientation_changed", new FieldDescriptor( eventOut, SFRotation ));
535 proximitySensorFields.put( "enterTime", new FieldDescriptor( eventOut, SFTime ));
536 proximitySensorFields.put( "exitTime", new FieldDescriptor( eventOut, SFTime ));
537 }
538 static Hashtable scalarInterpolatorFields = new Hashtable();
539 static {
540 scalarInterpolatorFields.put( "set_fraction", new FieldDescriptor( eventIn, SFFloat ));
541 scalarInterpolatorFields.put( "key", new MFFieldDescriptor( exposedField, MFFloat, "[]", Table7.MFFloatLimit, 1 ));
542 scalarInterpolatorFields.put( "keyValue", new FieldDescriptor( exposedField, MFFloat, "[]" ));
543 scalarInterpolatorFields.put( "value_changed", new FieldDescriptor( eventOut, SFFloat ));
544 }
545 static Hashtable scriptFields = new Hashtable();
546 static {
547 scriptFields.put( "url", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.UrlLimit, 1 ));
548 scriptFields.put( "directOutput", new FieldDescriptor( field, SFBool, "FALSE" ));
549 scriptFields.put( "mustEvaluate", new FieldDescriptor( field, SFBool, "FALSE" ));
550 }
551 static Hashtable shapeFields = new Hashtable();
552 static {
553 shapeFields.put( "appearance", new FieldDescriptor( exposedField, SFNode, "NULL" ));
554 shapeFields.put( "geometry", new FieldDescriptor( exposedField, SFNode, "NULL" ));
555 }
556 static Hashtable soundFields = new Hashtable();
557 static {
558 soundFields.put( "direction", new FieldDescriptor( exposedField, SFVec3f, "0 0 1" ));
559 soundFields.put( "intensity", new FieldDescriptor( exposedField, SFFloat, "1" ));
560 soundFields.put( "location", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
561 soundFields.put( "maxBack", new FieldDescriptor( exposedField, SFFloat, "10" ));
562 soundFields.put( "maxFront", new FieldDescriptor( exposedField, SFFloat, "10" ));
563 soundFields.put( "minBack", new FieldDescriptor( exposedField, SFFloat, "1" ));
564 soundFields.put( "minFront", new FieldDescriptor( exposedField, SFFloat, "1" ));
565 soundFields.put( "priority", new FieldDescriptor( exposedField, SFFloat, "0" ));
566 soundFields.put( "source", new FieldDescriptor( exposedField, SFNode, "NULL" ));
567 soundFields.put( "spatialize", new FieldDescriptor( field, SFBool, "TRUE" ));
568 }
569 static Hashtable sphereFields = new Hashtable();
570 static {
571 sphereFields.put( "radius", new FieldDescriptor( field, SFFloat, "1" ));
572 }
573 static Hashtable sphereSensorFields = new Hashtable();
574 static {
575 sphereSensorFields.put( "autoOffset", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
576 sphereSensorFields.put( "enabled", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
577 sphereSensorFields.put( "offset", new FieldDescriptor( exposedField, SFRotation, "0 1 0 0" ));
578 sphereSensorFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
579 sphereSensorFields.put( "rotation_changed", new FieldDescriptor( eventOut, SFRotation ));
580 sphereSensorFields.put( "trackPoint_changed", new FieldDescriptor( eventOut, SFVec3f ));
581 }
582 static Hashtable spotLightFields = new Hashtable();
583 static {
584 spotLightFields.put( "ambientIntensity", new FieldDescriptor( exposedField, SFFloat, "0" ));
585 spotLightFields.put( "attenuation", new FieldDescriptor( exposedField, SFVec3f, "1 0 0" ));
586 spotLightFields.put( "beamWidth", new FieldDescriptor( exposedField, SFFloat, "1.570796" ));
587 spotLightFields.put( "color", new FieldDescriptor( exposedField, SFColor, "1 1 1" ));
588 spotLightFields.put( "cutOffAngle", new FieldDescriptor( exposedField, SFFloat, "0.785398" ));
589 spotLightFields.put( "direction", new FieldDescriptor( exposedField, SFVec3f, "0 0 -1" ));
590 spotLightFields.put( "intensity", new FieldDescriptor( exposedField, SFFloat, "1" ));
591 spotLightFields.put( "location", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
592 spotLightFields.put( "on", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
593 spotLightFields.put( "radius", new FieldDescriptor( exposedField, SFFloat, "100" ));
594 }
595 static Hashtable switchFields = new Hashtable();
596 static {
597 switchFields.put( "choice", new MFFieldDescriptor( exposedField, MFNode, "[]", Table7.MFNodeLimit, 1 ));
598 switchFields.put( "whichChoice", new FieldDescriptor( exposedField, SFInt32, "-1" ));
599 }
600 static Hashtable textFields = new Hashtable();
601 static {
602 textFields.put( "string", new MFFieldDescriptor( exposedField, MFString, "[]", Table7.TextStringLimit, 1 ));
603 textFields.put( "fontStyle", new FieldDescriptor( exposedField, SFNode, "NULL" ));
604 textFields.put( "length", new FieldDescriptor( exposedField, MFFloat, "[]" ));
605 textFields.put( "maxExtent", new FieldDescriptor( exposedField, SFFloat, "0.0" ));
606 }
607 static Hashtable textureCoordinateFields = new Hashtable();
608 static {
609 textureCoordinateFields.put( "point", new MFFieldDescriptor( exposedField, MFVec2f, "[]", Table7.MFVec2fLimit, 2 ));
610 }
611 static Hashtable textureTransformFields = new Hashtable();
612 static {
613 textureTransformFields.put( "center", new FieldDescriptor( exposedField, SFVec2f, "0 0" ));
614 textureTransformFields.put( "rotation", new FieldDescriptor( exposedField, SFFloat, "0" ));
615 textureTransformFields.put( "scale", new FieldDescriptor( exposedField, SFVec2f, "1 1" ));
616 textureTransformFields.put( "translation", new FieldDescriptor( exposedField, SFVec2f, "0 0" ));
617 }
618 static Hashtable timeSensorFields = new Hashtable();
619 static {
620 timeSensorFields.put( "cycleInterval", new FieldDescriptor( exposedField, SFTime, "1" ));
621 timeSensorFields.put( "enabled", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
622 timeSensorFields.put( "loop", new FieldDescriptor( exposedField, SFBool, "FALSE" ));
623 timeSensorFields.put( "startTime", new FieldDescriptor( exposedField, SFTime, "0" ));
624 timeSensorFields.put( "stopTime", new FieldDescriptor( exposedField, SFTime, "0" ));
625 timeSensorFields.put( "cycleTime", new FieldDescriptor( eventOut, SFTime ));
626 timeSensorFields.put( "fraction_changed", new FieldDescriptor( eventOut, SFFloat ));
627 timeSensorFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
628 timeSensorFields.put( "time", new FieldDescriptor( eventOut, SFTime ));
629 }
630 static Hashtable touchSensorFields = new Hashtable();
631 static {
632 touchSensorFields.put( "enabled", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
633 touchSensorFields.put( "hitNormal_changed", new FieldDescriptor( eventOut, SFVec3f ));
634 touchSensorFields.put( "hitPoint_changed", new FieldDescriptor( eventOut, SFVec3f ));
635 touchSensorFields.put( "hitTexCoord_changed", new FieldDescriptor( eventOut, SFVec2f ));
636 touchSensorFields.put( "isActive", new FieldDescriptor( eventOut, SFBool ));
637 touchSensorFields.put( "isOver", new FieldDescriptor( eventOut, SFBool ));
638 touchSensorFields.put( "touchTime", new FieldDescriptor( eventOut, SFTime ));
639 }
640 static Hashtable transformFields = new Hashtable();
641 static {
642 transformFields.put( "addChildren", new FieldDescriptor( eventIn, MFNode ));
643 transformFields.put( "removeChildren", new FieldDescriptor( eventIn, MFNode ));
644 transformFields.put( "center", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
645 transformFields.put( "children", new MFFieldDescriptor( exposedField, MFNode, "[]", Table7.MFNodeLimit, 1 ));
646 transformFields.put( "rotation", new FieldDescriptor( exposedField, SFRotation, "0 0 1 0" ));
647 transformFields.put( "scale", new FieldDescriptor( exposedField, PositiveSFVec3f, "1 1 1" ));
648 transformFields.put( "scaleOrientation", new FieldDescriptor( exposedField, SFRotation, "0 0 1 0" ));
649 transformFields.put( "translation", new FieldDescriptor( exposedField, SFVec3f, "0 0 0" ));
650 transformFields.put( "bboxCenter", new FieldDescriptor( field, SFVec3f, "0 0 0" ));
651 transformFields.put( "bboxSize", new FieldDescriptor( field, BboxSizeSFVec3f, "-1 -1 -1" ));
652 }
653 static Hashtable viewpointFields = new Hashtable();
654 static {
655 viewpointFields.put( "set_bind", new FieldDescriptor( eventIn, SFBool ));
656 viewpointFields.put( "fieldOfView", new FieldDescriptor( exposedField, SFFloat, "0.785398" ));
657 viewpointFields.put( "jump", new FieldDescriptor( exposedField, SFBool, "TRUE" ));
658 viewpointFields.put( "orientation", new FieldDescriptor( exposedField, SFRotation, "0 0 1 0" ));
659 viewpointFields.put( "position", new FieldDescriptor( exposedField, SFVec3f, "0 0 10" ));
660 viewpointFields.put( "description", new FieldDescriptor( field, SFString, "\"\"" ));
661 viewpointFields.put( "bindTime", new FieldDescriptor( eventOut, SFTime ));
662 viewpointFields.put( "isBound", new