Panda3D
Loading...
Searching...
No Matches
load_egg_file.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 load_egg_file.cxx
10 * @author drose
11 * @date 2002-02-26
12 */
13
14#include "load_egg_file.h"
15#include "eggLoader.h"
16#include "config_egg2pg.h"
17#include "sceneGraphReducer.h"
18#include "virtualFileSystem.h"
19#include "config_putil.h"
20#include "bamCacheRecord.h"
21
22static PT(PandaNode)
23load_from_loader(EggLoader &loader) {
24 loader._data->load_externals(DSearchPath(), loader._record);
25
26 loader.build_graph();
27
28 if (loader._error && !egg_accept_errors) {
29 egg2pg_cat.error()
30 << "Errors in egg file.\n";
31 return nullptr;
32 }
33
34 if (loader._root != nullptr && egg_flatten) {
36
37 int combine_siblings_bits = 0;
38 if (egg_combine_geoms) {
39 combine_siblings_bits |= SceneGraphReducer::CS_geom_node;
40 }
41 if (egg_flatten_radius > 0.0) {
42 combine_siblings_bits |= SceneGraphReducer::CS_within_radius;
43 gr.set_combine_radius(egg_flatten_radius);
44 }
45
46 int num_reduced = gr.flatten(loader._root, combine_siblings_bits);
47 egg2pg_cat.info() << "Flattened " << num_reduced << " nodes.\n";
48
49 if (egg_unify) {
50 // We want to premunge before unifying, since otherwise we risk
51 // needlessly duplicating vertices.
52 if (premunge_data) {
53 gr.premunge(loader._root, RenderState::make_empty());
54 }
55 gr.collect_vertex_data(loader._root);
56 gr.unify(loader._root, true);
57 if (egg2pg_cat.is_debug()) {
58 egg2pg_cat.debug() << "Unified.\n";
59 }
60 }
61 }
62
63 return loader._root;
64}
65
66/**
67 * A convenience function. Loads up the indicated egg file, and returns the
68 * root of a scene graph. Returns NULL if the file cannot be read for some
69 * reason. Does not search along the egg path for the filename first; use
70 * EggData::resolve_egg_filename() if this is required.
71 */
72PT(PandaNode)
73load_egg_file(const Filename &filename, CoordinateSystem cs,
74 BamCacheRecord *record) {
75 Filename egg_filename = filename;
76 egg_filename.set_text();
78
79 if (record != nullptr) {
80 record->add_dependent_file(egg_filename);
81 }
82
83 EggLoader loader;
84 loader._data->set_egg_filename(egg_filename);
85 loader._data->set_auto_resolve_externals(true);
86 loader._data->set_coordinate_system(cs);
87 loader._record = record;
88
89 PT(VirtualFile) vfile = vfs->get_file(egg_filename);
90 if (vfile == nullptr) {
91 return nullptr;
92 }
93
94 loader._data->set_egg_timestamp(vfile->get_timestamp());
95
96 bool okflag;
97 std::istream *istr = vfile->open_read_file(true);
98 if (istr == nullptr) {
99 egg2pg_cat.error()
100 << "Couldn't read " << egg_filename << "\n";
101 return nullptr;
102 }
103
104 egg2pg_cat.info()
105 << "Reading " << egg_filename << "\n";
106
107 okflag = loader._data->read(*istr);
108 vfile->close_read_file(istr);
109
110 if (!okflag) {
111 egg2pg_cat.error()
112 << "Error reading " << egg_filename << "\n";
113 return nullptr;
114 }
115
116 return load_from_loader(loader);
117}
118
119/**
120 * Another convenience function; works like load_egg_file() but starts from an
121 * already-filled EggData structure. The structure is destroyed in the
122 * loading.
123 */
125load_egg_data(EggData *data, CoordinateSystem cs) {
126 // We temporarily shuttle the children to a holding node so we can copy them
127 // into the EggLoader's structure without it complaining.
128 EggGroupNode children_holder;
129 children_holder.steal_children(*data);
130
131 EggLoader loader(data);
132 loader._data->steal_children(children_holder);
133
134 loader._data->set_auto_resolve_externals(true);
135 loader._data->set_coordinate_system(cs);
136
137 return load_from_loader(loader);
138}
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
An instance of this class is written to the front of a Bam or Txo file to make the file a cached inst...
void add_dependent_file(const Filename &pathname)
Adds the indicated file to the list of files that will be loaded to generate the data in this record.
This class stores a list of directories that can be searched, in order, to locate a particular file.
Definition dSearchPath.h:28
This is the primary interface into all the egg data, and the root of the egg file structure.
Definition eggData.h:37
A base class for nodes in the hierarchy that are not leaf nodes.
void steal_children(EggGroupNode &other)
Moves all the children from the other node to this one.
Converts an egg data structure, possibly read from an egg file but not necessarily,...
Definition eggLoader.h:67
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 basic node of the scene graph or data graph.
Definition pandaNode.h:65
An interface for simplifying ("flattening") scene graphs by eliminating unneeded nodes and collapsing...
int collect_vertex_data(PandaNode *root, int collect_bits=~0)
Collects all different GeomVertexData blocks that have compatible formats at this node and below into...
void set_combine_radius(PN_stdfloat combine_radius)
Specifies the radius that is used in conjunction with CS_within_radius to decide whether a subgraph's...
int flatten(PandaNode *root, int combine_siblings_bits)
Simplifies the graph by removing unnecessary nodes and nodes.
void unify(PandaNode *root, bool preserve_order)
Calls unify() on every GeomNode at this level and below.
void premunge(PandaNode *root, const RenderState *initial_state)
Walks the scene graph rooted at this node and below, and uses the indicated GSG to premunge every Geo...
A hierarchy of directories and files that appears to be one continuous file system,...
PointerTo< VirtualFile > get_file(const Filename &filename, bool status_only=false) const
Looks up the file by the indicated name in the file system.
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
The abstract base class for a file or directory within the VirtualFileSystem.
Definition virtualFile.h:35
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.