add Texture::ensure_loader_type() to fix problem with reloading video textures from the model-cache directory.

This commit is contained in:
David Rose 2013-09-24 19:19:02 +00:00
parent fccd9965ee
commit fee446f949
5 changed files with 64 additions and 0 deletions

View File

@ -2675,6 +2675,28 @@ adjust_size(int &x_size, int &y_size, const string &name,
return false;
}
////////////////////////////////////////////////////////////////////
// Function: Texture::ensure_loader_type
// Access: Public, Virtual
// Description: May be called prior to calling read_txo() or any
// bam-related Texture-creating callback, to ensure that
// the proper dynamic libraries for a Texture of the
// current class type, and the indicated filename, have
// been already loaded.
//
// This is a low-level function that should not normally
// need to be called directly by the user.
//
// Note that for best results you must first create a
// Texture object of the appropriate class type for your
// filename, for instance with
// TexturePool::make_texture().
////////////////////////////////////////////////////////////////////
void Texture::
ensure_loader_type(const Filename &filename) {
// For a plain Texture type, this doesn't need to do anything.
}
////////////////////////////////////////////////////////////////////
// Function: Texture::reconsider_dirty
// Access: Protected, Virtual

View File

@ -520,6 +520,8 @@ public:
INLINE bool adjust_this_size(int &x_size, int &y_size, const string &name,
bool for_padding) const;
virtual void ensure_loader_type(const Filename &filename);
protected:
class CData;

View File

@ -1090,6 +1090,17 @@ try_load_cache(PT(Texture) &tex, BamCache *cache, const Filename &filename,
// The texture was not supplied by a texture filter. See if it
// can be found in the on-disk cache, if it is active.
if ((cache->get_cache_textures() || cache->get_cache_compressed_textures()) && !textures_header_only) {
// Call ns_make_texture() on the file extension and create a
// dummy texture object we can call ensure_loaded_type() on. We
// don't need to keep this object around after this call, since
// we'll be creating a new one below. I know this is a bit
// hacky.
string ext = downcase(filename.get_extension());
PT(Texture) dummy = ns_make_texture(ext);
dummy->ensure_loader_type(filename);
dummy.clear();
record = cache->lookup(filename, "txo");
if (record != (BamCacheRecord *)NULL) {
if (record->has_data()) {

View File

@ -18,6 +18,7 @@
#include "movieVideo.h"
#include "movieVideoCursor.h"
#include "movieTypeRegistry.h"
#include "movieTexture.h"
#include "clockObject.h"
#include "config_gobj.h"
@ -125,6 +126,32 @@ MovieTexture::
clear();
}
////////////////////////////////////////////////////////////////////
// Function: MovieTexture::ensure_loader_type
// Access: Public, Virtual
// Description: May be called prior to calling read_txo() or any
// bam-related Texture-creating callback, to ensure that
// the proper dynamic libraries for a Texture of the
// current class type, and the indicated filename, have
// been already loaded.
//
// This is a low-level function that should not normally
// need to be called directly by the user.
//
// Note that for best results you must first create a
// Texture object of the appropriate class type for your
// filename, for instance with
// TexturePool::make_texture().
////////////////////////////////////////////////////////////////////
void MovieTexture::
ensure_loader_type(const Filename &filename) {
// Creating a MovieVideo of the appropriate type is a slightly hacky
// way to ensure the appropriate libraries are loaded. We can let
// the MovieVideo we create immediately destruct.
MovieTypeRegistry *reg = MovieTypeRegistry::get_global_ptr();
PT(MovieVideo) video = reg->make_video(filename);
}
////////////////////////////////////////////////////////////////////
// Function: MovieTexture::make_texture
// Access: Public, Static

View File

@ -64,6 +64,8 @@ PUBLISHED:
void unsynchronize();
public:
virtual void ensure_loader_type(const Filename &filename);
static PT(Texture) make_texture();
virtual bool has_cull_callback() const;
virtual bool cull_callback(CullTraverser *trav, const CullTraverserData &data) const;