#include "animblendrulesmanager.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include "objectcache.hpp" #include "scenemanager.hpp" namespace Resource { using AnimBlendRules = SceneUtil::AnimBlendRules; AnimBlendRulesManager::AnimBlendRulesManager(const VFS::Manager* vfs, double expiryDelay) : ResourceManager(vfs, expiryDelay) { } osg::ref_ptr AnimBlendRulesManager::getRules( const VFS::Path::NormalizedView path, const VFS::Path::NormalizedView overridePath) { // Note: Providing a non-existing path but an existing overridePath is not supported! auto tmpl = loadRules(path); if (!tmpl) return nullptr; // Create an instance based on template and store template reference inside so the template will not be removed // from cache osg::ref_ptr blendRules(new AnimBlendRules(*tmpl, osg::CopyOp::SHALLOW_COPY)); SceneUtil::addTemplateRef(*blendRules, tmpl.get()); if (!overridePath.value().empty()) { auto blendRuleOverrides = loadRules(overridePath); if (blendRuleOverrides) { blendRules->addOverrideRules(*blendRuleOverrides); } SceneUtil::addTemplateRef(*blendRules, blendRuleOverrides.get()); } return blendRules; } osg::ref_ptr AnimBlendRulesManager::loadRules(VFS::Path::NormalizedView path) { if (std::optional> cached = mCache->getRefFromObjectCacheOrNone(path)) return *cached; osg::ref_ptr blendRules = AnimBlendRules::fromFile(mVFS, path); mCache->addEntryToObjectCache(path.value(), blendRules); return blendRules; } void AnimBlendRulesManager::reportStats(unsigned int frameNumber, osg::Stats* stats) const { Resource::reportStats("Blending Rules", frameNumber, mCache->getStats(), *stats); } }