Show a default warning texture for not found textures

c++11
scrawl 10 years ago
parent bb32c761df
commit c5fd92fde1

@ -6,11 +6,36 @@
#include <components/vfs/manager.hpp>
namespace
{
osg::ref_ptr<osg::Texture2D> createWarningTexture()
{
osg::ref_ptr<osg::Image> warningImage = new osg::Image;
int width=8, height=8;
unsigned char* bytes = (unsigned char*)calloc(width*height*3, sizeof(unsigned char));
for (int i=0;i<width*height;++i)
{
bytes[3*i] = (255);
bytes[3*i+1] = (0);
bytes[3*i+2] = (255);
}
warningImage->setImage(width, height, 1, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, bytes, osg::Image::USE_MALLOC_FREE);
osg::ref_ptr<osg::Texture2D> warningTexture = new osg::Texture2D;
warningTexture->setImage(warningImage);
return warningTexture;
}
}
namespace Resource
{
TextureManager::TextureManager(const VFS::Manager *vfs)
: mVFS(vfs)
, mWarningTexture(createWarningTexture())
{
}
@ -34,6 +59,17 @@ namespace Resource
}
else
{
Files::IStreamPtr stream;
try
{
stream = mVFS->get(normalized.c_str());
}
catch (std::exception& e)
{
std::cerr << "Failed to open texture: " << e.what() << std::endl;
return mWarningTexture;
}
osg::ref_ptr<osgDB::Options> opts (new osgDB::Options);
opts->setOptionString("dds_dxt1_detect_rgba"); // tx_creature_werewolf.dds isn't loading in the correct format without this option
size_t extPos = normalized.find_last_of('.');
@ -41,12 +77,11 @@ namespace Resource
if (extPos != std::string::npos && extPos+1 < normalized.size())
ext = normalized.substr(extPos+1);
osgDB::ReaderWriter* reader = osgDB::Registry::instance()->getReaderWriterForExtension(ext);
osgDB::ReaderWriter::ReadResult result = reader->readImage(*mVFS->get(normalized.c_str()), opts);
osgDB::ReaderWriter::ReadResult result = reader->readImage(*stream, opts);
if (!result.success())
{
// TODO: use "notfound" default texture
throw std::runtime_error("Error loading");
//std::cerr << "Error loading " << filename << ": " << result.message() << std::endl;
std::cerr << "Error loading " << filename << ": " << result.message() << std::endl;
return mWarningTexture;
}
osg::Image* image = result.getImage();

@ -41,6 +41,8 @@ namespace Resource
std::map<MapKey, osg::ref_ptr<osg::Texture2D> > mTextures;
osg::ref_ptr<osg::Texture2D> mWarningTexture;
};
}

Loading…
Cancel
Save