@@ -232,28 +232,47 @@ void SrcScene::printAllNodeNames( aiNode* anode, int alevel ) {
232232 }
233233}
234234
235+
235236// -------------------------------------------
236237void SrcScene::processNodes () {
237238 // lets load in the node hierarchy here //
238239 mSrcMeshes .clear ();
239240 mSrcMeshes .assign ( scene->mNumMeshes , shared_ptr<ofx::assimp::SrcMesh>() );
240241 processMeshes (scene->mRootNode , shared_ptr<SrcNode>());
242+
243+ std::unordered_map<std::string, aiBone*> boneMap;
244+ for (unsigned int i = 0 ; i < scene->mNumMeshes ; ++i){
245+ ofLogVerbose (" ofx::assimp::SrcScene" ) << " getAiBoneForAiNode(): loading mesh " << i;
246+ // current mesh we are introspecting
247+ aiMesh* mesh = scene->mMeshes [i];
248+ if ( mesh == nullptr ) {
249+ continue ;
250+ }
251+ for (unsigned int a = 0 ; a < mesh->mNumBones ; ++a) {
252+ aiBone* bone = mesh->mBones [a];
253+ if ( bone != nullptr ) {
254+ boneMap[std::string (bone->mName .C_Str ())] = bone;
255+ }
256+ }
257+ }
258+
259+
241260 for (unsigned int i = 0 ; i < scene->mRootNode ->mNumChildren ; i++ ){
242- processNodesRecursive (scene->mRootNode ->mChildren [i], shared_ptr<SrcNode>() );
261+ processNodesRecursive (scene->mRootNode ->mChildren [i], shared_ptr<SrcNode>(), boneMap );
243262 }
244263}
245264
246265// -------------------------------------------
247- void SrcScene::processNodesRecursive (aiNode* anode, std::shared_ptr<SrcNode> aParentNode) {
266+ void SrcScene::processNodesRecursive (aiNode* anode, std::shared_ptr<SrcNode> aParentNode, std::unordered_map<std::string, aiBone*>& aBoneMap ) {
248267 if ( !anode ) return ;
249268
250269 std::shared_ptr<SrcNode> sNode ;
251- if ( isBone (anode) || isArmature (anode) ) {
270+ if ( isBone (anode, aBoneMap ) || isArmature (anode, aBoneMap ) ) {
252271// if( aiBone* tAiBone = getAiBoneForAiNode(anode) ) {
253- aiBone* tAiBone = getAiBoneForAiNode (anode);
272+ aiBone* tAiBone = getAiBoneForAiNode (anode, aBoneMap );
254273 auto sBone = std::make_shared<ofx::assimp::SrcBone>();
255274 sBone ->setAiBone (tAiBone, anode);
256- sBone ->bRoot = isRootBone (anode) || !isBone (anode);
275+ sBone ->bRoot = isRootBone (anode, aBoneMap ) || !isBone (anode, aBoneMap );
257276// sBone->bRoot = isArmature(anode);
258277 if (tAiBone && tAiBone->mArmature ) {
259278// std::cout << "SrcScene :: processNodes: " << tAiBone->mArmature->mName.data << std::endl;
@@ -286,7 +305,7 @@ void SrcScene::processNodesRecursive(aiNode* anode, std::shared_ptr<SrcNode> aPa
286305 }
287306
288307 for (unsigned int i = 0 ; i < anode->mNumChildren ; i++ ){
289- processNodesRecursive (anode->mChildren [i], sNode );
308+ processNodesRecursive (anode->mChildren [i], sNode , aBoneMap );
290309 }
291310}
292311
@@ -318,44 +337,58 @@ void SrcScene::processMeshes(aiNode* anode, std::shared_ptr<SrcNode> aSrcNode) {
318337}
319338
320339// -------------------------------------------
321- bool SrcScene::isBone ( aiNode* aAiNode ) {
340+ bool SrcScene::isBone ( aiNode* aAiNode, const std::unordered_map<std::string, aiBone*>& aBoneMap ) {
341+ if ( aBoneMap.count (std::string (aAiNode->mName .C_Str ())) > 0 ) {
342+ return true ;
343+ }
344+ return false ;
345+
322346// if(isRootBone( aAiNode )) {
323347// return true;
324348// }
325- return (getAiBoneForAiNode (aAiNode) != nullptr );
349+ // return (getAiBoneForAiNode(aAiNode) != nullptr);
326350}
327351
328352// -------------------------------------------
329- bool SrcScene::isArmature ( aiNode* aAiNode ) {
330- for (unsigned int i = 0 ; i < scene->mNumMeshes ; ++i){
331- // current mesh we are introspecting
332- aiMesh* mesh = scene->mMeshes [i];
333- if ( mesh == nullptr ) {
334- continue ;
335- }
336- for (unsigned int a = 0 ; a < mesh->mNumBones ; ++a) {
337- aiBone* bone = mesh->mBones [a];
338- if ( bone != nullptr ) {
339- if ( aAiNode == bone->mArmature ) {
340- return true ;
341- }
353+ bool SrcScene::isArmature ( aiNode* aAiNode, const std::unordered_map<std::string, aiBone*>& aBoneMap ) {
354+ for ( const auto & iter : aBoneMap ) {
355+ if ( iter.second != nullptr ) {
356+ if ( iter.second ->mArmature == aAiNode ) {
357+ return true ;
342358 }
343359 }
344360 }
345361 return false ;
362+
363+ // for (unsigned int i = 0; i < scene->mNumMeshes; ++i){
364+ // // current mesh we are introspecting
365+ // aiMesh* mesh = scene->mMeshes[i];
366+ // if( mesh == nullptr ) {
367+ // continue;
368+ // }
369+ // for(unsigned int a = 0; a < mesh->mNumBones; ++a) {
370+ // aiBone* bone = mesh->mBones[a];
371+ // if( bone != nullptr ) {
372+ // if( aAiNode == bone->mArmature ) {
373+ // return true;
374+ // }
375+ // }
376+ // }
377+ // }
378+ // return false;
346379}
347380
348381// -------------------------------------------
349- bool SrcScene::isRootBone ( aiNode* aAiNode ) {
382+ bool SrcScene::isRootBone ( aiNode* aAiNode, std::unordered_map<std::string, aiBone*>& aBoneMap ) {
350383 // check if there are parent bones
351384 bool bHasBoneParent = false ;
352385 auto temp = aAiNode->mParent ;
353386 while ( temp ) {
354- if ( getAiBoneForAiNode (temp)) {
387+ if ( getAiBoneForAiNode (temp, aBoneMap )) {
355388 bHasBoneParent=true ;
356389 break ;
357390 }
358- if ( temp != scene->mRootNode && isArmature (temp)) {
391+ if ( temp != scene->mRootNode && isArmature (temp, aBoneMap )) {
359392 bHasBoneParent=true ;
360393 break ;
361394 }
@@ -368,46 +401,53 @@ bool SrcScene::isRootBone( aiNode* aAiNode ) {
368401}
369402
370403// -------------------------------------------
371- aiBone* SrcScene::getAiBoneForAiNode ( aiNode* aAiNode ) {
372- for (unsigned int i = 0 ; i < scene->mNumMeshes ; ++i){
373- ofLogVerbose (" ofx::assimp::SrcScene" ) << " loadGLResources(): loading mesh " << i;
374- // current mesh we are introspecting
375- aiMesh* mesh = scene->mMeshes [i];
376- if ( mesh == nullptr ) {
377- continue ;
378- }
379- for (unsigned int a = 0 ; a < mesh->mNumBones ; ++a) {
380- aiBone* bone = mesh->mBones [a];
381- if ( bone != nullptr ) {
382- if ( aAiNode->mName == bone->mName ) {
383- // if( bone->mNode == aAiNode) {
384- return bone;
385- }
386- }
387- }
404+ aiBone* SrcScene::getAiBoneForAiNode ( aiNode* aAiNode, std::unordered_map<std::string, aiBone*>& aBoneMap ) {
405+
406+ std::string bstr = std::string (aAiNode->mName .C_Str ());
407+ if ( aBoneMap.count (bstr) > 0 ) {
408+ return aBoneMap[bstr];
388409 }
389410 return nullptr ;
411+
412+ // for (unsigned int i = 0; i < scene->mNumMeshes; ++i){
413+ // ofLogVerbose("ofx::assimp::SrcScene") << "getAiBoneForAiNode(): loading mesh " << i;
414+ // // current mesh we are introspecting
415+ // aiMesh* mesh = scene->mMeshes[i];
416+ // if( mesh == nullptr ) {
417+ // continue;
418+ // }
419+ // for(unsigned int a = 0; a < mesh->mNumBones; ++a) {
420+ // aiBone* bone = mesh->mBones[a];
421+ // if( bone != nullptr ) {
422+ // if( aAiNode->mName == bone->mName ) {
423+ // // if( bone->mNode == aAiNode) {
424+ // return bone;
425+ // }
426+ // }
427+ // }
428+ // }
429+ // return nullptr;
390430}
391431
392432// -------------------------------------------
393- void SrcScene::recursiveAddSrcBones ( std::shared_ptr<ofx::assimp::SrcBone> abone ) {
394- for ( unsigned int i = 0 ; i < abone->getAiNode ()->mNumChildren ; i++ ) {
395- // aiNode, now we need to get the associated bone
396- auto boneNode = abone->getAiNode ()->mChildren [i];
397- if ( boneNode ) {
398- auto tbone = getAiBoneForAiNode ( boneNode );
399- if ( tbone ) {
400- auto nSrcBone = std::make_shared<ofx::assimp::SrcBone>();
401- nSrcBone->setAiBone (tbone, boneNode);
402- abone->childBones .push_back (nSrcBone);
403- }
404- }
405- }
406-
407- for ( auto iter : abone->childBones ) {
408- recursiveAddSrcBones (iter);
409- }
410- }
433+ // void SrcScene::recursiveAddSrcBones( std::shared_ptr<ofx::assimp::SrcBone> abone ) {
434+ // for( unsigned int i = 0; i < abone->getAiNode()->mNumChildren; i++ ) {
435+ // // aiNode, now we need to get the associated bone
436+ // auto boneNode = abone->getAiNode()->mChildren[i];
437+ // if( boneNode ) {
438+ // auto tbone = getAiBoneForAiNode( boneNode );
439+ // if( tbone ) {
440+ // auto nSrcBone = std::make_shared<ofx::assimp::SrcBone>();
441+ // nSrcBone->setAiBone(tbone, boneNode);
442+ // abone->childBones.push_back(nSrcBone);
443+ // }
444+ // }
445+ // }
446+ //
447+ // for( auto iter : abone->childBones ) {
448+ // recursiveAddSrcBones(iter);
449+ // }
450+ // }
411451
412452// -------------------------------------------
413453std::shared_ptr<ofx::assimp::SrcNode> SrcScene::getSrcNodeForAiNodeName ( const std::string& aAiNodeName ) {
0 commit comments