<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>OpenVRML: pretty_print.cpp</title> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <link rel="icon" href="../vrml-16"> <link rel="start" href="http://openvrml.org/index" title="OpenVRML Home"> <link rel="prev" href="http://openvrml.org/discussion" title="Discussion"> <link rel="contents" href="index" title="Documentation Main Page"> <link rel="index" href="functions" title="OpenVRML Compound Members"> <link rel="appendix" href="conformance" title="Conformance Test Results"> <style type="text/css"> @import url("tabs.css"); @import url("http://openvrml.org/openvrml.css"); table { width: 100%; } h2 { border-bottom-style: solid; border-bottom-width: 1px; } /* * Doxygen as of 1.5.4-20071217 uses the class "navpath" instead of "nav". * For now, we'll do both. */ div.nav, div.navpath { background-color: transparent; text-align: left; margin-top: 1em; margin-bottom: 1em; border-color: black; border-left: none; border-right: none; padding-top: 0.5em; padding-bottom: 0.5em; } div.nav :link, div.nav :visited, div.navpath :link, div.navpath :visited { border-width: 1px; border-style: solid; border-color: silver; padding: 2px; } div.nav :link:hover, div.nav :visited:hover, div.navpath :link:hover, div.navpath :visited:hover { border-style: outset; border-color: gray; } div.nav :active, div.navpath :active { border-style: inset; border-color: gray; } .body td { background-color: transparent; } .el { text-decoration: inherit; font-weight: inherit } .elRef { font-weight: inherit } .code:link, .code:visited { text-decoration: inherit; font-weight: inherit; color: inherit; } .codeRef:link { font-weight: normal; color: inherit; } :visited { color: silver; } :link:hover { color: inherit; text-decoration: inherit; background-color: transparent; } h1 { line-height: 1.2em; } td.memItemLeft, td.memItemRight, td.memTemplParams, td.memTemplItemLeft, td.memTemplItemRight, .memtemplate, .memname td { font-family: Consolas, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Lucida Console", LucidaTypewriter, monospace; } td.memItemLeft, td.memItemRight, td.mdescLeft, td.mdescRight { background-color: rgb(95%, 95%, 95%); border-color: rgb(65%, 65%, 65%); border-width: 1px; font-size: smaller; } .memItemLeft { margin-top: 0.5em; border-top-style: solid; } .mdescLeft { border-bottom-style: solid; } .memItemRight { border-top-style: solid; margin-top: 0.5em; } .mdescRight { border-bottom-style: solid; } .mdescRight { font-style: italic; } .mdTable { background-color: rgb(95%, 95%, 95%); } .memproto td code { font-family: inherit; font-style: italic; } td.pass { background-color: rgb(50%, 100%, 50%); } td.fail { background-color: rgb(100%, 50%, 50%); } td.invalid { background-color: rgb(75%, 75%, 75%); } .memitem { padding: 0; } .memitem table { width: auto; } .memproto, .memdoc { border-width: 1px; border-color: rgb(65%, 65%, 65%); } .memproto { background-color: rgb(90%, 90%, 90%); font-weight: inherit; font-size: smaller; border-top-style: solid; border-left-style: solid; border-right-style: solid; -webkit-border-top-left-radius: 0.6em; -webkit-border-top-right-radius: 0.6em; -moz-border-radius-topleft: 0.6em; -moz-border-radius-topright: 0.6em; } .memdoc { background-color: rgb(95%, 95%, 95%); padding: 2px 5px; border-style: solid; -webkit-border-bottom-left-radius: 0.6em; -webkit-border-bottom-right-radius: 0.6em; -moz-border-radius-bottomleft: 0.6em; -moz-border-radius-bottomright: 0.6em; } .memname { font-weight: inherit; } div.tabs { background-image: url("tab_b-openvrml.png"); } div.tabs span { background-image: url("tab_l-openvrml.png"); } div.tabs a { background-image: url("tab_r-openvrml.png"); border-bottom: 1px solid #a5a5a5; } div.tabs a:link, div.tabs a:visited, div.tabs a:active, div.tabs a:hover { color: black; } table { border-collapse: collapse; border-spacing: 0; } .note { border: 1px solid rgb(65%, 65%, 65%); background-color: rgb(95%, 95%, 95%); margin-left: 10%; margin-right: 10%; } </style> </head> <body> <table class="sitenav"> <tr> <th><a href="http://openvrml.org/index" title="Home">Home</a></th> <th><a href="http://openvrml.org/download" title="Download">Download</a></th> <th><a href="http://openvrml.org/screenshots/index" title="Screen shots">Screen shots</a></th> <th><a href="http://openvrml.org/discussion" title="Mailing lists and IRC">Discussion</a></th> <th>Documentation</th> </tr> </table> <div class="body"> <!-- Generated by Doxygen 1.5.8 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li><a href="files.html"><span>Files</span></a></li> <li><a href="examples.html"><span>Examples</span></a></li> </ul> </div> </div> <div class="contents"> <h1>pretty_print.cpp</h1>A pretty-printer using <code><a class="el" href="structopenvrml_1_1vrml97__grammar.html" title="A Spirit grammar for parsing VRML97.">openvrml::vrml97_grammar</a></code>.<p> <div class="fragment"><pre class="fragment"><span class="comment">// -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 78 -*-</span> <span class="comment">//</span> <span class="comment">// pretty-print</span> <span class="comment">//</span> <span class="comment">// Copyright 2007 Braden McDaniel</span> <span class="comment">//</span> <span class="comment">// This program is free software; you can redistribute it and/or modify it</span> <span class="comment">// under the terms of the GNU General Public License as published by the Free</span> <span class="comment">// Software Foundation; either version 3 of the License, or (at your option)</span> <span class="comment">// any later version.</span> <span class="comment">//</span> <span class="comment">// This program is distributed in the hope that it will be useful, but WITHOUT</span> <span class="comment">// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</span> <span class="comment">// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for</span> <span class="comment">// more details.</span> <span class="comment">//</span> <span class="comment">// You should have received a copy of the GNU General Public License along</span> <span class="comment">// with this library; if not, see <http://www.gnu.org/licenses/>.</span> <span class="comment">//</span> <span class="preprocessor"># ifdef HAVE_CONFIG_H</span> <span class="preprocessor"></span><span class="preprocessor"># include <config.h></span> <span class="preprocessor"># endif</span> <span class="preprocessor"></span> <span class="preprocessor"># include <<a class="code" href="vrml97__grammar_8h.html" title="VRML97 Spirit grammar and associated parsers.">openvrml/vrml97_grammar.h</a>></span> <span class="preprocessor"># include <<a class="code" href="browser_8h.html" title="Classes that manage the scene.">openvrml/browser.h</a>></span> <span class="preprocessor"># include <fstream></span> <span class="keyword">using namespace </span>std; <span class="keyword">using namespace </span>boost::spirit::classic; <span class="keyword">using namespace </span>openvrml; <span class="keyword">class </span>indent; std::ostream & <a name="a0"></a><a class="code" href="structopenvrml_1_1color.html#47b141bac0a97692fb7a18d11aefc7b2" title="Stream output.">operator<<</a>(std::ostream & out, <span class="keyword">const</span> indent & indent_); <span class="keyword">class </span>indent { <span class="keyword">friend</span> std::ostream & <a name="a1"></a><a class="code" href="namespaceopenvrml.html#2b46a5c244b91b46101a7a557c62fd65" title="Stream output.">operator<<</a>(std::ostream & out, <span class="keyword">const</span> indent & indent_); <span class="keyword">const</span> std::string increment_; std::vector<std::string> indent_; <span class="keyword">public</span>: <span class="keyword">explicit</span> indent(<span class="keyword">const</span> std::string & increment): increment_(increment) {} indent & operator++() { this->indent_.push_back(this->increment_); <span class="keywordflow">return</span> *<span class="keyword">this</span>; } indent & operator--() { this->indent_.pop_back(); <span class="keywordflow">return</span> *<span class="keyword">this</span>; } }; std::ostream & <a class="code" href="structopenvrml_1_1color.html#47b141bac0a97692fb7a18d11aefc7b2" title="Stream output.">operator<<</a>(std::ostream & out, <span class="keyword">const</span> indent & indent_) { std::copy(indent_.indent_.begin(), indent_.indent_.end(), std::ostream_iterator<std::string>(out)); <span class="keywordflow">return</span> out; } <span class="keyword">struct </span>actions; <span class="keyword">template</span> <<span class="keyword">typename</span> MFValueType> <span class="keyword">struct </span>on_mfvalue { <span class="keyword">explicit</span> on_mfvalue(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::vector<MFValueType> & val) <span class="keyword">const</span>; <span class="keyword">private</span>: actions & a; }; <span class="keyword">template</span> <> <span class="keyword">struct </span>on_mfvalue<std::string> { <span class="keyword">explicit</span> on_mfvalue(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::vector<std::string> & val) <span class="keyword">const</span>; <span class="keyword">private</span>: actions & a; }; <span class="keyword">struct </span>actions : openvrml::<a name="_a2"></a><a class="code" href="structopenvrml_1_1null__vrml97__parse__actions.html" title="No-op semantic actions for vrml97_grammar.">null_vrml97_parse_actions</a> { <span class="keyword">template</span> <<span class="keyword">typename</span> SFValueType> <span class="keyword">struct </span>on_sfvalue { <span class="keyword">explicit</span> on_sfvalue(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> SFValueType & val)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << <span class="charliteral">' '</span> << val << <span class="charliteral">'\n'</span>; } <span class="keyword">private</span>: actions & a; }; std::ostream & out; indent indent_; <span class="keyword">explicit</span> actions(std::ostream & out): out(out), indent_(<span class="stringliteral">" "</span>), on_externproto(*this), on_proto_start(*this), on_proto_interface(*this), on_proto_body_start(*this), on_proto_finish(*this), on_node_start(*this), on_node_finish(*this), on_script_interface_decl(*this), on_route(*this), on_use(*this), on_is_mapping(*this), on_field_start(*this), on_sfnode(*this), on_sfbool(*this), on_sfcolor(*this), on_sffloat(*this), on_sfimage(*this), on_sfint32(*this), on_sfrotation(*this), on_sfstring(*this), on_sftime(*this), on_sfvec2f(*this), on_sfvec3f(*this), on_mfcolor(*this), on_mffloat(*this), on_mfint32(*this), on_mfrotation(*this), on_mfstring(*this), on_mftime(*this), on_mfvec2f(*this), on_mfvec3f(*this) {} <span class="keyword">struct </span>on_externproto_t { <span class="keyword">explicit</span> on_externproto_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & node_type_id, <span class="keyword">const</span> <a class="code" href="namespaceopenvrml.html#4c88b862d45625d0cbeb839d4c4e9ec8" title="A group of unique node_interfaces.">node_interface_set</a> & interfaces, <span class="keyword">const</span> std::vector<std::string> & uri_list)<span class="keyword"> const</span> <span class="keyword"> </span>{ <span class="keyword">using</span> std::string; <span class="keyword">using</span> std::vector; a.out << a.indent_ << <span class="stringliteral">"EXTERNPROTO "</span> << node_type_id << <span class="stringliteral">" [\n"</span>; ++a.indent_; <span class="keywordflow">for</span> (node_interface_set::const_iterator interface_ = interfaces.begin(); interface_ != interfaces.end(); ++interface_) { a.out << a.indent_ << *interface_ << <span class="charliteral">'\n'</span>; } --a.indent_; a.out << a.indent_ << <span class="stringliteral">"] [\n"</span>; ++a.indent_; <span class="keywordflow">for</span> (vector<string>::const_iterator uri = uri_list.begin(); uri != uri_list.end(); ++uri) { a.out << a.indent_ << <span class="charliteral">'"'</span> << *uri << <span class="charliteral">'"'</span>; <span class="keywordflow">if</span> (uri + 1 != uri_list.end()) { a.out << <span class="charliteral">','</span>; } a.out << <span class="charliteral">'\n'</span>; } --a.indent_; a.out << a.indent_ << <span class="stringliteral">"]\n"</span>; } actions & a; } on_externproto; <span class="keyword">struct </span>on_proto_start_t { <span class="keyword">explicit</span> on_proto_start_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & node_type_id)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << <span class="stringliteral">"PROTO "</span> << node_type_id << <span class="stringliteral">" [\n"</span>; ++a.indent_; } actions & a; } on_proto_start; <span class="keyword">struct </span>on_proto_interface_t { <span class="keyword">explicit</span> on_proto_interface_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> <a name="_a3"></a><a class="code" href="classopenvrml_1_1node__interface.html" title="Type information for an interface of a node.">node_interface</a> & interface_)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << a.indent_ << interface_; <span class="keywordflow">if</span> (interface_.<a name="a4"></a><a class="code" href="classopenvrml_1_1node__interface.html#dde78e72b3568da9a63996325f0467ed" title="The interface type.">type</a> == node_interface::eventin_id || interface_.<a class="code" href="classopenvrml_1_1node__interface.html#dde78e72b3568da9a63996325f0467ed" title="The interface type.">type</a> == node_interface::eventout_id) { a.out << <span class="charliteral">'\n'</span>; } } actions & a; } on_proto_interface; <span class="keyword">struct </span>on_proto_body_start_t { <span class="keyword">explicit</span> on_proto_body_start_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()()<span class="keyword"> const</span> <span class="keyword"> </span>{ --a.indent_; a.out << a.indent_ << <span class="stringliteral">"] {\n"</span>; ++a.indent_; } actions & a; } on_proto_body_start; <span class="keyword">struct </span>on_proto_finish_t { <span class="keyword">explicit</span> on_proto_finish_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()()<span class="keyword"> const</span> <span class="keyword"> </span>{ --a.indent_; a.out << a.indent_ << <span class="stringliteral">"}\n"</span>; } actions & a; } on_proto_finish; <span class="keyword">struct </span>on_node_start_t { <span class="keyword">explicit</span> on_node_start_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & node_name_id, <span class="keyword">const</span> std::string & node_type_id)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << <span class="charliteral">'\n'</span> << a.indent_; <span class="keywordflow">if</span> (!node_name_id.empty()) { a.out << <span class="stringliteral">"DEF "</span> << node_name_id << <span class="charliteral">' '</span>; } a.out << node_type_id << <span class="stringliteral">" {\n"</span>; ++a.indent_; } actions & a; } on_node_start; <span class="keyword">struct </span>on_node_finish_t { <span class="keyword">explicit</span> on_node_finish_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()()<span class="keyword"> const</span> <span class="keyword"> </span>{ --a.indent_; a.out << a.indent_ << <span class="stringliteral">"}\n"</span>; } actions & a; } on_node_finish; <span class="keyword">struct </span>on_script_interface_decl_t { <span class="keyword">explicit</span> on_script_interface_decl_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> <a class="code" href="classopenvrml_1_1node__interface.html" title="Type information for an interface of a node.">node_interface</a> & interface_)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << a.indent_ << interface_; } actions & a; } on_script_interface_decl; <span class="keyword">struct </span>on_route_t { <span class="keyword">explicit</span> on_route_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & from_node_name_id, <span class="keyword">const</span> <a class="code" href="classopenvrml_1_1node__interface.html" title="Type information for an interface of a node.">node_interface</a> & from_node_interface, <span class="keyword">const</span> std::string & to_node_name_id, <span class="keyword">const</span> <a class="code" href="classopenvrml_1_1node__interface.html" title="Type information for an interface of a node.">node_interface</a> & to_node_interface)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << a.indent_ << <span class="stringliteral">"ROUTE "</span> << from_node_name_id << <span class="charliteral">'.'</span> << from_node_interface.<a name="a5"></a><a class="code" href="classopenvrml_1_1node__interface.html#5ff3c7d82d17d4c20920440fc5b9c043" title="The name of this interface.">id</a> << <span class="stringliteral">" TO "</span> << to_node_name_id << <span class="charliteral">'.'</span> << to_node_interface.<a class="code" href="classopenvrml_1_1node__interface.html#5ff3c7d82d17d4c20920440fc5b9c043" title="The name of this interface.">id</a> << <span class="charliteral">'\n'</span>; } actions & a; } on_route; <span class="keyword">struct </span>on_use_t { <span class="keyword">explicit</span> on_use_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & node_name_id)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << <span class="charliteral">'\n'</span> << a.indent_ << <span class="stringliteral">"USE"</span> << node_name_id << <span class="charliteral">'\n'</span>; } actions & a; } on_use; <span class="keyword">struct </span>on_is_mapping_t { <span class="keyword">explicit</span> on_is_mapping_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & proto_interface_id)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << <span class="stringliteral">" IS "</span> << proto_interface_id << <span class="charliteral">'\n'</span>; } actions & a; } on_is_mapping; <span class="keyword">struct </span>on_field_start_t { <span class="keyword">explicit</span> on_field_start_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> std::string & field_name_id, <a class="code" href="classopenvrml_1_1field__value.html#4bc5e65d6aec0ad3cf49f3992025d4ef" title="Used to identify field_value types.">field_value::type_id</a> <span class="comment">/* field_type */</span>)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << a.indent_ << field_name_id; } actions & a; } on_field_start; <span class="keyword">struct </span>on_sfnode_t { <span class="keyword">explicit</span> on_sfnode_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> <span class="keywordtype">bool</span> null)<span class="keyword"> const</span> <span class="keyword"> </span>{ <span class="keywordflow">if</span> (null) { a.out << <span class="stringliteral">" NULL\n"</span>; } } actions & a; } on_sfnode; <span class="keyword">struct </span>on_sfbool_t { <span class="keyword">explicit</span> on_sfbool_t(actions & a): a(a) {} <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> <span class="keywordtype">bool</span> val)<span class="keyword"> const</span> <span class="keyword"> </span>{ a.out << <span class="charliteral">' '</span> << (val ? <span class="stringliteral">"TRUE"</span> : <span class="stringliteral">"FALSE"</span>) << <span class="charliteral">'\n'</span>; } actions & a; } on_sfbool; on_sfvalue<color> on_sfcolor; on_sfvalue<float> on_sffloat; on_sfvalue<image> on_sfimage; on_sfvalue<int32> on_sfint32; on_sfvalue<rotation> on_sfrotation; on_sfvalue<string> on_sfstring; on_sfvalue<double> on_sftime; on_sfvalue<vec2f> on_sfvec2f; on_sfvalue<vec3f> on_sfvec3f; on_mfvalue<color> on_mfcolor; on_mfvalue<float> on_mffloat; on_mfvalue<int32> on_mfint32; on_mfvalue<rotation> on_mfrotation; on_mfvalue<string> on_mfstring; on_mfvalue<double> on_mftime; on_mfvalue<vec2f> on_mfvec2f; on_mfvalue<vec3f> on_mfvec3f; }; <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> * argv[]) { ifstream infile; <span class="keywordflow">if</span> (argc > 1) { infile.open(argv[1]); <span class="keywordflow">if</span> (!infile.is_open()) { cerr << argv[0] << <span class="stringliteral">": could not open file \""</span> << argv[1] << endl; <span class="keywordflow">return</span> EXIT_FAILURE; } } istream & in(infile.is_open() ? infile : cin); <span class="keyword">const</span> <span class="keywordtype">string</span> filename(infile.is_open() ? argv[1] : <span class="stringliteral">"<stdin>"</span>); <span class="keyword">typedef</span> multi_pass<istreambuf_iterator<char> > multi_pass_iterator_t; <span class="keyword">typedef</span> istream::char_type char_t; multi_pass_iterator_t in_begin(make_multi_pass(istreambuf_iterator<char_t>(in))), in_end(make_multi_pass(istreambuf_iterator<char_t>())); <span class="keyword">typedef</span> position_iterator<multi_pass_iterator_t> iterator_t; iterator_t first(in_begin, in_end, filename), last; <a name="_a6"></a><a class="code" href="structopenvrml_1_1vrml97__skip__grammar.html" title="A Spirit grammar appropriate for use as a skip parser for VRML97 and VRML-encoded...">vrml97_skip_grammar</a> skip_g; actions act(std::cout); <a name="_a7"></a><a class="code" href="structopenvrml_1_1vrml97__grammar.html" title="A Spirit grammar for parsing VRML97.">vrml97_grammar<actions></a> g(act); BOOST_SPIRIT_DEBUG_NODE(skip_g); BOOST_SPIRIT_DEBUG_NODE(g); <span class="keywordflow">if</span> (!parse(first, last, g, skip_g).full) { <span class="keywordflow">return</span> EXIT_FAILURE; } <span class="keywordflow">return</span> EXIT_SUCCESS; } <span class="keyword">template</span> <<span class="keyword">typename</span> MFValueType> <span class="keywordtype">void</span> on_mfvalue<MFValueType>::operator()(<span class="keyword">const</span> std::vector<MFValueType> & val)<span class="keyword"> const</span> <span class="keyword"></span>{ a.out << <span class="stringliteral">" [\n"</span>; ++a.indent_; <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<MFValueType>::const_iterator element = val.begin(); element != val.end(); ++element) { a.out << a.indent_ << *element << <span class="stringliteral">",\n"</span>; } --a.indent_; a.out << a.indent_ << <span class="stringliteral">"]\n"</span>; } <span class="keywordtype">void</span> on_mfvalue<std::string>::operator()(<span class="keyword">const</span> std::vector<std::string> & val)<span class="keyword"> const</span> <span class="keyword"></span>{ a.out << <span class="stringliteral">" [\n"</span>; ++a.indent_; <span class="keywordflow">for</span> (std::vector<std::string>::const_iterator element = val.begin(); element != val.end(); ++element) { a.out << a.indent_ << <span class="charliteral">'"'</span> << *element << <span class="stringliteral">"\",\n"</span>; } --a.indent_; a.out << a.indent_ << <span class="stringliteral">"]\n"</span>; } </pre></div> </div> </div> <address class="footer"><span class="images"><a href="http://web3d.org/x3d/"><img src="x3d-white-on-black.png" width="43" height="32" border="0" alt="X3D"></a><a href="http://opengl.org"><img src="OGL_sm_wht.png" width="68" height="32" border="0" alt="OpenGL"></a><a href="http://sourceforge.net/projects/openvrml"><img src="http://sourceforge.net/sflogo.php?group_id=7151&type=11" width="120" height="30" border="0" alt="SourceForge.net"></a></span><a href="https://sourceforge.net/apps/trac/openvrml/newticket">Report error</a><br>Generated Thu Aug 13 02:49:09 2009 by Doxygen 1.5.8</address> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">_uacct = "UA-446379-2"; urchinTracker();</script> <!-- Piwik --> <script type="text/javascript"> var pkBaseURL = (("https:" == document.location.protocol) ? "https://sourceforge.net/apps/piwik/openvrml/" : "http://sourceforge.net/apps/piwik/openvrml/"); document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E")); </script><script type="text/javascript"> piwik_action_name = ''; piwik_idsite = 1; piwik_url = pkBaseURL + "piwik.php"; piwik_log(piwik_action_name, piwik_idsite, piwik_url); </script> <object><noscript><p><img src="http://sourceforge.net/apps/piwik/openvrml/piwik.php?idsite=1" alt="piwik"/></p></noscript></object> <!-- End Piwik Tag --> </body> </html>