00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "load_egg_file.h"
00016 #include "eggLoader.h"
00017 #include "config_egg2pg.h"
00018 #include "sceneGraphReducer.h"
00019 #include "virtualFileSystem.h"
00020 #include "config_util.h"
00021 #include "bamCacheRecord.h"
00022
00023 static PT(PandaNode)
00024 load_from_loader(EggLoader &loader) {
00025 loader._data->load_externals(DSearchPath(), loader._record);
00026
00027 loader.build_graph();
00028
00029 if (loader._error && !egg_accept_errors) {
00030 egg2pg_cat.error()
00031 << "Errors in egg file.\n";
00032 return NULL;
00033 }
00034
00035 if (loader._root != (PandaNode *)NULL && egg_flatten) {
00036 SceneGraphReducer gr;
00037
00038 int combine_siblings_bits = 0;
00039 if (egg_combine_geoms) {
00040 combine_siblings_bits |= SceneGraphReducer::CS_geom_node;
00041 }
00042 if (egg_flatten_radius > 0.0) {
00043 combine_siblings_bits |= SceneGraphReducer::CS_within_radius;
00044 gr.set_combine_radius(egg_flatten_radius);
00045 }
00046
00047 int num_reduced = gr.flatten(loader._root, combine_siblings_bits);
00048 egg2pg_cat.info() << "Flattened " << num_reduced << " nodes.\n";
00049
00050 if (egg_unify) {
00051
00052
00053 if (premunge_data) {
00054 gr.premunge(loader._root, RenderState::make_empty());
00055 }
00056 gr.collect_vertex_data(loader._root);
00057 gr.unify(loader._root, true);
00058 if (egg2pg_cat.is_debug()) {
00059 egg2pg_cat.debug() << "Unified.\n";
00060 }
00061 }
00062 }
00063
00064 return loader._root;
00065 }
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 PT(PandaNode)
00077 load_egg_file(const Filename &filename, CoordinateSystem cs,
00078 BamCacheRecord *record) {
00079 Filename egg_filename = filename;
00080 egg_filename.set_text();
00081 VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
00082
00083 if (record != (BamCacheRecord *)NULL) {
00084 record->add_dependent_file(egg_filename);
00085 }
00086
00087 EggLoader loader;
00088 loader._data->set_egg_filename(egg_filename);
00089 loader._data->set_auto_resolve_externals(true);
00090 loader._data->set_coordinate_system(cs);
00091 loader._record = record;
00092
00093 bool okflag;
00094 istream *istr = vfs->open_read_file(egg_filename, true);
00095 if (istr == (istream *)NULL) {
00096 return NULL;
00097 }
00098
00099 egg2pg_cat.info()
00100 << "Reading " << egg_filename << "\n";
00101
00102 okflag = loader._data->read(*istr);
00103 vfs->close_read_file(istr);
00104
00105 if (!okflag) {
00106 egg2pg_cat.error()
00107 << "Error reading " << egg_filename << "\n";
00108 return NULL;
00109 }
00110
00111 return load_from_loader(loader);
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121 PT(PandaNode)
00122 load_egg_data(EggData *data, CoordinateSystem cs) {
00123
00124
00125 EggGroupNode children_holder;
00126 children_holder.steal_children(*data);
00127
00128 EggLoader loader(data);
00129 loader._data->steal_children(children_holder);
00130
00131 loader._data->set_auto_resolve_externals(true);
00132 loader._data->set_coordinate_system(cs);
00133
00134 return load_from_loader(loader);
00135 }