Browse Source

add implicit "null" group

David Rose 17 years ago
parent
commit
57027bf5dd

+ 9 - 9
pandatool/src/palettizer/eggFile.cxx

@@ -451,17 +451,17 @@ choose_placements() {
       groups.make_intersection(get_complete_groups(), texture->get_groups());
 
       // Now groups is the set of groups that the egg file requires,
-      // which also happen to include the texture.  It better not be
-      // empty.
+      // which also happen to include the texture.
+
       if (groups.empty()) {
-        nout << "Warning!  Egg file " << get_name() << " and texture "
-             << *reference << " do not have any groups in common.\n"
-             << "Egg groups:\n";
-        get_complete_groups().write(nout, 2);
-        nout << "Texture groups:\n";
-        texture->get_groups().write(nout, 2);
+        // It might be empty if the egg file was assigned only to the
+        // "null" group (since this group is not propagated to the
+        // textures).  In this case, choose from the wider set of
+        // groups available to the texture.
+        groups = texture->get_groups();
+      }
 
-      } else {
+      if (!groups.empty()) {
         // It doesn't really matter which group in the set we choose, so
         // we arbitrarily choose the first one.
         PaletteGroup *group = (*groups.begin());

+ 0 - 1
pandatool/src/palettizer/paletteGroup.h

@@ -99,7 +99,6 @@ private:
   typedef pmap<TextureProperties, PalettePage *> Pages;
   Pages _pages;
 
-
   // The TypedWritable interface follows.
 public:
   static void register_with_read_factory();

+ 40 - 0
pandatool/src/palettizer/paletteGroups.cxx

@@ -34,6 +34,27 @@ PaletteGroups::
 PaletteGroups() {
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: PaletteGroups::Copy Constructor
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+PaletteGroups::
+PaletteGroups(const PaletteGroups &copy) :
+  _groups(copy._groups)
+{
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PaletteGroups::operator =
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+void PaletteGroups::
+operator = (const PaletteGroups &copy) {
+  _groups = copy._groups;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: PaletteGroups::insert
 //       Access: Public
@@ -154,6 +175,25 @@ make_intersection(const PaletteGroups &a, const PaletteGroups &b) {
   _groups.swap(i);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: PaletteGroups::remove_null
+//       Access: Public
+//  Description: Removes the special "null" group from the set.  This
+//               is a special group that egg files may be assigned to,
+//               but which textures never are; it indicates that the
+//               egg file should not influence the palette assignment.
+////////////////////////////////////////////////////////////////////
+void PaletteGroups::
+remove_null() {
+  Groups::iterator gi;
+  for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
+    if ((*gi)->get_name() == "null") {
+      _groups.erase(gi);
+      return;
+    }
+  }
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: PaletteGroups::clear
 //       Access: Public

+ 3 - 0
pandatool/src/palettizer/paletteGroups.h

@@ -47,12 +47,15 @@ public:
   typedef Groups::difference_type difference_type;
 
   PaletteGroups();
+  PaletteGroups(const PaletteGroups &copy);
+  void operator =(const PaletteGroups &copy);
 
   void insert(PaletteGroup *group);
   size_type count(PaletteGroup *group) const;
   void make_complete(const PaletteGroups &a);
   void make_union(const PaletteGroups &a, const PaletteGroups &b);
   void make_intersection(const PaletteGroups &a, const PaletteGroups &b);
+  void remove_null();
   void clear();
 
   bool empty() const;

+ 2 - 0
pandatool/src/palettizer/palettizer.cxx

@@ -128,6 +128,8 @@ Palettizer() {
   _round_fuzz = 0.01;
   _remap_uv = RU_poly;
   _remap_char_uv = RU_poly;
+
+  get_palette_group("null");
 }
 
 ////////////////////////////////////////////////////////////////////

+ 14 - 3
pandatool/src/palettizer/textureImage.cxx

@@ -46,6 +46,8 @@ TextureImage() {
   _ever_read_image = false;
   _forced_grayscale = false;
   _alpha_bits = 0;
+  _mid_pixel_ratio = 0.0;
+  _is_cutout = false;
   _alpha_mode = EggRenderMode::AM_unspecified;
   _txa_wrap_u = EggTexture::WM_unspecified;
   _txa_wrap_v = EggTexture::WM_unspecified;
@@ -134,12 +136,17 @@ assign_groups() {
       total.make_union(total, (*ei)->get_complete_groups());
     }
 
+    // We don't count the "null" group for texture assignment.
+    total.remove_null();
+    if (total.empty()) {
+      break;
+    }
+
     // Now, find the group that will satisfy the most egg files.  If
     // two groups satisfy the same number of egg files, choose (a) the
     // most specific one, i.e. with the lowest dirname_level, or the
     // lowest dependency_level if the dirname_levels are equal, and
     // (b) the one that has the fewest egg files sharing it.
-    nassertv(!total.empty());
     PaletteGroups::iterator gi = total.begin();
     PaletteGroup *best = (*gi);
     int best_egg_count = compute_egg_count(best, needed_eggs);
@@ -892,7 +899,7 @@ write_source_pathnames(ostream &out, int indent_level) const {
 
   if (_is_cutout) {
     indent(out, indent_level)
-      << "Cutout image (ratio " << _mid_pixel_ratio << ")";
+      << "Cutout image (ratio " << (float)_mid_pixel_ratio << ")\n";
   }
 
   // Now write out the group assignments.
@@ -1196,7 +1203,11 @@ consider_alpha() {
       }
     }
 
-    _mid_pixel_ratio = (double)num_mid_pixels / (double)(source.get_x_size() * source.get_y_size());
+    int num_pixels = source.get_x_size() * source.get_y_size();
+    _mid_pixel_ratio = 0.0;
+    if (num_pixels != 0) {
+      _mid_pixel_ratio = (double)num_mid_pixels / (double)num_pixels;
+    }
   }
 
   _is_cutout = false;

+ 6 - 1
pandatool/src/palettizer/textureReference.cxx

@@ -417,7 +417,12 @@ update_egg() {
     return;
   }
 
-  nassertv(_placement != (TexturePlacement *)NULL);
+  if (_placement == (TexturePlacement *)NULL) {
+    // Nor if we don't have an actual placement yet.  This is possible
+    // if the egg was assigned to the "null" group, and the texture
+    // hasn't been re-assigned yet.
+    return;
+  }
 
   TextureImage *texture = get_texture();
   if (texture != (TextureImage *)NULL) {

+ 1 - 0
pandatool/src/palettizer/txaLine.cxx

@@ -510,6 +510,7 @@ match_texture(TextureImage *texture) const {
 
   texture->_explicitly_assigned_groups.make_union
     (texture->_explicitly_assigned_groups, _palette_groups);
+  texture->_explicitly_assigned_groups.remove_null();
 
   if (got_cont) {
     // If we have the "cont" keyword, we should keep scanning for