mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 03:40:14 +00:00
Create the skeleton resource from NIFs
Note they are not loaded yet.
This commit is contained in:
parent
6a447c88fb
commit
300730a834
@ -128,6 +128,60 @@ public:
|
||||
};
|
||||
|
||||
|
||||
struct NIFSkeletonLoader : public Ogre::ManualResourceLoader {
|
||||
|
||||
static void warn(const std::string &msg)
|
||||
{
|
||||
std::cerr << "NIFSkeletonLoader: Warn: " << msg << std::endl;
|
||||
}
|
||||
|
||||
static void fail(const std::string &msg)
|
||||
{
|
||||
std::cerr << "NIFSkeletonLoader: Fail: "<< msg << std::endl;
|
||||
abort();
|
||||
}
|
||||
|
||||
void loadResource(Ogre::Resource *resource)
|
||||
{
|
||||
warn("Found no records in NIF for "+resource->getName());
|
||||
}
|
||||
|
||||
static bool createSkeleton(const std::string &name, const std::string &group, Nif::Node *node, Ogre::SkeletonPtr *skel)
|
||||
{
|
||||
if(node->boneTrafo != NULL)
|
||||
{
|
||||
Ogre::SkeletonManager &skelMgr = Ogre::SkeletonManager::getSingleton();
|
||||
|
||||
Ogre::SkeletonPtr tmp = skelMgr.getByName(name);
|
||||
if(tmp.isNull())
|
||||
{
|
||||
static NIFSkeletonLoader loader;
|
||||
tmp = skelMgr.create(name, group, true, &loader);
|
||||
}
|
||||
|
||||
if(skel) *skel = tmp;
|
||||
return true;
|
||||
}
|
||||
|
||||
Nif::NiNode *ninode = dynamic_cast<Nif::NiNode*>(node);
|
||||
if(ninode)
|
||||
{
|
||||
Nif::NodeList &children = ninode->children;
|
||||
for(size_t i = 0;i < children.length();i++)
|
||||
{
|
||||
if(!children[i].empty())
|
||||
{
|
||||
if(createSkeleton(name, group, children[i].getPtr(), skel))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
NIFLoader::LoaderMap NIFLoader::sLoaders;
|
||||
|
||||
void NIFLoader::warn(const std::string &msg)
|
||||
@ -325,7 +379,8 @@ void NIFLoader::loadResource(Ogre::Resource *resource)
|
||||
warn("Found no records in NIF for "+resource->getName());
|
||||
}
|
||||
|
||||
void NIFLoader::createMeshes(const std::string &name, const std::string &group, Nif::Node *node, MeshPairList &meshes, int flags)
|
||||
|
||||
void NIFLoader::createMeshes(const std::string &name, const std::string &group, bool hasSkel, Nif::Node *node, MeshPairList &meshes, int flags)
|
||||
{
|
||||
flags |= node->flags;
|
||||
|
||||
@ -342,6 +397,7 @@ void NIFLoader::createMeshes(const std::string &name, const std::string &group,
|
||||
NIFLoader *loader = &sLoaders[fullname];
|
||||
loader->mName = name;
|
||||
loader->mShapeName = node->name;
|
||||
loader->mHasSkel = hasSkel;
|
||||
|
||||
mesh = meshMgr.createManual(fullname, group, loader);
|
||||
}
|
||||
@ -359,11 +415,12 @@ void NIFLoader::createMeshes(const std::string &name, const std::string &group,
|
||||
for(size_t i = 0;i < children.length();i++)
|
||||
{
|
||||
if(!children[i].empty())
|
||||
createMeshes(name, group, children[i].getPtr(), meshes, flags);
|
||||
createMeshes(name, group, hasSkel, children[i].getPtr(), meshes, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MeshPairList NIFLoader::load(const std::string &name, Ogre::SkeletonPtr *skel, const std::string &group)
|
||||
{
|
||||
MeshPairList meshes;
|
||||
@ -390,7 +447,8 @@ MeshPairList NIFLoader::load(const std::string &name, Ogre::SkeletonPtr *skel, c
|
||||
return meshes;
|
||||
}
|
||||
|
||||
createMeshes(name, group, node, meshes);
|
||||
bool hasSkel = NIFSkeletonLoader::createSkeleton(name, group, node, skel);
|
||||
createMeshes(name, group, hasSkel, node, meshes);
|
||||
|
||||
return meshes;
|
||||
}
|
||||
|
@ -98,11 +98,13 @@ public:
|
||||
private:
|
||||
std::string mName;
|
||||
std::string mShapeName;
|
||||
bool mHasSkel;
|
||||
|
||||
static void warn(const std::string &msg);
|
||||
static void fail(const std::string &msg);
|
||||
|
||||
static void createMeshes(const std::string &name, const std::string &group, Nif::Node *node, MeshPairList &meshes, int flags=0);
|
||||
static void createMeshes(const std::string &name, const std::string &group, bool hasSkel,
|
||||
Nif::Node *node, MeshPairList &meshes, int flags=0);
|
||||
|
||||
typedef std::map<std::string,NIFLoader,ciLessBoost> LoaderMap;
|
||||
static LoaderMap sLoaders;
|
||||
|
Loading…
x
Reference in New Issue
Block a user