Browse Source

automatically reload texture when changing compression mode

David Rose 16 years ago
parent
commit
3f42a08968
3 changed files with 43 additions and 29 deletions
  1. 16 0
      panda/src/gobj/texture.I
  2. 25 28
      panda/src/gobj/texture.cxx
  3. 2 1
      panda/src/gobj/texture.h

+ 16 - 0
panda/src/gobj/texture.I

@@ -306,6 +306,22 @@ store(PNMImage &pnmimage, int z, int n) const {
   return do_store_one(pnmimage, z, n);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::reload
+//       Access: Published
+//  Description: Re-reads the Texture from its disk file.  Useful when
+//               you know the image on disk has recently changed, and
+//               you want to update the Texture image.
+//
+//               Returns true on success, false on failure (in which
+//               case, the Texture may or may not still be valid).
+////////////////////////////////////////////////////////////////////
+bool Texture::
+reload() {
+  MutexHolder holder(_lock);
+  return do_reload();
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::has_filename
 //       Access: Published

+ 25 - 28
panda/src/gobj/texture.cxx

@@ -720,34 +720,6 @@ read_dds(istream &in, const string &filename, bool header_only) {
   return do_read_dds(in, filename, header_only);
 }
 
-////////////////////////////////////////////////////////////////////
-//     Function: Texture::reload
-//       Access: Published
-//  Description: Re-reads the Texture from its disk file.  Useful when
-//               you know the image on disk has recently changed, and
-//               you want to update the Texture image.
-//
-//               Returns true on success, false on failure (in which
-//               case, the Texture may or may not still be valid).
-////////////////////////////////////////////////////////////////////
-bool Texture::
-reload() {
-  MutexHolder holder(_lock);
-  if (_loaded_from_image && !_fullpath.empty()) {
-    do_clear_ram_image();
-    do_unlock_and_reload_ram_image(true);
-    if (do_has_ram_image()) {
-      // An explicit call to reload() should increment image_modified.
-      ++_image_modified;
-      return true;
-    }
-    return false;
-  }
-
-  // We don't have a filename to load from.
-  return false;
-}
-
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::load_related
 //       Access: Published
@@ -4034,6 +4006,9 @@ do_set_compression(Texture::CompressionMode compression) {
   if (_compression != compression) {
     ++_properties_modified;
     _compression = compression;
+    if (do_has_ram_image()) {
+      do_reload();
+    }
   }
 }
 
@@ -4550,6 +4525,28 @@ do_set_pad_size(int x, int y, int z) {
   _pad_z_size = z;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::do_reload
+//       Access: Protected
+//  Description: 
+////////////////////////////////////////////////////////////////////
+bool Texture::
+do_reload() {
+  if (_loaded_from_image && !_fullpath.empty()) {
+    do_clear_ram_image();
+    do_unlock_and_reload_ram_image(true);
+    if (do_has_ram_image()) {
+      // An explicit call to reload() should increment image_modified.
+      ++_image_modified;
+      return true;
+    }
+    return false;
+  }
+
+  // We don't have a filename to load from.
+  return false;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::convert_from_pnmimage
 //       Access: Private, Static

+ 2 - 1
panda/src/gobj/texture.h

@@ -247,7 +247,7 @@ PUBLISHED:
   INLINE bool store(PNMImage &pnmimage) const;
   INLINE bool store(PNMImage &pnmimage, int z, int n) const;
 
-  bool reload();
+  INLINE bool reload();
   Texture *load_related(const InternalName *suffix) const;
 
   INLINE bool has_filename() const;
@@ -551,6 +551,7 @@ protected:
   void do_clear_ram_mipmap_images();
   void do_generate_ram_mipmap_images();
   void do_set_pad_size(int x, int y, int z);
+  bool do_reload();
 
   // This nested class declaration is used below.
   class RamImage {