diff --git a/pandatool/src/egg-palettize/destTextureImage.cxx b/pandatool/src/egg-palettize/destTextureImage.cxx index 33df92624d..65db021e11 100644 --- a/pandatool/src/egg-palettize/destTextureImage.cxx +++ b/pandatool/src/egg-palettize/destTextureImage.cxx @@ -7,6 +7,7 @@ #include "sourceTextureImage.h" #include "texturePlacement.h" #include "textureImage.h" +#include "palettizer.h" #include #include @@ -15,6 +16,7 @@ TypeHandle DestTextureImage::_type_handle; + //////////////////////////////////////////////////////////////////// // Function: DestTextureImage::Default Constructor // Access: Private @@ -38,6 +40,11 @@ DestTextureImage(TexturePlacement *placement) { _x_size = texture->get_x_size(); _y_size = texture->get_y_size(); + if (pal->_force_power_2) { + _x_size = to_power_2(_x_size); + _y_size = to_power_2(_y_size); + } + set_filename(placement->get_group(), texture->get_name()); } @@ -49,7 +56,11 @@ DestTextureImage(TexturePlacement *placement) { //////////////////////////////////////////////////////////////////// void DestTextureImage:: copy(TextureImage *texture) { - write(texture->get_dest_image()); + const PNMImage &source_image = texture->read_source_image(); + PNMImage dest_image(_x_size, _y_size, texture->get_num_channels(), + source_image.get_maxval()); + dest_image.quick_filter_from(source_image); + write(dest_image); } //////////////////////////////////////////////////////////////////// @@ -78,6 +89,21 @@ copy_if_stale(const DestTextureImage *other, TextureImage *texture) { } } +//////////////////////////////////////////////////////////////////// +// Function: DestTextureImage::to_power_2 +// Access: Private, Static +// Description: Returns the largest power of 2 less than or equal to +// value. +//////////////////////////////////////////////////////////////////// +int DestTextureImage:: +to_power_2(int value) { + int x = 1; + while ((x << 1) <= value) { + x = (x << 1); + } + return x; +} + //////////////////////////////////////////////////////////////////// // Function: DestTextureImage::register_with_read_factory // Access: Public, Static diff --git a/pandatool/src/egg-palettize/destTextureImage.h b/pandatool/src/egg-palettize/destTextureImage.h index 3bd3d8e87d..f833762e47 100644 --- a/pandatool/src/egg-palettize/destTextureImage.h +++ b/pandatool/src/egg-palettize/destTextureImage.h @@ -29,6 +29,10 @@ public: void copy(TextureImage *texture); void copy_if_stale(const DestTextureImage *other, TextureImage *texture); +private: + static int to_power_2(int value); + + // The TypedWriteable interface follows. public: static void register_with_read_factory(); diff --git a/pandatool/src/egg-palettize/eggFile.cxx b/pandatool/src/egg-palettize/eggFile.cxx index a0d72c6000..0a63f643d7 100644 --- a/pandatool/src/egg-palettize/eggFile.cxx +++ b/pandatool/src/egg-palettize/eggFile.cxx @@ -327,6 +327,11 @@ choose_placements() { // Now groups is the set of groups that the egg file requires, // which also happen to include the texture. It better not be // empty. + if (groups.empty()) { + cerr << "groups empty for " << get_name() << ", texture " << texture->get_name() << "\n" + << "complete groups is " << get_complete_groups() << "\n" + << "texture groups is " << texture->get_groups() << "\n"; + } nassertv(!groups.empty()); // It doesn't really matter which group in the set we choose, so diff --git a/pandatool/src/egg-palettize/palettizer.cxx b/pandatool/src/egg-palettize/palettizer.cxx index ec9e312963..3724689784 100644 --- a/pandatool/src/egg-palettize/palettizer.cxx +++ b/pandatool/src/egg-palettize/palettizer.cxx @@ -21,6 +21,17 @@ Palettizer *pal = (Palettizer *)NULL; +// This number is written out as the first number to the pi file, to +// indicate the version of egg-palettize that wrote it out. This +// 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 = 2; +// Updated to version 1 on 12/11/00 to add _remap_char_uv. +// Updated to version 2 on 12/19/00 to add TexturePlacement::_dest. + +int Palettizer::_read_pi_version = 0; + TypeHandle Palettizer::_type_handle; ostream &operator << (ostream &out, Palettizer::RemapUV remap) { @@ -48,17 +59,6 @@ ostream &operator << (ostream &out, Palettizer::RemapUV remap) { //////////////////////////////////////////////////////////////////// Palettizer:: Palettizer() { - // This number is written out as the first number to the pi file, to - // indicate the version of egg-palettize that wrote it out. This - // 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. - - _pi_version = 1; - // Updated to version 1 on 12/11/00 to add _remap_char_uv. - - _read_pi_version = _pi_version; - _map_dirname = "%g"; _shadow_dirname = "shadow"; _margin = 2; diff --git a/pandatool/src/egg-palettize/palettizer.h b/pandatool/src/egg-palettize/palettizer.h index d0ac14b8c5..4ba4242ac5 100644 --- a/pandatool/src/egg-palettize/palettizer.h +++ b/pandatool/src/egg-palettize/palettizer.h @@ -54,8 +54,8 @@ private: static const char *yesno(bool flag); public: - int _pi_version; - int _read_pi_version; + static int _pi_version; + static int _read_pi_version; enum RemapUV { RU_never, diff --git a/pandatool/src/egg-palettize/textureImage.cxx b/pandatool/src/egg-palettize/textureImage.cxx index 42441aa2e3..554241d91c 100644 --- a/pandatool/src/egg-palettize/textureImage.cxx +++ b/pandatool/src/egg-palettize/textureImage.cxx @@ -8,6 +8,7 @@ #include "destTextureImage.h" #include "eggFile.h" #include "paletteGroup.h" +#include "paletteImage.h" #include "texturePlacement.h" #include "filenameUnifier.h" @@ -28,7 +29,6 @@ TextureImage:: TextureImage() { _preferred_source = (SourceTextureImage *)NULL; _read_source_image = false; - _got_dest_image = false; _is_surprise = true; _ever_read_image = false; _forced_grayscale = false; @@ -411,7 +411,6 @@ get_source(const Filename &filename, const Filename &alpha_filename) { // next time someone asks. _preferred_source = (SourceTextureImage *)NULL; _read_source_image = false; - _got_dest_image = false; return source; } @@ -578,27 +577,6 @@ read_source_image() { return _source_image; } -//////////////////////////////////////////////////////////////////// -// Function: TextureImage::get_dest_image -// Access: Public -// Description: Returns the image appropriate for writing to the -// destination directory, having been resized and -// everything. -//////////////////////////////////////////////////////////////////// -const PNMImage &TextureImage:: -get_dest_image() { - if (!_got_dest_image) { - const PNMImage &source_image = read_source_image(); - _dest_image.clear(get_x_size(), get_y_size(), get_num_channels(), - source_image.get_maxval()); - _dest_image.quick_filter_from(source_image); - - _got_dest_image = true; - } - - return _dest_image; -} - //////////////////////////////////////////////////////////////////// // Function: TextureImage::write_source_pathnames // Access: Public @@ -677,6 +655,39 @@ write_scale_info(ostream &out, int indent_level) { out << " scale " << scale << "%"; } out << "\n"; + + // Also cross-reference the placed and unplaced information. + Placement::iterator pi; + for (pi = _placement.begin(); pi != _placement.end(); ++pi) { + TexturePlacement *placement = (*pi).second; + if (placement->get_omit_reason() == OR_none) { + PaletteImage *image = placement->get_image(); + nassertv(image != (PaletteImage *)NULL); + indent(out, indent_level + 2) + << "placed on " + << FilenameUnifier::make_user_filename(image->get_filename()) + << "\n"; + } else { + DestTextureImage *image = placement->get_dest(); + nassertv(image != (DestTextureImage *)NULL); + indent(out, indent_level + 2) + << "copied to " + << FilenameUnifier::make_user_filename(image->get_filename()); + if (image->get_x_size() != get_x_size() || + image->get_y_size() != get_y_size()) { + out << " at size " << image->get_x_size() << " " + << image->get_y_size(); + if (source != (SourceTextureImage *)NULL && + source->is_size_known()) { + double scale = + 100.0 * (((double)image->get_x_size() / (double)source->get_x_size()) + + ((double)image->get_y_size() / (double)source->get_y_size())) / 2.0; + out << " scale " << scale << "%"; + } + } + out << "\n"; + } + } } //////////////////////////////////////////////////////////////////// @@ -1015,10 +1026,6 @@ write_datagram(BamWriter *writer, Datagram &datagram) { for (di = _dests.begin(); di != _dests.end(); ++di) { writer->write_pointer(datagram, (*di).second); } - - // We don't write out _read_source_image, _source_image, - // _got_dest_image, or _dest_image; these must be reread each - // session. } //////////////////////////////////////////////////////////////////// diff --git a/pandatool/src/egg-palettize/textureImage.h b/pandatool/src/egg-palettize/textureImage.h index 0f9508d95b..3d9c2ba09e 100644 --- a/pandatool/src/egg-palettize/textureImage.h +++ b/pandatool/src/egg-palettize/textureImage.h @@ -66,7 +66,6 @@ public: void copy_unplaced(bool redo_all); const PNMImage &read_source_image(); - const PNMImage &get_dest_image(); void write_source_pathnames(ostream &out, int indent_level = 0) const; void write_scale_info(ostream &out, int indent_level = 0); @@ -113,8 +112,6 @@ private: bool _read_source_image; PNMImage _source_image; - bool _got_dest_image; - PNMImage _dest_image; // The TypedWriteable interface follows. diff --git a/pandatool/src/egg-palettize/texturePlacement.cxx b/pandatool/src/egg-palettize/texturePlacement.cxx index 7b7a2c1cf2..77131b8bdb 100644 --- a/pandatool/src/egg-palettize/texturePlacement.cxx +++ b/pandatool/src/egg-palettize/texturePlacement.cxx @@ -10,6 +10,7 @@ #include "paletteImage.h" #include "palettizer.h" #include "eggFile.h" +#include "destTextureImage.h" #include #include @@ -898,9 +899,7 @@ write_datagram(BamWriter *writer, Datagram &datagram) { writer->write_pointer(datagram, _texture); writer->write_pointer(datagram, _group); writer->write_pointer(datagram, _image); - - // We don't write _dest. That can safely be redetermined each - // session. + writer->write_pointer(datagram, _dest); datagram.add_bool(_has_uvs); datagram.add_bool(_size_known); @@ -930,6 +929,10 @@ write_datagram(BamWriter *writer, Datagram &datagram) { int TexturePlacement:: complete_pointers(vector_typedWriteable &plist, BamReader *manager) { nassertr((int)plist.size() >= 3 + _num_references, 0); + if (Palettizer::_read_pi_version >= 2) { + nassertr((int)plist.size() >= 4 + _num_references, 0); + } + int index = 0; if (plist[index] != (TypedWriteable *)NULL) { @@ -947,6 +950,13 @@ complete_pointers(vector_typedWriteable &plist, BamReader *manager) { } index++; + if (Palettizer::_read_pi_version >= 2) { + if (plist[index] != (TypedWriteable *)NULL) { + DCAST_INTO_R(_dest, plist[index], index); + } + index++; + } + int i; for (i = 0; i < _num_references; i++) { TextureReference *reference; @@ -992,6 +1002,10 @@ fillin(DatagramIterator &scan, BamReader *manager) { manager->read_pointer(scan, this); // _group manager->read_pointer(scan, this); // _image + if (Palettizer::_read_pi_version >= 2) { + manager->read_pointer(scan, this); // _dest + } + _has_uvs = scan.get_bool(); _size_known = scan.get_bool(); _position.fillin(scan, manager); diff --git a/pandatool/src/egg-palettize/textureProperties.cxx b/pandatool/src/egg-palettize/textureProperties.cxx index f34373db98..b16e0aed57 100644 --- a/pandatool/src/egg-palettize/textureProperties.cxx +++ b/pandatool/src/egg-palettize/textureProperties.cxx @@ -174,6 +174,7 @@ fully_define() { break; case EggTexture::F_luminance_alpha: + case EggTexture::F_luminance_alphamask: _num_channels = 2; break; @@ -207,6 +208,7 @@ fully_define() { case 2: switch (_format) { case EggTexture::F_luminance_alpha: + case EggTexture::F_luminance_alphamask: break; default: @@ -393,6 +395,9 @@ get_format_string(EggTexture::Format format) { case EggTexture::F_luminance_alpha: return "t"; // t for two-channel + case EggTexture::F_luminance_alphamask: + return "t1"; + case EggTexture::F_red: return "r";