فهرست منبع

*** empty log message ***

David Rose 25 سال پیش
والد
کامیت
ae73eb88a7

+ 27 - 1
pandatool/src/egg-palettize/destTextureImage.cxx

@@ -7,6 +7,7 @@
 #include "sourceTextureImage.h"
 #include "texturePlacement.h"
 #include "textureImage.h"
+#include "palettizer.h"
 
 #include <datagram.h>
 #include <datagramIterator.h>
@@ -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

+ 4 - 0
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();

+ 5 - 0
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

+ 11 - 11
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;

+ 2 - 2
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,

+ 34 - 27
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.
 }
 
 ////////////////////////////////////////////////////////////////////

+ 0 - 3
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.

+ 17 - 3
pandatool/src/egg-palettize/texturePlacement.cxx

@@ -10,6 +10,7 @@
 #include "paletteImage.h"
 #include "palettizer.h"
 #include "eggFile.h"
+#include "destTextureImage.h"
 
 #include <indent.h>
 #include <datagram.h>
@@ -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);

+ 5 - 0
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";