Browse Source

add force-rgb, etc.

David Rose 24 years ago
parent
commit
22a1af25a4

+ 2 - 1
pandatool/src/egg-palettize/palettizer.cxx

@@ -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 = 4;
+int Palettizer::_pi_version = 5;
 // 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.
 // Updated to version 3 on 12/19/00 to add PaletteGroup::_dependency_order.
 // Updated to version 4 on 5/3/01 to add PaletteGroup::_dirname_order.
+// Updated to version 5 on 10/31/01 to add TextureProperties::_force_format.
 
 int Palettizer::_read_pi_version = 0;
 

+ 1 - 0
pandatool/src/egg-palettize/textureImage.cxx

@@ -320,6 +320,7 @@ post_txa_file() {
 
   if (_request._format != EggTexture::F_unspecified) {
     _properties._format = _request._format;
+    _properties._force_format = _request._force_format;
   }
   if (_request._minfilter != EggTexture::FT_unspecified) {
     _properties._minfilter = _request._minfilter;

+ 100 - 62
pandatool/src/egg-palettize/textureProperties.cxx

@@ -37,6 +37,7 @@ TextureProperties() {
   _got_num_channels = false;
   _num_channels = 0;
   _format = EggTexture::F_unspecified;
+  _force_format = false;
   _minfilter = EggTexture::FT_unspecified;
   _magfilter = EggTexture::FT_unspecified;
   _color_type = (PNMFileType *)NULL;
@@ -53,6 +54,7 @@ TextureProperties(const TextureProperties &copy) :
   _got_num_channels(copy._got_num_channels),
   _num_channels(copy._num_channels),
   _format(copy._format),
+  _force_format(copy._force_format),
   _minfilter(copy._minfilter),
   _magfilter(copy._magfilter),
   _color_type(copy._color_type),
@@ -70,6 +72,7 @@ operator = (const TextureProperties &copy) {
   _got_num_channels = copy._got_num_channels;
   _num_channels = copy._num_channels;
   _format = copy._format;
+  _force_format = copy._force_format;
   _minfilter = copy._minfilter;
   _magfilter = copy._magfilter;
   _color_type = copy._color_type;
@@ -107,8 +110,28 @@ get_num_channels() const {
 ////////////////////////////////////////////////////////////////////
 bool TextureProperties::
 uses_alpha() const {
-  return (_num_channels == 2 || _num_channels == 4 ||
-          _format == EggTexture::F_alpha);
+  switch (_format) {
+  case EggTexture::F_rgba:
+  case EggTexture::F_rgba12:
+  case EggTexture::F_rgba8:
+  case EggTexture::F_rgba4:
+  case EggTexture::F_rgba5:
+  case EggTexture::F_alpha:
+  case EggTexture::F_luminance_alpha:
+  case EggTexture::F_luminance_alphamask:
+    return true;
+
+  default:
+    return false;
+  }
+
+  /*
+  if (!_force_format) {
+    return (_num_channels == 2 || _num_channels == 4);
+  }
+
+  return false;
+  */
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -148,7 +171,14 @@ update_properties(const TextureProperties &other) {
     _got_num_channels = other._got_num_channels;
     _num_channels = other._num_channels;
   }
-  _format = union_format(_format, other._format);
+  if (_force_format) {
+    // If we've forced our own format, it doesn't change.
+  } else if (other._force_format) {
+    _format = other._format;
+  } else {
+    _format = union_format(_format, other._format);
+  }
+
   _minfilter = union_filter(_minfilter, other._minfilter);
   _magfilter = union_filter(_magfilter, other._magfilter);
 
@@ -166,7 +196,7 @@ update_properties(const TextureProperties &other) {
 ////////////////////////////////////////////////////////////////////
 void TextureProperties::
 fully_define() {
-  if (!_got_num_channels) {
+  if (!_got_num_channels || _force_format) {
     switch (_format) {
     case EggTexture::F_rgba:
     case EggTexture::F_rgbm:
@@ -203,67 +233,69 @@ fully_define() {
   }
 
   // Make sure the format reflects the number of channels.
-  switch (_num_channels) {
-  case 1:
-    switch (_format) {
-    case EggTexture::F_red:
-    case EggTexture::F_green:
-    case EggTexture::F_blue:
-    case EggTexture::F_alpha:
-    case EggTexture::F_luminance:
-      break;
-
-    default:
-      _format = EggTexture::F_luminance;
-    }
-    break;
-
-  case 2:
-    switch (_format) {
-    case EggTexture::F_luminance_alpha:
-    case EggTexture::F_luminance_alphamask:
+  if (!_force_format) {
+    switch (_num_channels) {
+    case 1:
+      switch (_format) {
+      case EggTexture::F_red:
+      case EggTexture::F_green:
+      case EggTexture::F_blue:
+      case EggTexture::F_alpha:
+      case EggTexture::F_luminance:
+        break;
+        
+      default:
+        _format = EggTexture::F_luminance;
+      }
       break;
-
-    default:
-      _format = EggTexture::F_luminance_alpha;
-    }
-    break;
-
-  case 3:
-    switch (_format) {
-    case EggTexture::F_rgb:
-    case EggTexture::F_rgb12:
-    case EggTexture::F_rgb8:
-    case EggTexture::F_rgb5:
-    case EggTexture::F_rgb332:
-      break;
-
-    case EggTexture::F_rgba8:
-      _format = EggTexture::F_rgb8;
-      break;
-
-    case EggTexture::F_rgba5:
-    case EggTexture::F_rgba4:
-      _format = EggTexture::F_rgb5;
+      
+    case 2:
+      switch (_format) {
+      case EggTexture::F_luminance_alpha:
+      case EggTexture::F_luminance_alphamask:
+        break;
+        
+      default:
+        _format = EggTexture::F_luminance_alpha;
+      }
       break;
-
-    default:
-      _format = EggTexture::F_rgb;
-    }
-    break;
-
-  case 4:
-    switch (_format) {
-    case EggTexture::F_rgba:
-    case EggTexture::F_rgbm:
-    case EggTexture::F_rgba12:
-    case EggTexture::F_rgba8:
-    case EggTexture::F_rgba4:
-    case EggTexture::F_rgba5:
+      
+    case 3:
+      switch (_format) {
+      case EggTexture::F_rgb:
+      case EggTexture::F_rgb12:
+      case EggTexture::F_rgb8:
+      case EggTexture::F_rgb5:
+      case EggTexture::F_rgb332:
+        break;
+        
+      case EggTexture::F_rgba8:
+        _format = EggTexture::F_rgb8;
+        break;
+        
+      case EggTexture::F_rgba5:
+      case EggTexture::F_rgba4:
+        _format = EggTexture::F_rgb5;
+        break;
+        
+      default:
+        _format = EggTexture::F_rgb;
+      }
       break;
-
-    default:
-      _format = EggTexture::F_rgba;
+      
+    case 4:
+      switch (_format) {
+      case EggTexture::F_rgba:
+      case EggTexture::F_rgbm:
+      case EggTexture::F_rgba12:
+      case EggTexture::F_rgba8:
+      case EggTexture::F_rgba4:
+      case EggTexture::F_rgba5:
+        break;
+        
+      default:
+        _format = EggTexture::F_rgba;
+      }
     }
   }
 
@@ -575,6 +607,7 @@ write_datagram(BamWriter *writer, Datagram &datagram) {
   datagram.add_bool(_got_num_channels);
   datagram.add_int32(_num_channels);
   datagram.add_int32((int)_format);
+  datagram.add_bool(_force_format);
   datagram.add_int32((int)_minfilter);
   datagram.add_int32((int)_magfilter);
   writer->write_pointer(datagram, _color_type);
@@ -639,6 +672,11 @@ fillin(DatagramIterator &scan, BamReader *manager) {
   _got_num_channels = scan.get_bool();
   _num_channels = scan.get_int32();
   _format = (EggTexture::Format)scan.get_int32();
+  if (Palettizer::_read_pi_version >= 5) {
+    _force_format = scan.get_bool();
+  } else {
+    _force_format = false;
+  }
   _minfilter = (EggTexture::FilterType)scan.get_int32();
   _magfilter = (EggTexture::FilterType)scan.get_int32();
   manager->read_pointer(scan, this);  // _color_type

+ 1 - 0
pandatool/src/egg-palettize/textureProperties.h

@@ -58,6 +58,7 @@ public:
   bool _got_num_channels;
   int _num_channels;
   EggTexture::Format _format;
+  bool _force_format;
   EggTexture::FilterType _minfilter, _magfilter;
   PNMFileType *_color_type;
   PNMFileType *_alpha_type;

+ 1 - 0
pandatool/src/egg-palettize/textureRequest.cxx

@@ -32,6 +32,7 @@ TextureRequest() {
   _y_size = 0;
   _num_channels = 0;
   _format = EggTexture::F_unspecified;
+  _force_format = false;
   _minfilter = EggTexture::FT_unspecified;
   _magfilter = EggTexture::FT_unspecified;
   _omit = false;

+ 1 - 0
pandatool/src/egg-palettize/textureRequest.h

@@ -44,6 +44,7 @@ public:
   int _y_size;
   int _num_channels;
   EggTexture::Format _format;
+  bool _force_format;
   EggTexture::FilterType _minfilter;
   EggTexture::FilterType _magfilter;
   bool _omit;

+ 24 - 2
pandatool/src/egg-palettize/txaLine.cxx

@@ -40,6 +40,7 @@ TxaLine() {
   _y_size = 0;
   _num_channels = 0;
   _format = EggTexture::F_unspecified;
+  _force_format = false;
   _got_margin = false;
   _margin = 0;
   _got_coverage_threshold = false;
@@ -205,11 +206,28 @@ parse(const string &line) {
         }
         _got_coverage_threshold = true;
 
+      } else if (word.substr(0, 6) == "force-") {
+        // Force a particular format, despite the number of channels
+        // in the image.
+        string format_name = word.substr(6);
+        EggTexture::Format format = EggTexture::string_format(format_name);
+        if (format != EggTexture::F_unspecified) {
+          _format = format;
+          _force_format = true;
+        } else {
+          nout << "Unknown image format: " << format_name << "\n";
+          return false;
+        }
+
       } else {
-        // Maybe it's a format name.
+        // Maybe it's a format name.  This suggests an image format,
+        // but may be overridden to reflect the number of channels in
+        // the image.
         EggTexture::Format format = EggTexture::string_format(word);
         if (format != EggTexture::F_unspecified) {
-          _format = format;
+          if (!_force_format) {
+            _format = format;
+          }
         } else {
           // Maybe it's a group name.
           PaletteGroup *group = pal->test_palette_group(word);
@@ -365,6 +383,7 @@ match_texture(TextureImage *texture) const {
 
   if (_format != EggTexture::F_unspecified) {
     request._format = _format;
+    request._force_format = _force_format;
   }
 
   bool got_cont = false;
@@ -485,6 +504,9 @@ output(ostream &out) const {
 
   if (_format != EggTexture::F_unspecified) {
     out << " " << _format;
+    if (_force_format) {
+      out << " (forced)";
+    }
   }
 
   if (_color_type != (PNMFileType *)NULL) {

+ 1 - 0
pandatool/src/egg-palettize/txaLine.h

@@ -68,6 +68,7 @@ private:
   int _y_size;
   int _num_channels;
   EggTexture::Format _format;
+  bool _force_format;
 
   bool _got_margin;
   int _margin;