Przeglądaj źródła

more fixes to texture reloading

David Rose 19 lat temu
rodzic
commit
c08358b05d
3 zmienionych plików z 113 dodań i 74 usunięć
  1. 56 0
      panda/src/gobj/texture.I
  2. 50 71
      panda/src/gobj/texture.cxx
  3. 7 3
      panda/src/gobj/texture.h

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

@@ -133,6 +133,7 @@ setup_cube_map(int size, ComponentType component_type,
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE bool Texture::
 INLINE bool Texture::
 read(const Filename &fullpath) {
 read(const Filename &fullpath) {
+  ++_modified;
   return do_read(fullpath, Filename(), 0, 0, 0, 0, false, false);
   return do_read(fullpath, Filename(), 0, 0, 0, 0, false, false);
 }
 }
 
 
@@ -150,6 +151,7 @@ read(const Filename &fullpath) {
 INLINE bool Texture::
 INLINE bool Texture::
 read(const Filename &fullpath, const Filename &alpha_fullpath,
 read(const Filename &fullpath, const Filename &alpha_fullpath,
      int primary_file_num_channels, int alpha_file_channel) {
      int primary_file_num_channels, int alpha_file_channel) {
+  ++_modified;
   return do_read(fullpath, alpha_fullpath, primary_file_num_channels,
   return do_read(fullpath, alpha_fullpath, primary_file_num_channels,
 		 alpha_file_channel, 0, 0, false, false);
 		 alpha_file_channel, 0, 0, false, false);
 }
 }
@@ -167,6 +169,7 @@ read(const Filename &fullpath, const Filename &alpha_fullpath,
 INLINE bool Texture::
 INLINE bool Texture::
 read(const Filename &fullpath, int z, int n, 
 read(const Filename &fullpath, int z, int n, 
      bool read_pages, bool read_mipmaps) {
      bool read_pages, bool read_mipmaps) {
+  ++_modified;
   return do_read(fullpath, Filename(), 0, 0, z, n, read_pages, read_mipmaps);
   return do_read(fullpath, Filename(), 0, 0, z, n, read_pages, read_mipmaps);
 }
 }
 
 
@@ -243,6 +246,7 @@ INLINE bool Texture::
 read(const Filename &fullpath, const Filename &alpha_fullpath,
 read(const Filename &fullpath, const Filename &alpha_fullpath,
      int primary_file_num_channels, int alpha_file_channel,
      int primary_file_num_channels, int alpha_file_channel,
      int z, int n, bool read_pages, bool read_mipmaps) {
      int z, int n, bool read_pages, bool read_mipmaps) {
+  ++_modified;
   return do_read(fullpath, alpha_fullpath, primary_file_num_channels,
   return do_read(fullpath, alpha_fullpath, primary_file_num_channels,
 		 alpha_file_channel, z, n, read_pages, read_mipmaps);
 		 alpha_file_channel, z, n, read_pages, read_mipmaps);
 }
 }
@@ -324,6 +328,7 @@ write(const Filename &fullpath, int z, int n,
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE bool Texture::
 INLINE bool Texture::
 load(const PNMImage &pnmimage) {
 load(const PNMImage &pnmimage) {
+  ++_modified;
   return do_load_one(pnmimage, 0, 0);
   return do_load_one(pnmimage, 0, 0);
 }
 }
 
 
@@ -335,6 +340,7 @@ load(const PNMImage &pnmimage) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE bool Texture::
 INLINE bool Texture::
 load(const PNMImage &pnmimage, int z, int n) {
 load(const PNMImage &pnmimage, int z, int n) {
+  ++_modified;
   return do_load_one(pnmimage, z, n);
   return do_load_one(pnmimage, z, n);
 }
 }
 
 
@@ -763,6 +769,39 @@ get_ram_image_compression() const {
   return _ram_image_compression;
   return _ram_image_compression;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::modify_ram_image
+//       Access: Published
+//  Description: Returns a modifiable pointer to the system-RAM image.
+//               This assumes the RAM image should be uncompressed.
+//               If the RAM image has been dumped, or is stored
+//               compressed, creates a new one.
+//
+//               This does *not* affect keep_ram_image.
+////////////////////////////////////////////////////////////////////
+INLINE PTA_uchar Texture::
+modify_ram_image() {
+  do_modify_ram_image();
+  ++_modified;
+  return _ram_images[0]._image;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::make_ram_image
+//       Access: Published
+//  Description: Discards the current system-RAM image for the
+//               texture, if any, and allocates a new buffer of the
+//               appropriate size.  Returns the new buffer.
+//
+//               This does *not* affect keep_ram_image.
+////////////////////////////////////////////////////////////////////
+INLINE PTA_uchar Texture::
+make_ram_image() {
+  ++_modified;
+  do_make_ram_image();
+  return _ram_images[0]._image;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::set_keep_ram_image
 //     Function: Texture::set_keep_ram_image
 //       Access: Published
 //       Access: Published
@@ -876,6 +915,23 @@ get_expected_ram_mipmap_page_size(int n) const {
   return (size_t)(get_expected_mipmap_x_size(n) * get_expected_mipmap_y_size(n) * _num_components * _component_width);
   return (size_t)(get_expected_mipmap_x_size(n) * get_expected_mipmap_y_size(n) * _num_components * _component_width);
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::modify_ram_mipmap_image
+//       Access: Published
+//  Description: Returns a modifiable pointer to the system-RAM image
+//               for the nth mipmap level.  This assumes the RAM image
+//               is uncompressed; if this is not the case, raises an
+//               assertion.
+//
+//               This does *not* affect keep_ram_image.
+////////////////////////////////////////////////////////////////////
+INLINE PTA_uchar Texture::
+modify_ram_mipmap_image(int n) {
+  do_modify_ram_mipmap_image(n);
+  ++_modified;
+  return _ram_images[n]._image;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::get_modified
 //     Function: Texture::get_modified
 //       Access: Published
 //       Access: Published

+ 50 - 71
panda/src/gobj/texture.cxx

@@ -866,49 +866,6 @@ get_ram_image() {
   return _ram_images[0]._image;
   return _ram_images[0]._image;
 }
 }
 
 
-////////////////////////////////////////////////////////////////////
-//     Function: Texture::modify_ram_image
-//       Access: Published
-//  Description: Returns a modifiable pointer to the system-RAM image.
-//               This assumes the RAM image should be uncompressed.
-//               If the RAM image has been dumped, or is stored
-//               compressed, creates a new one.
-//
-//               This does *not* affect keep_ram_image.
-////////////////////////////////////////////////////////////////////
-PTA_uchar Texture::
-modify_ram_image() {
-  if (_ram_images.empty() || _ram_images[0]._image.empty() || 
-      _ram_image_compression != CM_off) {
-    make_ram_image();
-  } else {
-    clear_ram_mipmap_images();
-  }
-
-  ++_modified;
-  return _ram_images[0]._image;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Texture::make_ram_image
-//       Access: Published
-//  Description: Discards the current system-RAM image for the
-//               texture, if any, and allocates a new buffer of the
-//               appropriate size.  Returns the new buffer.
-//
-//               This does *not* affect keep_ram_image.
-////////////////////////////////////////////////////////////////////
-PTA_uchar Texture::
-make_ram_image() {
-  _ram_images.clear();
-  _ram_images.push_back(RamImage());
-  _ram_images[0]._page_size = get_expected_ram_page_size();
-  _ram_images[0]._image = PTA_uchar::empty_array(get_expected_ram_image_size());
-  _ram_image_compression = CM_off;
-  ++_modified;
-  return _ram_images[0]._image;
-}
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::set_ram_image
 //     Function: Texture::set_ram_image
 //       Access: Published
 //       Access: Published
@@ -1016,29 +973,6 @@ get_ram_mipmap_image(int n) {
   return CPTA_uchar();
   return CPTA_uchar();
 }
 }
 
 
-////////////////////////////////////////////////////////////////////
-//     Function: Texture::modify_ram_mipmap_image
-//       Access: Published
-//  Description: Returns a modifiable pointer to the system-RAM image
-//               for the nth mipmap level.  This assumes the RAM image
-//               is uncompressed; if this is not the case, raises an
-//               assertion.
-//
-//               This does *not* affect keep_ram_image.
-////////////////////////////////////////////////////////////////////
-PTA_uchar Texture::
-modify_ram_mipmap_image(int n) {
-  nassertr(_ram_image_compression == CM_off, PTA_uchar());
-
-  if (n >= (int)_ram_images.size() ||
-      _ram_images[n]._image.empty()) {
-    make_ram_mipmap_image(n);
-  }
-
-  ++_modified;
-  return _ram_images[n]._image;
-}
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::make_ram_mipmap_image
 //     Function: Texture::make_ram_mipmap_image
 //       Access: Published
 //       Access: Published
@@ -2150,11 +2084,11 @@ do_load_one(const PNMImage &pnmimage, int z, int n) {
       return false;
       return false;
     }
     }
 
 
-    modify_ram_image();
+    do_modify_ram_image();
     _loaded_from_image = true;
     _loaded_from_image = true;
   }
   }
 
 
-  modify_ram_mipmap_image(n);
+  do_modify_ram_mipmap_image(n);
 
 
   // Ensure the PNMImage is an appropriate size.
   // Ensure the PNMImage is an appropriate size.
   int x_size = get_expected_mipmap_x_size(n);
   int x_size = get_expected_mipmap_x_size(n);
@@ -2182,8 +2116,6 @@ do_load_one(const PNMImage &pnmimage, int z, int n) {
                           pnmimage);
                           pnmimage);
   }
   }
 
 
-  ++_modified;
-
   return true;
   return true;
 }
 }
 
 
