mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-01 18:15:32 +00:00
Readded baseonly parameter to Animation::setObjectRoot
Fixes the first person view.
This commit is contained in:
parent
6031db7882
commit
0fb97bd2e7
4 changed files with 48 additions and 6 deletions
|
@ -9,6 +9,7 @@
|
||||||
#include <osg/ComputeBoundsVisitor>
|
#include <osg/ComputeBoundsVisitor>
|
||||||
#include <osg/MatrixTransform>
|
#include <osg/MatrixTransform>
|
||||||
#include <osg/io_utils>
|
#include <osg/io_utils>
|
||||||
|
#include <osg/Geode>
|
||||||
|
|
||||||
#include <components/nifosg/nifloader.hpp>
|
#include <components/nifosg/nifloader.hpp>
|
||||||
|
|
||||||
|
@ -167,6 +168,38 @@ namespace
|
||||||
|
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Removes all drawables from a graph.
|
||||||
|
class RemoveDrawableVisitor : public osg::NodeVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RemoveDrawableVisitor()
|
||||||
|
: osg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void apply(osg::Geode &node)
|
||||||
|
{
|
||||||
|
// Not safe to remove in apply(), since the visitor is still iterating the child list
|
||||||
|
mToRemove.push_back(&node);
|
||||||
|
traverse(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove()
|
||||||
|
{
|
||||||
|
for (std::vector<osg::Node*>::iterator it = mToRemove.begin(); it != mToRemove.end(); ++it)
|
||||||
|
{
|
||||||
|
osg::Node* node = *it;
|
||||||
|
if (node->getNumParents())
|
||||||
|
node->getParent(0)->removeChild(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<osg::Node*> mToRemove;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
|
@ -836,7 +869,7 @@ namespace MWRender
|
||||||
return movement;
|
return movement;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Animation::setObjectRoot(const std::string &model, bool forceskeleton)
|
void Animation::setObjectRoot(const std::string &model, bool forceskeleton, bool baseonly)
|
||||||
{
|
{
|
||||||
if (mObjectRoot)
|
if (mObjectRoot)
|
||||||
{
|
{
|
||||||
|
@ -864,6 +897,13 @@ namespace MWRender
|
||||||
mObjectRoot = newObjectRoot;
|
mObjectRoot = newObjectRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (baseonly)
|
||||||
|
{
|
||||||
|
RemoveDrawableVisitor removeDrawableVisitor;
|
||||||
|
mObjectRoot->accept(removeDrawableVisitor);
|
||||||
|
removeDrawableVisitor.remove();
|
||||||
|
}
|
||||||
|
|
||||||
NodeMapVisitor visitor;
|
NodeMapVisitor visitor;
|
||||||
mObjectRoot->accept(visitor);
|
mObjectRoot->accept(visitor);
|
||||||
mNodeMap = visitor.getNodeMap();
|
mNodeMap = visitor.getNodeMap();
|
||||||
|
@ -1130,7 +1170,7 @@ namespace MWRender
|
||||||
{
|
{
|
||||||
if (!model.empty())
|
if (!model.empty())
|
||||||
{
|
{
|
||||||
setObjectRoot(model, false);
|
setObjectRoot(model, false, false);
|
||||||
|
|
||||||
if (!ptr.getClass().getEnchantment(ptr).empty())
|
if (!ptr.getClass().getEnchantment(ptr).empty())
|
||||||
addGlow(mObjectRoot, getEnchantmentColor(ptr));
|
addGlow(mObjectRoot, getEnchantmentColor(ptr));
|
||||||
|
|
|
@ -230,8 +230,10 @@ protected:
|
||||||
* Note that you must make sure all animation sources are cleared before reseting the object
|
* Note that you must make sure all animation sources are cleared before reseting the object
|
||||||
* root. All nodes previously retrieved with getNode will also become invalidated.
|
* root. All nodes previously retrieved with getNode will also become invalidated.
|
||||||
* @param forceskeleton Wrap the object root in a Skeleton, even if it contains no skinned parts. Use this if you intend to add skinned parts manually.
|
* @param forceskeleton Wrap the object root in a Skeleton, even if it contains no skinned parts. Use this if you intend to add skinned parts manually.
|
||||||
|
* @param baseonly If true, then any meshes or particle systems in the model are ignored
|
||||||
|
* (useful for NPCs, where only the skeleton is needed for the root, and the actual NPC parts are then assembled from separate files).
|
||||||
*/
|
*/
|
||||||
void setObjectRoot(const std::string &model, bool forceskeleton);
|
void setObjectRoot(const std::string &model, bool forceskeleton, bool baseonly);
|
||||||
|
|
||||||
/* Adds the keyframe controllers in the specified model as a new animation source. Note that
|
/* Adds the keyframe controllers in the specified model as a new animation source. Note that
|
||||||
* the filename portion of the provided model name will be prepended with 'x', and the .nif
|
* the filename portion of the provided model name will be prepended with 'x', and the .nif
|
||||||
|
|
|
@ -23,7 +23,7 @@ CreatureAnimation::CreatureAnimation(const MWWorld::Ptr &ptr,
|
||||||
|
|
||||||
if(!model.empty())
|
if(!model.empty())
|
||||||
{
|
{
|
||||||
setObjectRoot(model, false /* , baseonly = false */);
|
setObjectRoot(model, false, false);
|
||||||
//setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha);
|
//setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha);
|
||||||
|
|
||||||
if((ref->mBase->mFlags&ESM::Creature::Bipedal))
|
if((ref->mBase->mFlags&ESM::Creature::Bipedal))
|
||||||
|
@ -42,7 +42,7 @@ CreatureWeaponAnimation::CreatureWeaponAnimation(const MWWorld::Ptr &ptr, const
|
||||||
|
|
||||||
if(!model.empty())
|
if(!model.empty())
|
||||||
{
|
{
|
||||||
setObjectRoot(model, true /* , baseonly = false*/);
|
setObjectRoot(model, true, false);
|
||||||
//setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha);
|
//setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha);
|
||||||
|
|
||||||
if((ref->mBase->mFlags&ESM::Creature::Bipedal))
|
if((ref->mBase->mFlags&ESM::Creature::Bipedal))
|
||||||
|
|
|
@ -299,7 +299,7 @@ void NpcAnimation::updateNpcBase()
|
||||||
: "meshes\\wolf\\skin.1st.nif");
|
: "meshes\\wolf\\skin.1st.nif");
|
||||||
smodel = Misc::ResourceHelpers::correctActorModelPath(smodel, mResourceSystem->getVFS());
|
smodel = Misc::ResourceHelpers::correctActorModelPath(smodel, mResourceSystem->getVFS());
|
||||||
|
|
||||||
setObjectRoot(smodel, true /*, baseonly = true*/);
|
setObjectRoot(smodel, true, true);
|
||||||
|
|
||||||
if(mViewMode != VM_FirstPerson)
|
if(mViewMode != VM_FirstPerson)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue