The local shared_ptr is dead after the assignment, so moving it saves a refcount increment/decrement pair per animation source load. Flagged by Coverity as COPY_INSTEAD_OF_MOVE.
PhysicsSystem took the scene root only to build MWRender::DebugDrawer itself, which pulled osg and the renderer into mwphysics. World now builds the drawer and passes it in as a plain btIDebugDraw; the per-frame redraw goes through Bullet's own clearLines/debugDrawWorld/flushLines, and collision markers through drawContactPoint, so mwphysics no longer includes anything from mwrender and the drawer no longer needs the collision world. clearLines arrived in Bullet 2.87, so the system Bullet minimum moves from 2.86 to 2.87, and the dead Travis/AppVeyor 2.83 override goes with it.
MWBase::World::screenshot took an osg::Image for the caller to fill, and StateManager then encoded it to JPEG through osgDB itself. The encoding now happens in RenderingManager next to the capture, and World hands back the JPEG bytes, so MWBase::World loses its osg::Image parameter and mwstate no longer touches OSG.
In modern CMake, CMAKE_INSTALL_PREFIX during install time is interpreted like DESTDIR, so anything installed with --prefix must end up moved before it's run, and CMAKE_INSTALL_PREFIX at configure-time must match the real runtime prefix.
That means that my clever (in the derogatory sense) solution to parameterise the global openmw.cfg based on the install-time value of CMAKE_INSTALL_PREFIX didn't do anything useful, but it did have the potential to confuse packagers, and also broke Fedora packaging because that relies on the special-case prefix magic to stop things ending up in /usr/etc, and I'd bypassed that.
ActionManager held the osgViewer viewer and ScreenCaptureHandler only to trigger a capture on the screenshot key. The engine now passes a std::function that does the capture, so ActionManager has no OSG left and InputManager no longer needs ScreenCaptureHandler; the viewer still goes through to SDLUtil::InputWrapper.
SceneUtil::KeyframeHolder and SceneUtil::AnimBlendRules are pure data — a
map of keyframe controllers and a vector of blend rules. Nothing attaches
them to a scene graph; both classes existed as osg::Object only because
the cache stored them via osg::ref_ptr. With the value-type seam from the
previous MR in place, they can be plain classes cached as
std::shared_ptr<const T>, and the TemplateRef pins in AnimBlendRulesManager
become an aliasing shared_ptr that keeps the cached base and override rules
alive while merged rules are in use.