mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-30 21:32:42 +00:00
16410d0960
Otherwise terrain textures cache has zero hits because it stores not normalized paths. Due to implicit conversion it's possible to add entry with addEntryToObjectCache passing a string that is converted into normalized path. But then getRefFromObjectCache called with original value does not find this entry because it's not converted and overloaded operators are used instead.
66 lines
1.7 KiB
C++
66 lines
1.7 KiB
C++
#include "niffilemanager.hpp"
|
|
|
|
#include <iostream>
|
|
|
|
#include <osg/Object>
|
|
#include <osg/Stats>
|
|
|
|
#include <components/vfs/manager.hpp>
|
|
|
|
#include "objectcache.hpp"
|
|
|
|
namespace Resource
|
|
{
|
|
|
|
class NifFileHolder : public osg::Object
|
|
{
|
|
public:
|
|
NifFileHolder(const Nif::NIFFilePtr& file)
|
|
: mNifFile(file)
|
|
{
|
|
}
|
|
NifFileHolder(const NifFileHolder& copy, const osg::CopyOp& copyop)
|
|
: mNifFile(copy.mNifFile)
|
|
{
|
|
}
|
|
|
|
NifFileHolder() = default;
|
|
|
|
META_Object(Resource, NifFileHolder)
|
|
|
|
Nif::NIFFilePtr mNifFile;
|
|
};
|
|
|
|
NifFileManager::NifFileManager(const VFS::Manager* vfs, const ToUTF8::StatelessUtf8Encoder* encoder)
|
|
// NIF files aren't needed any more once the converted objects are cached in SceneManager / BulletShapeManager,
|
|
// so no point in using an expiry delay.
|
|
: ResourceManager(vfs, 0)
|
|
, mEncoder(encoder)
|
|
{
|
|
}
|
|
|
|
NifFileManager::~NifFileManager() = default;
|
|
|
|
Nif::NIFFilePtr NifFileManager::get(VFS::Path::NormalizedView name)
|
|
{
|
|
osg::ref_ptr<osg::Object> obj = mCache->getRefFromObjectCache(name);
|
|
if (obj)
|
|
return static_cast<NifFileHolder*>(obj.get())->mNifFile;
|
|
else
|
|
{
|
|
auto file = std::make_shared<Nif::NIFFile>(name.value());
|
|
Nif::Reader reader(*file, mEncoder);
|
|
reader.parse(mVFS->get(name));
|
|
obj = new NifFileHolder(file);
|
|
mCache->addEntryToObjectCache(name.value(), obj);
|
|
return file;
|
|
}
|
|
}
|
|
|
|
void NifFileManager::reportStats(unsigned int frameNumber, osg::Stats* stats) const
|
|
{
|
|
stats->setAttribute(frameNumber, "Nif", mCache->getCacheSize());
|
|
}
|
|
|
|
}
|