Move parent node attachment out of nifloader

This commit is contained in:
scrawl 2015-03-23 16:17:40 +01:00
parent ff9e2b03a0
commit 36ad40827b
4 changed files with 20 additions and 22 deletions

View file

@ -114,7 +114,7 @@ int main(int argc, char** argv)
osg::Group* newNode = new osg::Group; osg::Group* newNode = new osg::Group;
NifOsg::Loader loader; NifOsg::Loader loader;
loader.resourceManager = &resourceMgr; loader.resourceManager = &resourceMgr;
loader.loadAsSkeleton(nif, newNode); newNode->addChild(loader.loadAsSkeleton(nif));
osg::PositionAttitudeTransform* trans = new osg::PositionAttitudeTransform; osg::PositionAttitudeTransform* trans = new osg::PositionAttitudeTransform;
root->addChild(trans); root->addChild(trans);

View file

@ -60,7 +60,7 @@ void CSVRender::Object::update()
Nif::NIFFilePtr file(new Nif::NIFFile(mVFS->get(path), path)); Nif::NIFFilePtr file(new Nif::NIFFile(mVFS->get(path), path));
loader.loadAsSkeleton(file, mBaseNode); mBaseNode->addChild(loader.loadAsSkeleton(file));
//mObject->setVisibilityFlags (Element_Reference); //mObject->setVisibilityFlags (Element_Reference);

View file

@ -403,7 +403,7 @@ namespace NifOsg
rootNode->accept(visitor); rootNode->accept(visitor);
} }
osg::Node* load(Nif::NIFFilePtr nif, osg::Group *parentNode, TextKeyMap* textKeys) osg::ref_ptr<osg::Node> load(Nif::NIFFilePtr nif, TextKeyMap* textKeys)
{ {
if (nif->numRoots() < 1) if (nif->numRoots() < 1)
nif->fail("Found no root nodes"); nif->fail("Found no root nodes");
@ -414,11 +414,11 @@ namespace NifOsg
if (nifNode == NULL) if (nifNode == NULL)
nif->fail("First root was not a node, but a " + r->recName); nif->fail("First root was not a node, but a " + r->recName);
osg::Node* created = handleNode(nifNode, parentNode, false, std::map<int, int>(), 0, 0, false, textKeys); osg::Node* created = handleNode(nifNode, false, std::map<int, int>(), 0, 0, false, textKeys);
return created; return created;
} }
osg::Node* loadAsSkeleton(Nif::NIFFilePtr nif, osg::Group *parentNode, TextKeyMap* textKeys) osg::ref_ptr<osg::Node> loadAsSkeleton(Nif::NIFFilePtr nif, TextKeyMap* textKeys)
{ {
if (nif->numRoots() < 1) if (nif->numRoots() < 1)
nif->fail("Found no root nodes"); nif->fail("Found no root nodes");
@ -431,9 +431,7 @@ namespace NifOsg
nif->fail("First root was not a node, but a " + r->recName); nif->fail("First root was not a node, but a " + r->recName);
osg::ref_ptr<osgAnimation::Skeleton> skel = new osgAnimation::Skeleton; osg::ref_ptr<osgAnimation::Skeleton> skel = new osgAnimation::Skeleton;
parentNode->addChild(skel); skel->addChild(handleNode(nifNode, true, std::map<int, int>(), 0, 0, false, textKeys));
handleNode(nifNode, skel, true, std::map<int, int>(), 0, 0, false, textKeys);
return skel; return skel;
} }
@ -458,7 +456,7 @@ namespace NifOsg
} }
osg::Node* handleNode(const Nif::Node* nifNode, osg::Group* parentNode, bool createSkeleton, osg::ref_ptr<osg::Node> handleNode(const Nif::Node* nifNode, bool createSkeleton,
std::map<int, int> boundTextures, int animflags, int particleflags, bool skipMeshes, TextKeyMap* textKeys, osg::Node* rootNode=NULL) std::map<int, int> boundTextures, int animflags, int particleflags, bool skipMeshes, TextKeyMap* textKeys, osg::Node* rootNode=NULL)
{ {
osg::ref_ptr<osg::MatrixTransform> transformNode; osg::ref_ptr<osg::MatrixTransform> transformNode;
@ -484,9 +482,6 @@ namespace NifOsg
// Ignoring name for non-bone nodes for now. We might need it later in isolated cases, e.g. AttachLight. // Ignoring name for non-bone nodes for now. We might need it later in isolated cases, e.g. AttachLight.
// Insert bones at position 0 to prevent update order problems (see comment in osg Skeleton.cpp)
parentNode->insertChild(0, transformNode);
// UserData used for a variety of features: // UserData used for a variety of features:
// - finding the correct emitter node for a particle system // - finding the correct emitter node for a particle system
// - establishing connections to the animated collision shapes, which are handled in a separate loader // - establishing connections to the animated collision shapes, which are handled in a separate loader
@ -567,7 +562,11 @@ namespace NifOsg
for(size_t i = 0;i < children.length();++i) for(size_t i = 0;i < children.length();++i)
{ {
if(!children[i].empty()) if(!children[i].empty())
handleNode(children[i].getPtr(), transformNode, createSkeleton, boundTextures, animflags, particleflags, skipMeshes, textKeys, rootNode); {
// Insert bones at position 0 to prevent update order problems (see comment in osg Skeleton.cpp)
transformNode->insertChild(0,
handleNode(children[i].getPtr(), createSkeleton, boundTextures, animflags, particleflags, skipMeshes, textKeys, rootNode));
}
} }
} }
@ -1328,16 +1327,16 @@ namespace NifOsg
}; };
osg::Node* Loader::load(Nif::NIFFilePtr file, osg::Group *parentNode, TextKeyMap *textKeys) osg::ref_ptr<osg::Node> Loader::load(Nif::NIFFilePtr file, TextKeyMap *textKeys)
{ {
LoaderImpl loader(resourceManager, sShowMarkers); LoaderImpl loader(resourceManager, sShowMarkers);
return loader.load(file, parentNode, textKeys); return loader.load(file, textKeys);
} }
osg::Node* Loader::loadAsSkeleton(Nif::NIFFilePtr file, osg::Group *parentNode, TextKeyMap *textKeys) osg::ref_ptr<osg::Node> Loader::loadAsSkeleton(Nif::NIFFilePtr file, TextKeyMap *textKeys)
{ {
LoaderImpl loader(resourceManager, sShowMarkers); LoaderImpl loader(resourceManager, sShowMarkers);
return loader.loadAsSkeleton(file, parentNode, textKeys); return loader.loadAsSkeleton(file, textKeys);
} }
void Loader::loadKf(Nif::NIFFilePtr kf, osg::Node *rootNode, int sourceIndex, TextKeyMap &textKeys) void Loader::loadKf(Nif::NIFFilePtr kf, osg::Node *rootNode, int sourceIndex, TextKeyMap &textKeys)

