forked from teamnwah/openmw-tes3coop
Move parent node attachment out of nifloader
This commit is contained in:
parent
ff9e2b03a0
commit
36ad40827b
4 changed files with 20 additions and 22 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue