diff --git a/panda/src/express/get_config_path.cxx b/panda/src/express/get_config_path.cxx index a6599fa50d..4ee4d64108 100644 --- a/panda/src/express/get_config_path.cxx +++ b/panda/src/express/get_config_path.cxx @@ -25,7 +25,7 @@ // time when we can't be sure what has or hasn't been // already initialized. //////////////////////////////////////////////////////////////////// -const DSearchPath & +DSearchPath & get_config_path(const string &config_var_name, DSearchPath *&static_ptr) { if (static_ptr == (DSearchPath *)NULL) { static_ptr = new DSearchPath; diff --git a/panda/src/express/get_config_path.h b/panda/src/express/get_config_path.h index 658e5a94c2..4a298f6703 100644 --- a/panda/src/express/get_config_path.h +++ b/panda/src/express/get_config_path.h @@ -28,7 +28,7 @@ // time when we can't be sure what has or hasn't been // already initialized. //////////////////////////////////////////////////////////////////// -EXPCL_PANDAEXPRESS const DSearchPath & +EXPCL_PANDAEXPRESS DSearchPath & get_config_path(const string &config_var_name, DSearchPath *&static_ptr); #endif diff --git a/panda/src/putil/config_util.cxx b/panda/src/putil/config_util.cxx index 8c3a2c4a21..834c0b7a05 100644 --- a/panda/src/putil/config_util.cxx +++ b/panda/src/putil/config_util.cxx @@ -57,19 +57,19 @@ ConfigureFn(config_util) { //const bool track_memory_usage = config_util.GetBool("track-memory-usage", false); -const DSearchPath & +DSearchPath & get_model_path() { static DSearchPath *model_path = NULL; return get_config_path("model-path", model_path); } -const DSearchPath & +DSearchPath & get_texture_path() { static DSearchPath *texture_path = NULL; return get_config_path("texture-path", texture_path); } -const DSearchPath & +DSearchPath & get_sound_path() { static DSearchPath *sound_path = NULL; return get_config_path("sound-path", sound_path); diff --git a/panda/src/putil/config_util.h b/panda/src/putil/config_util.h index 62cdaeaf73..ea80a1b297 100644 --- a/panda/src/putil/config_util.h +++ b/panda/src/putil/config_util.h @@ -26,8 +26,8 @@ NotifyCategoryDecl(util, EXPCL_PANDA, EXPTP_PANDA); // computed based on the concatenation of all appearances of the // corresponding variable in the config files. -EXPCL_PANDA const DSearchPath &get_model_path(); -EXPCL_PANDA const DSearchPath &get_texture_path(); -EXPCL_PANDA const DSearchPath &get_sound_path(); +EXPCL_PANDA DSearchPath &get_model_path(); +EXPCL_PANDA DSearchPath &get_texture_path(); +EXPCL_PANDA DSearchPath &get_sound_path(); #endif /* __CONFIG_UTIL_H__ */ diff --git a/pandatool/src/bam/eggToBam.cxx b/pandatool/src/bam/eggToBam.cxx index 050df4417a..e965ad0242 100644 --- a/pandatool/src/bam/eggToBam.cxx +++ b/pandatool/src/bam/eggToBam.cxx @@ -5,6 +5,7 @@ #include "eggToBam.h" +#include #include #include @@ -21,6 +22,12 @@ EggToBam() : ("This program reads Egg files and outputs Bam files, the binary format " "suitable for direct loading of animation and models into Panda."); + add_option + ("tp", "path", 0, + "Add the indicated colon-delimited paths to the texture-path. This " + "option may also be repeated to add multiple paths.", + &EggToBam::dispatch_search_path, NULL, &get_texture_path()); + redescribe_option ("cs", "Specify the coordinate system of the resulting " + _format_name + diff --git a/pandatool/src/cvscopy/cvsCopy.cxx b/pandatool/src/cvscopy/cvsCopy.cxx index 2911341d4c..220dd42364 100644 --- a/pandatool/src/cvscopy/cvsCopy.cxx +++ b/pandatool/src/cvscopy/cvsCopy.cxx @@ -135,7 +135,7 @@ import(const Filename &source, void *extra_data, return (CVSSourceDirectory *)NULL; } if (new_file) { - create_file(dest); + cvs_add(dest); } } @@ -315,14 +315,14 @@ copy_binary_file(Filename source, Filename dest) { } //////////////////////////////////////////////////////////////////// -// Function: CVSCopy::create_file +// Function: CVSCopy::cvs_add // Access: Protected // Description: Invokes CVS to add the indicated filename to the // repository, if the user so requested. Returns true // if successful, false if there is an error. //////////////////////////////////////////////////////////////////// bool CVSCopy:: -create_file(const Filename &filename) { +cvs_add(const Filename &filename) { if (_no_cvs) { return true; } diff --git a/pandatool/src/cvscopy/cvsCopy.h b/pandatool/src/cvscopy/cvsCopy.h index 2b53a394ff..876a271fe0 100644 --- a/pandatool/src/cvscopy/cvsCopy.h +++ b/pandatool/src/cvscopy/cvsCopy.h @@ -42,7 +42,7 @@ protected: bool verify_binary_file(Filename source, Filename dest); bool copy_binary_file(Filename source, Filename dest); - bool create_file(const Filename &filename); + bool cvs_add(const Filename &filename); private: bool scan_hierarchy(); diff --git a/pandatool/src/egg-palettize/attribFile.cxx b/pandatool/src/egg-palettize/attribFile.cxx index ed88f05a97..8cfcd67b85 100644 --- a/pandatool/src/egg-palettize/attribFile.cxx +++ b/pandatool/src/egg-palettize/attribFile.cxx @@ -29,6 +29,11 @@ AttribFile(const Filename &filename) { _pi_filename.set_extension("pi"); _txa_fd = -1; + + _pi_dir = _pi_filename; + _pi_dir.set_basename(""); + _pi_dir.make_canonical(); + _default_group = (PaletteGroup *)NULL; _optimal = false; @@ -142,11 +147,56 @@ write() { return okflag; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::write_pi_filename +// Access: Public +// Description: Returns a new filename that's made relative to the +// .pi file itself, suitable for writing to the .pi file. +//////////////////////////////////////////////////////////////////// +Filename AttribFile:: +write_pi_filename(Filename filename) const { + filename.make_canonical(); + filename.make_relative_to(_pi_dir); + return filename; +} + +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::read_pi_filename +// Access: Public +// Description: Returns an absolute pathname based on the given +// relative pathname, presumably read from the .pi file +// and relative to the .pi file. +//////////////////////////////////////////////////////////////////// +Filename AttribFile:: +read_pi_filename(Filename filename) const { + if (!filename.empty()) { + filename.make_absolute(_pi_dir); + } + return filename; +} + +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::write_egg_filename +// Access: Public +// Description: Returns a new filename that's made relative to the +// rel_directory, suitable for writing out within egg +// files. +//////////////////////////////////////////////////////////////////// +Filename AttribFile:: +write_egg_filename(Filename filename) const { + filename.make_canonical(); + filename.make_relative_to(_rel_dirname); + return filename; +} + void AttribFile:: update_params(EggPalettize *prog) { if (prog->_got_map_dirname) { _map_dirname = prog->_map_dirname; } + if (prog->_got_rel_dirname) { + _rel_dirname = prog->_rel_dirname; + } if (prog->_got_palette_size) { _pal_xsize = prog->_pal_size[0]; _pal_ysize = prog->_pal_size[1]; @@ -160,6 +210,10 @@ update_params(EggPalettize *prog) { if (prog->_got_aggressively_clean_mapdir) { _aggressively_clean_mapdir = prog->_aggressively_clean_mapdir; } + + if (!_rel_dirname.empty()) { + _rel_dirname.make_canonical(); + } } //////////////////////////////////////////////////////////////////// @@ -508,8 +562,9 @@ get_eligible_textures(vector &textures) { SourceEgg *AttribFile:: get_egg(Filename name) { + string basename = name.get_basename(); Eggs::iterator ei; - ei = _eggs.find(name); + ei = _eggs.find(basename); if (ei != _eggs.end()) { return (*ei).second; } @@ -517,7 +572,7 @@ get_egg(Filename name) { SourceEgg *egg = new SourceEgg(this); egg->resolve_egg_filename(name); egg->set_egg_filename(name); - _eggs[name] = egg; + _eggs[basename] = egg; return egg; } @@ -799,6 +854,7 @@ write_pi(ostream &out) const { out << "\nparams\n" << " map_directory " << _map_dirname << "\n" + << " rel_directory " << write_pi_filename(_rel_dirname) << "\n" << " pal_xsize " << _pal_xsize << "\n" << " pal_ysize " << _pal_ysize << "\n" << " default_margin " << _default_margin << "\n" @@ -902,6 +958,8 @@ parse_params(const vector &words, istream &infile, if (param == "map_directory") { _map_dirname = value; + } else if (param == "rel_directory") { + _rel_dirname = read_pi_filename(value); } else if (param == "pal_xsize") { _pal_xsize = atoi(value.c_str()); } else if (param == "pal_ysize") { @@ -1013,12 +1071,12 @@ parse_pathname(const vector &words, istream &infile, nout << "Expected texture name and pathname.\n"; return false; } - texture->add_filename(twords[0]); + texture->add_filename(read_pi_filename(twords[0])); } else if (twords.size() == 2) { // Two words on the line means it's a texture name and filename. texture = get_texture(twords[0]); - texture->add_filename(twords[1]); + texture->add_filename(read_pi_filename(twords[1])); } else { // Anything else is a mistake. @@ -1042,7 +1100,7 @@ parse_egg(const vector &words, istream &infile, return false; } - SourceEgg *egg = get_egg(words[1]); + SourceEgg *egg = get_egg(read_pi_filename(words[1])); if (words.size() > 2 && words[2] == "in") { // Get the group names. @@ -1143,7 +1201,7 @@ parse_palette(const vector &words, istream &infile, return false; } - string filename = words[1]; + string filename = read_pi_filename(words[1]); if (!(words[2] == "in")) { nout << "Expected keyword 'in'\n"; return false; diff --git a/pandatool/src/egg-palettize/attribFile.h b/pandatool/src/egg-palettize/attribFile.h index 3b8e0e5897..2389e04a57 100644 --- a/pandatool/src/egg-palettize/attribFile.h +++ b/pandatool/src/egg-palettize/attribFile.h @@ -37,6 +37,10 @@ public: bool read(bool force_redo_all); bool write(); + Filename write_pi_filename(Filename filename) const; + Filename read_pi_filename(Filename filename) const; + Filename write_egg_filename(Filename filename) const; + void update_params(EggPalettize *prog); PaletteGroup *get_group(const string &group_name); @@ -119,6 +123,8 @@ private: Filename _txa_filename; Filename _pi_filename; + Filename _pi_dir; + PaletteGroup *_default_group; public: @@ -128,6 +134,7 @@ public: // palettes, and thus should be stored in the .pi file for future // reference. string _map_dirname; + Filename _rel_dirname; int _pal_xsize, _pal_ysize; int _default_margin; bool _force_power_2; diff --git a/pandatool/src/egg-palettize/eggPalettize.cxx b/pandatool/src/egg-palettize/eggPalettize.cxx index 475b5c2f65..1d9f19949f 100644 --- a/pandatool/src/egg-palettize/eggPalettize.cxx +++ b/pandatool/src/egg-palettize/eggPalettize.cxx @@ -69,6 +69,11 @@ EggPalettize() : EggMultiFilter(true) { "this will be replaced with the \"dir\" string associated with a " "palette group.", &EggPalettize::dispatch_string, &_got_map_dirname, &_map_dirname); + add_option + ("dr", "dirname", 0, + "The directory to make map filenames relative to when writing egg " + "files. If specified, this should be an initial substring of -dm.", + &EggPalettize::dispatch_filename, &_got_rel_dirname, &_rel_dirname); add_option ("g", "group", 0, "The default palette group that egg files will be assigned to if they " @@ -181,7 +186,6 @@ handle_args(ProgramBase::Args &args) { exit(1); } - Args egg_names; Args txa_names; diff --git a/pandatool/src/egg-palettize/eggPalettize.h b/pandatool/src/egg-palettize/eggPalettize.h index b386d18e2c..1660803909 100644 --- a/pandatool/src/egg-palettize/eggPalettize.h +++ b/pandatool/src/egg-palettize/eggPalettize.h @@ -40,6 +40,8 @@ public: // reference. string _map_dirname; bool _got_map_dirname; + Filename _rel_dirname; + bool _got_rel_dirname; string _default_groupname; bool _got_default_groupname; string _default_groupdir; diff --git a/pandatool/src/egg-palettize/pTexture.cxx b/pandatool/src/egg-palettize/pTexture.cxx index c256b8a038..d3680841e8 100644 --- a/pandatool/src/egg-palettize/pTexture.cxx +++ b/pandatool/src/egg-palettize/pTexture.cxx @@ -358,7 +358,8 @@ write_pathname(ostream &out) const { nout << "Warning: texture " << _filename << " does not exist.\n"; } - out << " " << _name << " " << _filename << "\n"; + out << " " << _name << " " << _attrib_file->write_pi_filename(_filename) + << "\n"; // Also write out all the alternate filenames. Filenames::const_iterator fi; @@ -368,7 +369,7 @@ write_pathname(ostream &out) const { for (int i = 0; i < (int)_name.length() + 3; i++) { out << ' '; } - out << (*fi) << "\n"; + out << _attrib_file->write_pi_filename(*fi) << "\n"; } } } diff --git a/pandatool/src/egg-palettize/palette.cxx b/pandatool/src/egg-palettize/palette.cxx index 7176f507a3..3f54cdbe21 100644 --- a/pandatool/src/egg-palettize/palette.cxx +++ b/pandatool/src/egg-palettize/palette.cxx @@ -357,7 +357,8 @@ finalize_palette() { void Palette:: write(ostream &out) const { - out << "palette " << _filename << " in " << _group->get_name() + out << "palette " << _attrib_file->write_pi_filename(_filename) + << " in " << _group->get_name() << " size " << _xsize << " " << _ysize << " " << _components << "\n"; TexPlace::const_iterator ti; diff --git a/pandatool/src/egg-palettize/sourceEgg.cxx b/pandatool/src/egg-palettize/sourceEgg.cxx index 1a6d3703d4..fde3aafe69 100644 --- a/pandatool/src/egg-palettize/sourceEgg.cxx +++ b/pandatool/src/egg-palettize/sourceEgg.cxx @@ -289,14 +289,14 @@ update_trefs() { packing->get_omit() != OR_none) { // This texture wasn't palettized, so just rename the // reference to the new one. - eggtex->set_fullpath(packing->get_new_filename()); + eggtex->set_fullpath(_attrib_file->write_egg_filename(packing->get_new_filename())); } else { // This texture was palettized, so redirect the tref to point // within the palette. Palette *palette = packing->get_palette(); - eggtex->set_fullpath(palette->get_filename()); + eggtex->set_fullpath(_attrib_file->write_egg_filename(palette->get_filename())); // Set the texture attributes to be uniform across all palettes. eggtex->set_minfilter(EggTexture::FT_mipmap_trilinear); @@ -402,9 +402,8 @@ set_matched_anything(bool matched_anything) { //////////////////////////////////////////////////////////////////// void SourceEgg:: write_pi(ostream &out) const { - Filename absolute_filename = get_egg_filename(); - absolute_filename.make_absolute(); - out << "egg " << absolute_filename << " in"; + Filename filename = _attrib_file->write_pi_filename(get_egg_filename()); + out << "egg " << filename << " in"; PaletteGroups::const_iterator gi; for (gi = _groups.begin(); gi != _groups.end(); ++gi) { out << " " << (*gi)->get_name(); diff --git a/pandatool/src/fltprogs/fltCopy.cxx b/pandatool/src/fltprogs/fltCopy.cxx index 792b740664..0144ba8938 100644 --- a/pandatool/src/fltprogs/fltCopy.cxx +++ b/pandatool/src/fltprogs/fltCopy.cxx @@ -204,7 +204,7 @@ copy_texture(const Filename &source, const Filename &dest, tex->write_attr_data(attr_filename); if (new_file) { - create_file(attr_filename); + add_cvs(attr_filename); } return true;