Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
2.5 kB · 74 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include "animblendrulesmanager.hpp"
#include <array>
#include <components/vfs/manager.hpp>
#include <osg/Stats>#include <osgAnimation/Animation>#include <osgAnimation/BasicAnimationManager>#include <osgAnimation/Channel>
#include <components/debug/debuglog.hpp>#include <components/misc/pathhelpers.hpp>
#include <components/sceneutil/osgacontroller.hpp>#include <components/sceneutil/templateref.hpp>#include <components/vfs/pathutil.hpp>
#include <components/resource/scenemanager.hpp>
#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<const AnimBlendRules> 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<SceneUtil::AnimBlendRules> 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<const AnimBlendRules> AnimBlendRulesManager::loadRules(VFS::Path::NormalizedView path) { if (std::optional<osg::ref_ptr<const AnimBlendRules>> cached = mCache->getRefFromObjectCacheOrNone(path)) return *cached;
osg::ref_ptr<AnimBlendRules> 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); }
}