Exemple #1
0
        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);
        }
Exemple #2
0
        /** 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) }
            });
        }