add -as, -nodb, -tn

This commit is contained in:
David Rose 2003-09-12 05:11:05 +00:00
parent a5b7fe25c5
commit e3abfcffc3
9 changed files with 229 additions and 98 deletions

View File

@ -69,26 +69,58 @@ EggPalettize() : EggMultiFilter(true) {
_force_complete = true;
add_option
("a", "filename", 0,
("af", "filename", 0,
"Read the indicated file as the .txa file. The default is textures.txa.",
&EggPalettize::dispatch_filename, &_got_txa_filename, &_txa_filename);
add_option
("a", "filename", 0,
"Deprecated option. This is the same as -af.",
&EggPalettize::dispatch_filename, &_got_txa_filename, &_txa_filename);
add_option
("as", "script", 0,
"Accept the script specified on the command line as the contents of the "
".txa file, instead of reading a file on disk. This implies -nodb and "
"-opt.",
&EggPalettize::dispatch_string, &_got_txa_script, &_txa_script);
add_option
("nodb", "", 0,
"Don't read or record the state information to a .boo file. By default, "
"the palettization information is recorded so it can be preserved "
"between multiple invocations of egg-palettize. If you specify this "
"parameter, all the egg files to be palettized together must be "
"named at the same time. This also implies -opt, since there's no point "
"in not making an optimal packing if you won't be preserving the "
"state for future adjustments.",
&EggPalettize::dispatch_none, &_nodb);
add_option
("tn", "pattern", 0,
"Specify the name to generate for each palette image. The string should "
"contain %g for the group name, %p for the page name, and %i for the "
"index within the page. The extension is inferred from the image "
"type. The default is '%g_palette_%p_%i'.",
&EggPalettize::dispatch_string, &_got_generated_image_pattern,
&_generated_image_pattern);
add_option
("pi", "", 0,
"Do not process anything, but instead report the detailed palettization "
"information.",
"information written in the state file.",
&EggPalettize::dispatch_none, &_report_pi);
add_option
("s", "", 0,
"Do not process anything, but report statistics on palette "
"and texture utilization.",
"and texture utilization from the state file.",
&EggPalettize::dispatch_none, &_report_statistics);
add_option
("R", "", 0,
"Remove the named egg files from the previously-generated state data "
"in textures.boo.",
"file.",
&EggPalettize::dispatch_none, &_remove_eggs);
// We redefine -d using add_option() instead of redescribe_option()
@ -507,31 +539,48 @@ run() {
loader_cat->set_severity(NS_warning);
}
if (!_txa_filename.exists() && !_got_txa_filename) {
// If we did not specify a filename, and the default filename of
// "textures.txa" doesn't exist, try looking in src/maps, as
// another likely possibility.
Filename maybe = _txa_filename;
maybe.set_dirname("src/maps");
if (maybe.exists()) {
_txa_filename = maybe;
}
}
if (!_txa_filename.exists()) {
nout << FilenameUnifier::make_user_filename(_txa_filename)
<< " does not exist; cannot run.\n";
exit(1);
}
FilenameUnifier::set_txa_filename(_txa_filename);
Filename state_filename = _txa_filename;
state_filename.set_extension("boo");
Filename state_filename;
BamFile state_file;
if (!state_filename.exists()) {
if (_got_txa_script) {
// If we got a command-line script instead of a .txa file, we
// won't be encoding a .boo file either.
_nodb = true;
} else {
// Look for the .txa file.
if (!_txa_filename.exists() && !_got_txa_filename) {
// If we did not specify a filename, and the default filename of
// "textures.txa" doesn't exist, try looking in src/maps, as
// another likely possibility.
Filename maybe = _txa_filename;
maybe.set_dirname("src/maps");
if (maybe.exists()) {
_txa_filename = maybe;
}
}
if (!_txa_filename.exists()) {
nout << FilenameUnifier::make_user_filename(_txa_filename)
<< " does not exist; cannot run.\n";
exit(1);
}
FilenameUnifier::set_txa_filename(_txa_filename);
state_filename = _txa_filename;
state_filename.set_extension("boo");
}
if (_nodb) {
// -nodb means don't attempt to read textures.boo; in fact, don't
// even bother reporting this absence to the user.
pal = new Palettizer;
// And -nodb implies -opt.
_optimal = true;
} else if (!state_filename.exists()) {
nout << FilenameUnifier::make_user_filename(state_filename)
<< " does not exist; starting palettization from scratch.\n";
pal = new Palettizer;
@ -599,7 +648,23 @@ run() {
bool okflag = true;
pal->read_txa_file(_txa_filename);
if (_got_txa_script) {
istringstream txa_script(_txa_script);
pal->read_txa_file(txa_script, "command line");
} else {
_txa_filename.set_text();
ifstream txa_file;
if (!_txa_filename.open_read(txa_file)) {
nout << "Unable to open " << _txa_filename << "\n";
exit(1);
}
pal->read_txa_file(txa_file, _txa_filename);
}
if (_got_generated_image_pattern) {
pal->_generated_image_pattern = _generated_image_pattern;
}
if (_got_default_groupname) {
pal->_default_groupname = _default_groupname;
@ -687,31 +752,33 @@ run() {
okflag = false;
}
// Make up a temporary filename to write the state file to, then
// move the state file into place. We do this in case the user
// interrupts us (or we core dump) before we're done; that way we
// won't leave the state file incompletely written.
string dirname = state_filename.get_dirname();
if (dirname.empty()) {
dirname = ".";
}
Filename temp_filename = Filename::temporary(dirname, "pi");
if (!state_file.open_write(temp_filename) ||
!state_file.write_object(pal)) {
nout << "Unable to write palettization information to "
<< FilenameUnifier::make_user_filename(temp_filename)
<< "\n";
exit(1);
}
state_file.close();
state_filename.unlink();
if (!temp_filename.rename_to(state_filename)) {
nout << "Unable to rename temporary file "
<< FilenameUnifier::make_user_filename(temp_filename) << " to "
<< FilenameUnifier::make_user_filename(state_filename) << "\n";
exit(1);
if (!_nodb) {
// Make up a temporary filename to write the state file to, then
// move the state file into place. We do this in case the user
// interrupts us (or we core dump) before we're done; that way we
// won't leave the state file incompletely written.
string dirname = state_filename.get_dirname();
if (dirname.empty()) {
dirname = ".";
}
Filename temp_filename = Filename::temporary(dirname, "pi");
if (!state_file.open_write(temp_filename) ||
!state_file.write_object(pal)) {
nout << "Unable to write palettization information to "
<< FilenameUnifier::make_user_filename(temp_filename)
<< "\n";
exit(1);
}
state_file.close();
state_filename.unlink();
if (!temp_filename.rename_to(state_filename)) {
nout << "Unable to rename temporary file "
<< FilenameUnifier::make_user_filename(temp_filename) << " to "
<< FilenameUnifier::make_user_filename(state_filename) << "\n";
exit(1);
}
}
if (!okflag) {

View File

@ -43,6 +43,11 @@ public:
// and palettes. These values are copied to the Palettizer.
bool _got_txa_filename;
Filename _txa_filename;
bool _got_txa_script;
string _txa_script;
bool _nodb;
string _generated_image_pattern;
bool _got_generated_image_pattern;
string _map_dirname;
bool _got_map_dirname;
Filename _shadow_dirname;

View File

@ -174,15 +174,51 @@ PaletteImage(PalettePage *page, int index) :
_new_image = true;
_got_image = false;
ostringstream name;
// Build up the basename for the palette image, based on the
// supplied image pattern.
string::iterator si = pal->_generated_image_pattern.begin();
while (si != pal->_generated_image_pattern.end()) {
if ((*si) == '%') {
// Some keycode.
++si;
if (si != pal->_generated_image_pattern.end()) {
switch (*si) {
case '%':
_basename += '%';
break;
case 'g':
_basename += page->get_group()->get_name();
break;
case 'p':
_basename += page->get_name();
break;
case 'i':
_basename += format_string(index + 1);
break;
default:
_basename += '%';
_basename += (*si);
}
++si;
}
} else {
// A literal character.
_basename += (*si);
++si;
}
}
// We must end the basename with a dot, so that it does not appear
// to have a filename extension. Otherwise, an embedded dot in the
// group's name would make everything following appear to be an
// extension, which would get lost in the set_filename() call.
name << page->get_group()->get_name() << "_palette_"
<< page->get_name() << "_" << index + 1 << ".";
_basename = name.str();
if (_basename.empty() || _basename[_basename.length() - 1] != '.') {
_basename += '.';
}
set_filename(page->get_group(), _basename);
_shadow_image.make_shadow_image(_basename);

View File

@ -24,15 +24,15 @@
#include "filenameUnifier.h"
#include "textureMemoryCounter.h"
#include <pnmImage.h>
#include <pnmFileTypeRegistry.h>
#include <pnmFileType.h>
#include <eggData.h>
#include <datagram.h>
#include <datagramIterator.h>
#include <bamReader.h>
#include <bamWriter.h>
#include <indent.h>
#include "pnmImage.h"
#include "pnmFileTypeRegistry.h"
#include "pnmFileType.h"
#include "eggData.h"
#include "datagram.h"
#include "datagramIterator.h"
#include "bamReader.h"
#include "bamWriter.h"
#include "indent.h"
Palettizer *pal = (Palettizer *)NULL;
@ -41,11 +41,12 @@ Palettizer *pal = (Palettizer *)NULL;
// allows us to easily update egg-palettize to write out additional
// information to its pi file, without having it increment the bam
// version number for all bam and boo files anywhere in the world.
int Palettizer::_pi_version = 11;
int Palettizer::_pi_version = 12;
// Updated to version 8 on 3/20/03 to remove extensions from texture key names.
// Updated to version 9 on 4/13/03 to add a few properties in various places.
// Updated to version 10 on 4/15/03 to add _alpha_file_channel.
// Updated to version 11 on 4/30/03 to add TextureReference::_tref_name
// Updated to version 11 on 4/30/03 to add TextureReference::_tref_name.
// Updated to version 12 on 9/11/03 to add _generated_image_pattern.
int Palettizer::_min_pi_version = 8;
// Dropped support for versions 7 and below on 7/14/03.
@ -99,6 +100,7 @@ public:
////////////////////////////////////////////////////////////////////
Palettizer::
Palettizer() {
_generated_image_pattern = "%g_palette_%p_%i";
_map_dirname = "%g";
_shadow_dirname = "shadow";
_margin = 2;
@ -137,6 +139,7 @@ report_pi() const {
cout
<< "\nparams\n"
<< " generated image pattern: " << _generated_image_pattern << "\n"
<< " map directory: " << _map_dirname << "\n"
<< " shadow directory: "
<< FilenameUnifier::make_user_filename(_shadow_dirname) << "\n"
@ -303,7 +306,7 @@ report_statistics() const {
// matching textures and egg files.
////////////////////////////////////////////////////////////////////
void Palettizer::
read_txa_file(const Filename &txa_filename) {
read_txa_file(istream &txa_file, const string &txa_filename) {
// Clear out the group dependencies, in preparation for reading them
// again from the .txa file.
Groups::iterator gi;
@ -316,7 +319,7 @@ read_txa_file(const Filename &txa_filename) {
_shadow_color_type = (PNMFileType *)NULL;
_shadow_alpha_type = (PNMFileType *)NULL;
if (!_txa_file.read(txa_filename)) {
if (!_txa_file.read(txa_file, txa_filename)) {
exit(1);
}
@ -883,6 +886,7 @@ write_datagram(BamWriter *writer, Datagram &datagram) {
TypedWritable::write_datagram(writer, datagram);
datagram.add_int32(_pi_version);
datagram.add_string(_generated_image_pattern);
datagram.add_string(_map_dirname);
datagram.add_string(FilenameUnifier::make_bam_filename(_shadow_dirname));
datagram.add_string(FilenameUnifier::make_bam_filename(_rel_dirname));
@ -1016,6 +1020,9 @@ fillin(DatagramIterator &scan, BamReader *manager) {
TypedWritable::fillin(scan, manager);
_read_pi_version = scan.get_int32();
if (_read_pi_version >= 12) {
_generated_image_pattern = scan.get_string();
}
_map_dirname = scan.get_string();
_shadow_dirname = FilenameUnifier::get_bam_filename(scan.get_string());
_rel_dirname = FilenameUnifier::get_bam_filename(scan.get_string());

View File

@ -51,7 +51,7 @@ public:
void report_pi() const;
void report_statistics() const;
void read_txa_file(const Filename &txa_filename);
void read_txa_file(istream &txa_file, const string &txa_filename);
void all_params_set();
void process_command_line_eggs(bool force_texture_read, const Filename &state_filename);
void process_all(bool force_texture_read, const Filename &state_filename);
@ -95,6 +95,7 @@ public:
// The following parameter values specifically relate to textures
// and palettes. These values are stored in the bam file for future
// reference.
string _generated_image_pattern;
string _map_dirname;
Filename _shadow_dirname;
Filename _rel_dirname;

View File

@ -20,11 +20,11 @@
#include "textureImage.h"
#include "filenameUnifier.h"
#include <pnmImageHeader.h>
#include <datagram.h>
#include <datagramIterator.h>
#include <bamReader.h>
#include <bamWriter.h>
#include "pnmImageHeader.h"
#include "datagram.h"
#include "datagramIterator.h"
#include "bamReader.h"
#include "bamWriter.h"
TypeHandle SourceTextureImage::_type_handle;

View File

@ -19,7 +19,7 @@
#ifndef SOURCETEXTUREIMAGE_H
#define SOURCETEXTUREIMAGE_H
#include <pandatoolbase.h>
#include "pandatoolbase.h"
#include "imageFile.h"

View File

@ -22,8 +22,8 @@
#include "paletteGroup.h"
#include "textureImage.h"
#include <notify.h>
#include <pnmFileTypeRegistry.h>
#include "notify.h"
#include "pnmFileTypeRegistry.h"
////////////////////////////////////////////////////////////////////
// Function: TxaFile::Constructor
@ -37,23 +37,16 @@ TxaFile() {
////////////////////////////////////////////////////////////////////
// Function: TxaFile::read
// Access: Public
// Description: Reads the indicated .txa filename, and returns true
// Description: Reads the indicated stream, and returns true
// if successful, or false if there is an error.
////////////////////////////////////////////////////////////////////
bool TxaFile::
read(Filename filename) {
filename.set_text();
ifstream in;
if (!filename.open_read(in)) {
nout << "Unable to open " << filename << "\n";
return false;
}
read(istream &in, const string &filename) {
string line;
getline(in, line);
int line_number = 1;
while (!in.eof() && !in.fail()) {
int ch = get_line_or_semicolon(in, line);
while (ch != EOF || !line.empty()) {
bool okflag = true;
// Strip off the comment.
@ -109,9 +102,10 @@ read(Filename filename) {
nout << "Error on line " << line_number << " of " << filename << "\n";
return false;
}
getline(in, line);
line_number++;
if (ch == '\n') {
line_number++;
}
ch = get_line_or_semicolon(in, line);
}
if (!in.eof()) {
@ -179,6 +173,25 @@ write(ostream &out) const {
}
}
////////////////////////////////////////////////////////////////////
// Function: TxaFile::get_line_or_semicolon
// Access: Private, Static
// Description: Reads the next line, or the next semicolon-delimited
// phrase, from the indicated input stream. Returns
// the character that marks the end of the line, or EOF
// if the end of file has been reached.
////////////////////////////////////////////////////////////////////
int TxaFile::
get_line_or_semicolon(istream &in, string &line) {
line = string();
int ch = in.get();
while (ch != EOF && ch != '\n' && ch != ';') {
line += ch;
ch = in.get();
}
return ch;
}
////////////////////////////////////////////////////////////////////
// Function: TxaFile::parse_group_line

View File

@ -19,12 +19,12 @@
#ifndef TXAFILE_H
#define TXAFILE_H
#include <pandatoolbase.h>
#include "pandatoolbase.h"
#include "txaLine.h"
#include <filename.h>
#include <vector_string.h>
#include "filename.h"
#include "vector_string.h"
#include "pvector.h"
@ -38,7 +38,7 @@ class TxaFile {
public:
TxaFile();
bool read(Filename filename);
bool read(istream &in, const string &filename);
bool match_egg(EggFile *egg_file) const;
bool match_texture(TextureImage *texture) const;
@ -46,6 +46,8 @@ public:
void write(ostream &out) const;
private:
static int get_line_or_semicolon(istream &in, string &line);
bool parse_group_line(const vector_string &words);
bool parse_palette_line(const vector_string &words);
bool parse_margin_line(const vector_string &words);