| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // Filename: eggMultiBase.cxx
- // Created by: drose (02Nov00)
- //
- ////////////////////////////////////////////////////////////////////
- //
- // PANDA 3D SOFTWARE
- // Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
- //
- // All use of this software is subject to the terms of the Panda 3d
- // Software license. You should have received a copy of this license
- // along with this source code; you will also find a current copy of
- // the license at http://etc.cmu.edu/panda3d/docs/license/ .
- //
- // To contact the maintainers of this program write to
- // [email protected] .
- //
- ////////////////////////////////////////////////////////////////////
- #include "eggMultiBase.h"
- #include "eggBase.h"
- #include "eggData.h"
- #include "eggComment.h"
- #include "filename.h"
- #include "dSearchPath.h"
- ////////////////////////////////////////////////////////////////////
- // Function: EggMultiBase::Constructor
- // Access: Public
- // Description:
- ////////////////////////////////////////////////////////////////////
- EggMultiBase::
- EggMultiBase() {
- add_option
- ("f", "", 80,
- "Force complete loading: load up the egg file along with all of its "
- "external references.",
- &EggMultiBase::dispatch_none, &_force_complete);
- add_option
- ("noabs", "", 0,
- "Don't allow any of the named egg files to have absolute pathnames. "
- "If any do, abort with an error. This option is designed to help "
- "detect errors when populating or building a standalone model tree, "
- "which should be self-contained and include only relative pathnames.",
- &EggMultiBase::dispatch_none, &_noabs);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: EggMultiBase::post_process_egg_files
- // Access: Public
- // Description: Performs any processing of the egg file(s) that is
- // appropriate before writing them out. This includes any
- // normal adjustments the user requested via -np, etc.
- //
- // Normally, you should not need to call this function
- // directly; write_egg_files() calls it for you. You
- // should call this only if you do not use
- // write_egg_files() to write out the resulting egg
- // files.
- ////////////////////////////////////////////////////////////////////
- void EggMultiBase::
- post_process_egg_files() {
- if (_eggs.empty()) {
- return;
- }
- Eggs::iterator ei;
- if (_got_transform) {
- nout << "Applying transform matrix:\n";
- _transform.write(nout, 2);
- LVecBase3d scale, hpr, translate;
- if (decompose_matrix(_transform, scale, hpr, translate,
- _eggs[0]->get_coordinate_system())) {
- nout << "(scale " << scale << ", hpr " << hpr << ", translate "
- << translate << ")\n";
- }
- for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) {
- (*ei)->transform(_transform);
- }
- }
- switch (_normals_mode) {
- case NM_strip:
- nout << "Stripping normals.\n";
- for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) {
- (*ei)->strip_normals();
- (*ei)->remove_unused_vertices(true);
- }
- break;
- case NM_polygon:
- nout << "Recomputing polygon normals.\n";
- for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) {
- (*ei)->recompute_polygon_normals();
- (*ei)->remove_unused_vertices(true);
- }
- break;
- case NM_vertex:
- nout << "Recomputing vertex normals.\n";
- for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) {
- (*ei)->recompute_vertex_normals(_normals_threshold);
- (*ei)->remove_unused_vertices(true);
- }
- break;
- case NM_preserve:
- // Do nothing.
- break;
- }
- }
- ////////////////////////////////////////////////////////////////////
- // Function: EggMultiBase::read_egg
- // Access: Protected, Virtual
- // Description: Allocates and returns a new EggData structure that
- // represents the indicated egg file. If the egg file
- // cannot be read for some reason, returns NULL.
- //
- // This can be overridden by derived classes to control
- // how the egg files are read, or to extend the
- // information stored with each egg structure, by
- // deriving from EggData.
- ////////////////////////////////////////////////////////////////////
- PT(EggData) EggMultiBase::
- read_egg(const Filename &filename) {
- PT(EggData) data = new EggData;
- if (!data->read(filename)) {
- // Failure reading.
- return (EggData *)NULL;
- }
- if (_noabs && data->original_had_absolute_pathnames()) {
- nout << filename.get_basename()
- << " includes absolute pathnames!\n";
- return (EggData *)NULL;
- }
- DSearchPath file_path;
- file_path.append_directory(filename.get_dirname());
- // We always resolve filenames first based on the source egg
- // filename, since egg files almost always store relative paths.
- // This is a temporary kludge around integrating the path_replace
- // system with the EggData better.
- //
- // Update: I believe this kludge is obsolete. Commenting out. - Josh.
- // data->resolve_filenames(file_path);
- if (_force_complete) {
- if (!data->load_externals()) {
- return (EggData *)NULL;
- }
- }
- // Now resolve the filenames again according to the user's
- // specified _path_replace.
- EggBase::convert_paths(data, _path_replace, file_path);
- if (_got_coordinate_system) {
- data->set_coordinate_system(_coordinate_system);
- } else {
- _coordinate_system = data->get_coordinate_system();
- _got_coordinate_system = true;
- }
- return data;
- }
|