Panda3D
Loading...
Searching...
No Matches
parse_vrml.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file parse_vrml.cxx
10 * @author drose
11 * @date 2004-10-01
12 */
13
14/**************************************************
15 * VRML 2.0, Draft 2 Parser
16 * Copyright (C) 1996 Silicon Graphics, Inc.
17 *
18 * Author(s) : Gavin Bell
19 * Daniel Woods (first port)
20 **************************************************
21 */
22
23#include "pandatoolbase.h"
24
25#include "parse_vrml.h"
26#include "vrmlParserDefs.h"
27#include "vrmlNodeType.h"
28#include "vrmlNode.h"
29#include "standard_nodes.h"
30#include "zStream.h"
31#include "virtualFileSystem.h"
32
33using std::istream;
34using std::istringstream;
35using std::string;
36
37extern int vrmlyyparse();
38extern void vrmlyyResetLineNumber();
39extern int vrmlyydebug;
40extern int vrmlyy_flex_debug;
41
42extern VrmlScene *parsed_scene;
43
44/**
45 * Loads the set of standard VRML node definitions into the parser, if it has
46 * not already been loaded.
47 */
48static bool
49get_standard_nodes() {
50 static bool got_standard_nodes = false;
51 static bool read_ok = true;
52 if (got_standard_nodes) {
53 return read_ok;
54 }
55
56 // The standardNodes.wrl file has been compiled into this binary. Extract
57 // it out.
58
59 string data((const char *)standard_nodes_data, standard_nodes_data_len);
60
61#ifdef HAVE_ZLIB
62 // The data is stored compressed; decompress it on-the-fly.
63 istringstream inz(data);
64 IDecompressStream in(&inz, false);
65
66#else
67 // The data is stored uncompressed, so just load it.
68 istringstream in(data);
69#endif // HAVE_ZLIB
70
71 vrml_init_parser(in, "standardNodes.wrl");
72 if (vrmlyyparse() != 0) {
73 read_ok = false;
74 }
75 vrml_cleanup_parser();
76
77 got_standard_nodes = true;
78 return read_ok;
79}
80
81/**
82 * Reads the named VRML file and returns a corresponding VrmlScene, or NULL if
83 * there is a parse error.
84 */
87 filename.set_text();
89 istream *in = vfs->open_read_file(filename, true);
90 if (in == nullptr) {
91 nout << "Cannot open " << filename << " for reading.\n";
92 return nullptr;
93 }
94 VrmlScene *result = parse_vrml(*in, filename);
95 vfs->close_read_file(in);
96 return result;
97}
98
99/**
100 * Reads the indicated input stream and returns a corresponding VrmlScene, or
101 * NULL if there is a parse error.
102 */
103VrmlScene *
104parse_vrml(istream &in, const string &filename) {
105 if (!get_standard_nodes()) {
106 std::cerr << "Internal error--unable to parse VRML.\n";
107 return nullptr;
108 }
109
110 VrmlScene *scene = nullptr;
111 VrmlNodeType::pushNameSpace();
112
113 vrml_init_parser(in, filename);
114 if (vrmlyyparse() == 0) {
115 scene = parsed_scene;
116 }
117 vrml_cleanup_parser();
118
119 VrmlNodeType::popNameSpace();
120
121 return scene;
122}
123
124#if 0
125int
126main(int argc, char *argv[]) {
127 if (argc < 2) {
128 std::cerr << "parse_vrml filename.wrl\n";
129 exit(1);
130 }
131
132 VrmlScene *scene = parse_vrml(argv[1]);
133 if (scene == nullptr) {
134 exit(1);
135 }
136
137 std::cout << *scene << "\n";
138 return (0);
139}
140#endif
The name of a file, such as a texture file or an Egg file.
Definition filename.h:44
void set_text()
Indicates that the filename represents a text file.
Definition filename.I:424
A hierarchy of directories and files that appears to be one continuous file system,...
static void close_read_file(std::istream *stream)
Closes a file opened by a previous call to open_read_file().
std::istream * open_read_file(const Filename &filename, bool auto_unwrap) const
Convenience function; returns a newly allocated istream if the file exists and can be read,...
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
This is our own Panda specialization on the default STL vector.
Definition pvector.h:42
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
VrmlScene * parse_vrml(Filename filename)
Reads the named VRML file and returns a corresponding VrmlScene, or NULL if there is a parse error.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.