View file

@ -7,16 +7,15 @@
#include <components/vfs/manager.hpp> #include <components/vfs/manager.hpp>
#include <osg/ref_ptr>
namespace osg namespace osg
{ {
class Group;
class Node; class Node;
} }
namespace NifOsg namespace NifOsg
{ {
class Controller;
typedef std::multimap<float,std::string> TextKeyMap; typedef std::multimap<float,std::string> TextKeyMap;
/// The main class responsible for loading NIF files into an OSG-Scenegraph. /// The main class responsible for loading NIF files into an OSG-Scenegraph.
@ -27,10 +26,10 @@ namespace NifOsg
// though, when assembling from several files, i.e. equipment parts // though, when assembling from several files, i.e. equipment parts
/// Create a scene graph for the given NIF. Assumes no skinning is used. /// Create a scene graph for the given NIF. Assumes no skinning is used.
/// @param node The parent of the new root node for the created scene graph. /// @param node The parent of the new root node for the created scene graph.
osg::Node* load(Nif::NIFFilePtr file, osg::Group* parentNode, TextKeyMap* textKeys = NULL); osg::ref_ptr<osg::Node> load(Nif::NIFFilePtr file, TextKeyMap* textKeys = NULL);
/// Create a scene graph for the given NIF. Assumes skinning will be used. /// Create a scene graph for the given NIF. Assumes skinning will be used.
osg::Node* loadAsSkeleton(Nif::NIFFilePtr file, osg::Group* parentNode, TextKeyMap* textKeys = NULL); osg::ref_ptr<osg::Node> loadAsSkeleton(Nif::NIFFilePtr file, TextKeyMap* textKeys = NULL);
/// Load keyframe controllers from the given kf file onto the given scene graph. /// Load keyframe controllers from the given kf file onto the given scene graph.
/// @param sourceIndex The source index for this animation source, used for identifying /// @param sourceIndex The source index for this animation source, used for identifying