@@ -2228,7 +2160,7 @@ void Texture::
 reload_ram_image() {
 reload_ram_image() {
   gobj_cat.info()
   gobj_cat.info()
     << "Reloading texture " << get_name() << "\n";
     << "Reloading texture " << get_name() << "\n";
-  make_ram_image();
+  do_make_ram_image();
 
 
   int z = 0;
   int z = 0;
   int n = 0;
   int n = 0;
@@ -2245,6 +2177,53 @@ reload_ram_image() {
 	  z, n, _has_read_pages, _has_read_mipmaps);
 	  z, n, _has_read_pages, _has_read_mipmaps);
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::do_modify_ram_image
+//       Access: Protected
+//  Description: This is called internally to uniquify the ram image
+//               pointer without updating _modified.
+////////////////////////////////////////////////////////////////////
+void Texture::
+do_modify_ram_image() {
+  if (_ram_images.empty() || _ram_images[0]._image.empty() || 
+      _ram_image_compression != CM_off) {
+    do_make_ram_image();
+  } else {
+    clear_ram_mipmap_images();
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::do_make_ram_image
+//       Access: Protected
+//  Description: This is called internally to make a new ram image
+//               without updating _modified.
+////////////////////////////////////////////////////////////////////
+void Texture::
+do_make_ram_image() {
+  _ram_images.clear();
+  _ram_images.push_back(RamImage());
+  _ram_images[0]._page_size = get_expected_ram_page_size();
+  _ram_images[0]._image = PTA_uchar::empty_array(get_expected_ram_image_size());
+  _ram_image_compression = CM_off;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Texture::do_modify_ram_mipmap_image
+//       Access: Protected
+//  Description: This is called internally to uniquify the nth mipmap
+//               image pointer without updating _modified.
+////////////////////////////////////////////////////////////////////
+void Texture::
+do_modify_ram_mipmap_image(int n) {
+  nassertv(_ram_image_compression == CM_off);
+
+  if (n >= (int)_ram_images.size() ||
+      _ram_images[n]._image.empty()) {
+    make_ram_mipmap_image(n);
+  }
+}
+
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Texture::up_to_power_2
 //     Function: Texture::up_to_power_2

+ 7 - 3
panda/src/gobj/texture.h

@@ -276,8 +276,8 @@ PUBLISHED:
   INLINE size_t get_expected_ram_page_size() const;
   INLINE size_t get_expected_ram_page_size() const;
   CPTA_uchar get_ram_image();
   CPTA_uchar get_ram_image();
   INLINE CompressionMode get_ram_image_compression() const;
   INLINE CompressionMode get_ram_image_compression() const;
-  PTA_uchar modify_ram_image();
-  PTA_uchar make_ram_image();
+  INLINE PTA_uchar modify_ram_image();
+  INLINE PTA_uchar make_ram_image();
   void set_ram_image(PTA_uchar image, CompressionMode compression = CM_off,
   void set_ram_image(PTA_uchar image, CompressionMode compression = CM_off,
 		     size_t page_size = 0);
 		     size_t page_size = 0);
   void clear_ram_image();
   void clear_ram_image();
@@ -292,7 +292,7 @@ PUBLISHED:
   INLINE size_t get_expected_ram_mipmap_image_size(int n) const;
   INLINE size_t get_expected_ram_mipmap_image_size(int n) const;
   INLINE size_t get_expected_ram_mipmap_page_size(int n) const;
   INLINE size_t get_expected_ram_mipmap_page_size(int n) const;
   CPTA_uchar get_ram_mipmap_image(int n);
   CPTA_uchar get_ram_mipmap_image(int n);
-  PTA_uchar modify_ram_mipmap_image(int n);
+  INLINE PTA_uchar modify_ram_mipmap_image(int n);
   PTA_uchar make_ram_mipmap_image(int n);
   PTA_uchar make_ram_mipmap_image(int n);
   void set_ram_mipmap_image(int n, PTA_uchar image, size_t page_size = 0);
   void set_ram_mipmap_image(int n, PTA_uchar image, size_t page_size = 0);
   void clear_ram_mipmap_image(int n);
   void clear_ram_mipmap_image(int n);
@@ -375,6 +375,10 @@ protected:
   virtual void reconsider_dirty();
   virtual void reconsider_dirty();
   virtual void reload_ram_image();
   virtual void reload_ram_image();
 
 
+  void do_modify_ram_image();
+  void do_make_ram_image();
+  void do_modify_ram_mipmap_image(int n);
+
   bool reconsider_z_size(int z);
   bool reconsider_z_size(int z);
   bool reconsider_image_properties(int x_size, int y_size, int num_components,
   bool reconsider_image_properties(int x_size, int y_size, int num_components,
            ComponentType component_type, int z);
            ComponentType component_type, int z);