private static SymMapBase ParseGenericNode( Tokenizer t, NodeParseInfo info ) { SymMapBase result = new SymMapBase(); ExpectBraceOpen(t); // populate fields with default values foreach (var kvp in info.FieldDefs) { if (kvp.Value.E1 == null) { continue; } result[kvp.Key] = kvp.Value.E1; } Tokenizer.Token token = t.NextToken(); while (!token.IsBraceClose) { string fieldName = token.ToString(); result[fieldName] = info.FieldParser(fieldName)(t); token = t.NextToken(); Thread.Sleep(0); } return(result); }
/** Static constructor. */ static Parser() { FieldParser SFBool = new FieldParser(ParseSFBool); //FieldParser MFBool = new FieldParser(ParseMFBool); FieldParser SFColor = new FieldParser(ParseSFColor); FieldParser MFColor = new FieldParser(ParseMFColor); FieldParser SFFloat = new FieldParser(ParseSFFloat); FieldParser MFFloat = new FieldParser(ParseMFFloat); FieldParser SFImage = new FieldParser(ParseSFImage); FieldParser SFInt32 = new FieldParser(ParseSFInt32); FieldParser MFInt32 = new FieldParser(ParseMFInt32); FieldParser SFNode = new FieldParser(ParseSFNode); FieldParser MFNode = new FieldParser(ParseMFNode); FieldParser SFRotation = new FieldParser(ParseSFRotation); FieldParser MFRotation = new FieldParser(ParseMFRotation); FieldParser SFString = new FieldParser(ParseSFString); FieldParser MFString = new FieldParser(ParseMFString); FieldParser SFTime = new FieldParser(ParseSFFloat); //FieldParser MFTime = new FieldParser(ParseMFFloat); FieldParser SFVec2f = new FieldParser(ParseSFVec2f); FieldParser MFVec2f = new FieldParser(ParseMFVec2f); FieldParser SFVec3f = new FieldParser(ParseSFVec3f); FieldParser MFVec3f = new FieldParser(ParseMFVec3f); // Dictionary<string, Tup<FieldParser, object>> fields; // Lookup table for Vrml97 node types. // For each node type a NodeParseInfo entry specifies how // to handle this kind of node. m_parseInfoMap = new SymbolDict <NodeParseInfo>(); // DEF m_parseInfoMap[Vrml97Sym.DEF] = new NodeParseInfo(new NodeParser(ParseDEF)); // USE m_parseInfoMap[Vrml97Sym.USE] = new NodeParseInfo(new NodeParser(ParseUSE)); // ROUTE m_parseInfoMap[Vrml97Sym.ROUTE] = new NodeParseInfo(new NodeParser(ParseROUTE)); // NULL m_parseInfoMap[Vrml97Sym.NULL] = new NodeParseInfo(new NodeParser(ParseNULL)); var defaultBBoxCenter = Tup.Create(SFVec3f, (object)V3f.Zero); var defaultBBoxSize = Tup.Create(SFVec3f, (object)new V3f(-1, -1, -1)); Func <FieldParser, object, Tup <FieldParser, object> > fdd = (fp, obj) => Tup.Create(fp, obj); Func <FieldParser, Tup <FieldParser, object> > fd = fp => new Tup <FieldParser, object>(fp, null); // Anchor m_parseInfoMap["Anchor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "children", fd(MFNode) }, { "description", fd(SFString) }, { "parameter", fd(MFString) }, { "url", fd(MFString) }, { "bboxCenter", defaultBBoxCenter }, { "bboxSize", defaultBBoxSize } }); // Appearance m_parseInfoMap["Appearance"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "material", fd(SFNode) }, { "texture", fd(SFNode) }, { "textureTransform", fd(SFNode) } }); // AudioClip m_parseInfoMap["AudioClip"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "description", fd(SFString) }, { "loop", fdd(SFBool, false) }, { "pitch", fdd(SFFloat, 1.0f) }, { "startTime", fdd(SFTime, 0.0f) }, { "stopTime", fdd(SFTime, 0.0f) }, { "url", fd(MFString) } }); // Background m_parseInfoMap["Background"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "groundAngle", fd(MFFloat) }, { "groundColor", fd(MFColor) }, { "backUrl", fd(MFString) }, { "bottomUrl", fd(MFString) }, { "frontUrl", fd(MFString) }, { "leftUrl", fd(MFString) }, { "rightUrl", fd(MFString) }, { "topUrl", fd(MFString) }, { "skyAngle", fd(MFFloat) }, { "skyColor", fdd(MFColor, C3f.Black) } }); // Billboard m_parseInfoMap["Billboard"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "axisOfRotation", fdd(SFVec3f, new V3f(0.0f, 1.0f, 0.0f)) }, { "children", fd(MFNode) }, { "bboxCenter", defaultBBoxCenter }, { "bboxSize", defaultBBoxSize } }); // Box m_parseInfoMap["Box"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "size", fdd(SFVec3f, new V3f(2.0f, 2.0f, 2.0f)) } }); // Collision m_parseInfoMap["Collision"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "children", fd(MFNode) }, { "collide", fdd(SFBool, true) }, { "bboxCenter", defaultBBoxCenter }, { "bboxSize", defaultBBoxSize }, { "proxy", fd(SFNode) } }); // Color m_parseInfoMap["Color"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "color", fd(MFColor) } }); // ColorInterpolator m_parseInfoMap["ColorInterpolator"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "key", fd(MFFloat) }, { "keyValue", fd(MFColor) } }); // Cone m_parseInfoMap["Cone"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "bottomRadius", fdd(SFFloat, 1.0f) }, { "height", fdd(SFFloat, 2.0f) }, { "side", fdd(SFBool, true) }, { "bottom", fdd(SFBool, true) } }); // Coordinate m_parseInfoMap["Coordinate"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "point", fd(MFVec3f) } }); // CoordinateInterpolator m_parseInfoMap["CoordinateInterpolator"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "key", fd(MFFloat) }, { "keyValue", fd(MFVec3f) } }); // Cylinder m_parseInfoMap["Cylinder"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "bottom", fdd(SFBool, true) }, { "height", fdd(SFFloat, 2.0f) }, { "radius", fdd(SFFloat, 1.0f) }, { "side", fdd(SFBool, true) }, { "top", fdd(SFBool, true) } }); // CylinderSensor m_parseInfoMap["CylinderSensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "autoOffset", fdd(SFBool, true) }, { "diskAngle", fdd(SFFloat, 0.262f) }, { "enabled", fdd(SFBool, true) }, { "maxAngle", fdd(SFFloat, -1.0f) }, { "minAngle", fdd(SFFloat, 0.0f) }, { "offset", fdd(SFFloat, 0.0f) } }); // DirectionalLight m_parseInfoMap["DirectionalLight"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "ambientIntensity", fdd(SFFloat, 0.0f) }, { "color", fdd(SFColor, C3f.White) }, { "direction", fdd(SFVec3f, new V3f(0.0f, 0.0f, -1.0f)) }, { "intensity", fdd(SFFloat, 1.0f) }, { "on", fdd(SFBool, true) } }); // ElevationGrid m_parseInfoMap["ElevationGrid"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "color", fd(SFNode) }, { "normal", fd(SFNode) }, { "texCoord", fd(SFNode) }, { "height", fd(MFFloat) }, { "ccw", fdd(SFBool, true) }, { "colorPerVertex", fdd(SFBool, true) }, { "creaseAngle", fdd(SFFloat, 0.0f) }, { "normalPerVertex", fdd(SFBool, true) }, { "solid", fdd(SFBool, true) }, { "xDimension", fdd(SFInt32, 0) }, { "xSpacing", fdd(SFFloat, 1.0f) }, { "zDimension", fdd(SFInt32, 0) }, { "zSpacing", fdd(SFFloat, 1.0f) } }); // Extrusion m_parseInfoMap["Extrusion"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "beginCap", fdd(SFBool, true) }, { "ccw", fdd(SFBool, true) }, { "convex", fdd(SFBool, true) }, { "creaseAngle", fdd(SFFloat, 0.0f) }, { "crossSection", fdd(MFVec2f, new List <V2f>() { new V2f(1.0f, 1.0f), new V2f(1.0f, -1.0f), new V2f(-1.0f, -1.0f), new V2f(-1.0f, 1.0f), new V2f(1.0f, 1.0f) }) }, { "endCap", fdd(SFBool, true) }, { "orientation", fdd(MFRotation, new V4f(0.0f, 0.0f, 1.0f, 0.0f)) }, { "scale", fdd(MFVec2f, new V2f(1.0f, 1.0f)) }, { "solid", fdd(SFBool, true) }, { "spine", fdd(MFVec3f, new List <V3f>() { V3f.Zero, new V3f(0.0f, 1.0f, 0.0f) }) } }); // Fog m_parseInfoMap["Fog"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "color", fdd(SFColor, C3f.White) }, { "fogType", fdd(SFString, "LINEAR") }, { "visibilityRange", fdd(SFFloat, 0.0f) } }); // FontStyle m_parseInfoMap["FontStyle"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "family", fdd(MFString, "SERIF") }, { "horizontal", fdd(SFBool, true) }, { "justify", fdd(MFString, "BEGIN") }, { "language", fd(SFString) }, { "leftToRight", fdd(SFBool, true) }, { "size", fdd(SFFloat, 1.0f) }, { "spacing", fdd(SFFloat, 1.0f) }, { "style", fdd(SFString, "PLAIN") }, { "topToBottom", fdd(SFBool, true) } }); // Group m_parseInfoMap["Group"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "children", fd(MFNode) }, { "bboxCenter", defaultBBoxCenter }, { "bboxSize", defaultBBoxSize } }); // ImageTexture m_parseInfoMap["ImageTexture"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "url", fd(MFString) }, { "repeatS", fdd(SFBool, true) }, { "repeatT", fdd(SFBool, true) } }); // IndexedFaceSet m_parseInfoMap["IndexedFaceSet"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "color", fd(SFNode) }, { "coord", fd(SFNode) }, { "normal", fd(SFNode) }, { "texCoord", fd(SFNode) }, { "ccw", fdd(SFBool, true) }, { "colorIndex", fd(MFInt32) }, { "colorPerVertex", fdd(SFBool, true) }, { "convex", fdd(SFBool, true) }, { "coordIndex", fd(MFInt32) }, { "creaseAngle", fdd(SFFloat, 0.0f) }, { "normalIndex", fd(MFInt32) }, { "normalPerVertex", fdd(SFBool, true) }, { "solid", fdd(SFBool, true) }, { "texCoordIndex", fd(MFInt32) }, { "edgeSharpness", fd(MFFloat) }, { "edgeSharpnessIndex", fd(MFInt32) }, { "neighborMesh", fd(MFString) }, { "neighborIndex", fd(MFInt32) }, { "neighborSide", fd(MFInt32) }, { "neighborFace", fd(MFInt32) }, { "meshName", fd(SFString) }, { "topologyHoles", fd(SFInt32) } }); // IndexedLineSet m_parseInfoMap["IndexedLineSet"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "color", fd(SFNode) }, { "coord", fd(SFNode) }, { "colorIndex", fd(MFInt32) }, { "colorPerVertex", fdd(SFBool, true) }, { "coordIndex", fd(MFInt32) } }); // Inline m_parseInfoMap["Inline"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "url", fd(MFString) }, { "bboxCenter", defaultBBoxCenter }, { "bboxSize", defaultBBoxSize } }); // LOD m_parseInfoMap["LOD"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "level", fd(MFNode) }, { "center", defaultBBoxCenter }, { "range", fd(MFFloat) } }); // Material m_parseInfoMap["Material"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "ambientIntensity", fdd(SFFloat, 0.2f) }, { "diffuseColor", fdd(SFColor, new C3f(0.8f, 0.8f, 0.8f)) }, { "emissiveColor", fdd(SFColor, C3f.Black) }, { "shininess", fdd(SFFloat, 0.2f) }, { "specularColor", fdd(SFColor, C3f.Black) }, { "transparency", fdd(SFFloat, 0.0f) } }); // MovieTexture m_parseInfoMap["MovieTexture"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "loop", fdd(SFBool, false) }, { "speed", fdd(SFFloat, 1.0f) }, { "startTime", fdd(SFTime, 1.0f) }, { "stopTime", fdd(SFTime, 1.0f) }, { "url", fd(MFString) }, { "repeatS", fdd(SFBool, true) }, { "repeatT", fdd(SFBool, true) } }); // NavigationInfo m_parseInfoMap["NavigationInfo"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "avatarSize", fdd(MFFloat, new List <float>() { 0.25f, 1.6f, 0.75f }) }, { "headlight", fdd(SFBool, true) }, { "speed", fdd(SFFloat, 1.0f) }, { "type", fdd(MFString, new List <string>() { "WALK", "ANY" }) }, { "visibilityLimit", fdd(SFFloat, 0.0f) } }); // Normal m_parseInfoMap["Normal"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "vector", fd(MFVec3f) } }); // NormalInterpolator m_parseInfoMap["NormalInterpolator"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "key", fd(MFFloat) }, { "keyValue", fd(MFVec3f) } }); // OrientationInterpolator m_parseInfoMap["OrientationInterpolator"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "key", fd(MFFloat) }, { "keyValue", fd(MFRotation) } }); // PixelTexture m_parseInfoMap["PixelTexture"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "image", fdd(SFImage, new List <uint>() { 0, 0, 0 }) }, { "repeatS", fdd(SFBool, true) }, { "repeatT", fdd(SFBool, true) } }); // PlaneSensor m_parseInfoMap["PlaneSensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "autoOffset", fdd(SFBool, true) }, { "enabled", fdd(SFBool, true) }, { "maxPosition", fdd(SFVec2f, new V2f(-1.0f, -1.0f)) }, { "minPosition", fdd(SFVec2f, V2f.Zero) }, { "offset", defaultBBoxCenter } }); // PointLight m_parseInfoMap["PointLight"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "ambientIntensity", fdd(SFFloat, 0.0f) }, { "attenuation", fdd(SFVec3f, new V3f(1.0f, 0.0f, 0.0f)) }, { "color", fdd(SFColor, C3f.White) }, { "intensity", fdd(SFFloat, 1.0f) }, { "location", defaultBBoxCenter }, { "on", fdd(SFBool, true) }, { "radius", fdd(SFFloat, 100.0f) } }); // PointSet m_parseInfoMap["PointSet"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "color", fd(SFNode) }, { "coord", fd(SFNode) } }); // PositionInterpolator m_parseInfoMap["PositionInterpolator"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "key", fd(MFFloat) }, { "keyValue", fd(MFVec3f) } }); // ProximitySensor m_parseInfoMap["ProximitySensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "center", defaultBBoxCenter }, { "size", defaultBBoxCenter }, { "enabled", fdd(SFBool, true) } }); // ScalarInterpolator m_parseInfoMap["ScalarInterpolator"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "key", fd(MFFloat) }, { "keyValue", fd(MFFloat) } }); // Script // skipped // Shape m_parseInfoMap["Shape"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "appearance", fd(SFNode) }, { "geometry", fd(SFNode) }, }); // Sound m_parseInfoMap["Sound"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "direction", fdd(SFVec3f, new V3f(0.0f, 0.0f, 1.0f)) }, { "intensity", fdd(SFFloat, 1.0f) }, { "location", defaultBBoxCenter }, { "maxBack", fdd(SFFloat, 10.0f) }, { "maxFront", fdd(SFFloat, 10.0f) }, { "minBack", fdd(SFFloat, 1.0f) }, { "minFront", fdd(SFFloat, 1.0f) }, { "priority", fdd(SFFloat, 0.0f) }, { "source", fd(SFNode) }, { "spatialize", fdd(SFBool, true) } }); // Sphere m_parseInfoMap["Sphere"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "radius", fdd(SFFloat, 1.0f) } }); // SphereSensor m_parseInfoMap["SphereSensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "autoOffset", fdd(SFBool, true) }, { "enabled", fdd(SFBool, true) }, { "offset", fdd(SFRotation, new V4f(0.0f, 1.0f, 0.0f, 0.0f)) } }); // SpotLight m_parseInfoMap["SpotLight"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "ambientIntensity", fdd(SFFloat, 0.0f) }, { "attenuation", fdd(SFVec3f, new V3f(1.0f, 0.0f, 0.0f)) }, { "beamWidth", fdd(SFFloat, 1.570796f) }, { "color", fdd(SFColor, C3f.White) }, { "cutOffAngle", fdd(SFFloat, 0.785398f) }, { "direction", fdd(SFVec3f, new V3f(0.0f, 0.0f, -1.0f)) }, { "intensity", fdd(SFFloat, 1.0f) }, { "location", defaultBBoxCenter }, { "on", fdd(SFBool, true) }, { "radius", fdd(SFFloat, 100.0f) } }); // Switch m_parseInfoMap["Switch"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "choice", fd(MFNode) }, { "whichChoice", fdd(SFInt32, -1) } }); // Text m_parseInfoMap["Text"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "string", fd(MFString) }, { "fontStyle", fd(SFNode) }, { "length", fd(MFFloat) }, { "maxExtent", fdd(SFFloat, 0.0f) } }); // TextureCoordinate m_parseInfoMap["TextureCoordinate"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "point", fd(MFVec2f) } }); // TextureTransform m_parseInfoMap["TextureTransform"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "center", fdd(SFVec2f, V2f.Zero) }, { "rotation", fdd(SFFloat, 0.0f) }, { "scale", fdd(SFVec2f, new V2f(1.0f, 1.0f)) }, { "translation", fdd(SFVec2f, V2f.Zero) } }); // TimeSensor m_parseInfoMap["TimeSensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "cycleInterval", fdd(SFTime, 1.0f) }, { "enabled", fdd(SFBool, true) }, { "loop", fdd(SFBool, false) }, { "startTime", fdd(SFTime, 0.0f) }, { "stopTime", fdd(SFTime, 0.0f) } }); // TouchSensor m_parseInfoMap["TouchSensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "enabled", fdd(SFBool, true) } }); // Transform m_parseInfoMap["Transform"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "center", defaultBBoxCenter }, { "children", fd(MFNode) }, { "rotation", fdd(SFRotation, new V4f(0.0f, 0.0f, 1.0f, 0.0f)) }, { "scale", fdd(SFVec3f, new V3f(1.0f, 1.0f, 1.0f)) }, { "scaleOrientation", fdd(SFRotation, new V4f(0.0f, 0.0f, 1.0f, 0.0f)) }, { "translation", defaultBBoxCenter }, { "bboxCenter", defaultBBoxCenter }, { "bboxSize", defaultBBoxSize } }); // Viewpoint m_parseInfoMap["Viewpoint"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "fieldOfView", fdd(SFFloat, 0.785398f) }, { "jump", fdd(SFBool, true) }, { "orientation", fdd(SFRotation, new V4f(0.0f, 0.0f, 1.0f, 0.0f)) }, { "position", fdd(SFVec3f, new V3f(0.0f, 0.0f, 10.0f)) }, { "description", fd(SFString) } }); // VisibilitySensor m_parseInfoMap["VisibilitySensor"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "center", defaultBBoxCenter }, { "enabled", fdd(SFBool, true) }, { "size", defaultBBoxCenter } }); // WorldInfo m_parseInfoMap["WorldInfo"] = new NodeParseInfo( new SymbolDict <Tup <FieldParser, object> >() { { "title", fd(SFString) }, { "info", fd(MFString) } }); }