void NIFSkeletonLoader::buildBones(Ogre::Skeleton *skel, const Nif::Node *node, Ogre::Bone *parent) { Ogre::Bone *bone; if(!skel->hasBone(node->name)) bone = skel->createBone(node->name); else bone = skel->createBone(); if(parent) parent->addChild(bone); mNifToOgreHandleMap[node->recIndex] = bone->getHandle(); bone->setOrientation(node->trafo.rotation); bone->setPosition(node->trafo.pos); bone->setScale(Ogre::Vector3(node->trafo.scale)); bone->setBindingPose(); if(!(node->recType == Nif::RC_NiNode || /* Nothing special; children traversed below */ node->recType == Nif::RC_RootCollisionNode || /* handled in nifbullet (hopefully) */ node->recType == Nif::RC_NiTriShape || /* Handled in the mesh loader */ node->recType == Nif::RC_NiBSAnimationNode || /* Handled in the object loader */ node->recType == Nif::RC_NiBillboardNode || /* Handled in the object loader */ node->recType == Nif::RC_NiBSParticleNode || node->recType == Nif::RC_NiCamera || node->recType == Nif::RC_NiAutoNormalParticles || node->recType == Nif::RC_NiRotatingParticles )) warn("Unhandled "+node->recName+" "+node->name+" in "+skel->getName()); Nif::ControllerPtr ctrl = node->controller; while(!ctrl.empty()) { if(!(ctrl->recType == Nif::RC_NiParticleSystemController || ctrl->recType == Nif::RC_NiVisController || ctrl->recType == Nif::RC_NiUVController || ctrl->recType == Nif::RC_NiKeyframeController || ctrl->recType == Nif::RC_NiGeomMorpherController )) warn("Unhandled "+ctrl->recName+" from node "+node->name+" in "+skel->getName()); ctrl = ctrl->next; } const Nif::NiNode *ninode = dynamic_cast<const Nif::NiNode*>(node); if(ninode) { const Nif::NodeList &children = ninode->children; for(size_t i = 0;i < children.length();i++) { if(!children[i].empty()) buildBones(skel, children[i].getPtr(), bone); } } }
void NIFSkeletonLoader::loadResource(Ogre::Resource *resource) { Ogre::Skeleton *skel = dynamic_cast<Ogre::Skeleton*>(resource); OgreAssert(skel, "Attempting to load a skeleton into a non-skeleton resource!"); Nif::NIFFile::ptr nif(Nif::NIFFile::create(skel->getName())); const Nif::Node *node = static_cast<const Nif::Node*>(nif->getRoot(0)); try { buildBones(skel, node); } catch(std::exception &e) { std::cerr<< "Exception while loading "<<skel->getName() <<std::endl; std::cerr<< e.what() <<std::endl; return; } }
Armature* BaseFactory::buildArmature(const std::string &armatureName, const std::string &skinName, const std::string &animationName, const std::string &dragonBonesName, const std::string &textureAtlasName) const { DragonBonesData *dragonBonesData = nullptr; ArmatureData *armatureData = nullptr; ArmatureData *animationArmatureData = nullptr; SkinData *skinData = nullptr; SkinData *skinDataCopy = nullptr; if (!dragonBonesName.empty()) { auto iterator = _dragonBonesDataMap.find(dragonBonesName); if (iterator != _dragonBonesDataMap.end()) { dragonBonesData = iterator->second; armatureData = dragonBonesData->getArmatureData(armatureName); _currentDragonBonesDataName = dragonBonesName; _currentTextureAtlasName = textureAtlasName.empty() ? _currentDragonBonesDataName : textureAtlasName; } } if (!armatureData) { AutoSearchType searchType = (dragonBonesName.empty() ? AutoSearchType::AST_ALL : (autoSearchDragonBonesData ? AutoSearchType::AST_AUTO : AutoSearchType::AST_NONE)); if (searchType != AutoSearchType::AST_NONE) { for (auto iterator = _dragonBonesDataMap.begin(); iterator != _dragonBonesDataMap.end(); ++iterator) { dragonBonesData = iterator->second; if (searchType == AutoSearchType::AST_ALL || dragonBonesData->autoSearch) { armatureData = dragonBonesData->getArmatureData(armatureName); if (armatureData) { _currentDragonBonesDataName = iterator->first; _currentTextureAtlasName = _currentDragonBonesDataName; break; } } } } } if (!armatureData) { return nullptr; } if (!animationName.empty() && animationName != armatureName) { animationArmatureData = dragonBonesData->getArmatureData(animationName); if (!animationArmatureData) { for (auto iterator = _dragonBonesDataMap.begin(); iterator != _dragonBonesDataMap.end(); ++iterator) { dragonBonesData = iterator->second; animationArmatureData = dragonBonesData->getArmatureData(animationName); if (animationArmatureData) { break; } } } if (animationArmatureData) { skinDataCopy = animationArmatureData->getSkinData(""); } } skinData = armatureData->getSkinData(skinName); Armature *armature = generateArmature(armatureData); armature->name = armatureName; if (animationArmatureData) { armature->getAnimation()->setAnimationDataList(animationArmatureData->animationDataList); } else { armature->getAnimation()->setAnimationDataList(armatureData->animationDataList); } // buildBones(armature, armatureData); // if (skinData) { buildSlots(armature, armatureData, skinData, skinDataCopy); } // update armature pose armature->getAnimation()->play(); armature->advanceTime(0); armature->getAnimation()->stop(); return armature; }