Skip to content

Commit 039b1a8

Browse files
authored
create a map of the bones instead of searching for all the meshes every query of isBone() (#8281)
1 parent a94e7e9 commit 039b1a8

File tree

2 files changed

+105
-65
lines changed

2 files changed

+105
-65
lines changed

addons/ofxAssimp/src/Source/ofxAssimpSrcScene.cpp

Lines changed: 99 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -232,28 +232,47 @@ void SrcScene::printAllNodeNames( aiNode* anode, int alevel ) {
232232
}
233233
}
234234

235+
235236
//-------------------------------------------
236237
void 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
//-------------------------------------------
413453
std::shared_ptr<ofx::assimp::SrcNode> SrcScene::getSrcNodeForAiNodeName( const std::string& aAiNodeName ) {

addons/ofxAssimp/src/Source/ofxAssimpSrcScene.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ class SrcScene {
7676
bool processScene(const ImportSettings& asettings);
7777
void printAllNodeNames( aiNode* anode, int alevel );
7878
void processNodes();
79-
void processNodesRecursive(aiNode* anode, std::shared_ptr<SrcNode> aParentNode);
79+
void processNodesRecursive(aiNode* anode, std::shared_ptr<SrcNode> aParentNode, std::unordered_map<std::string, aiBone*>& aBoneMap);
8080
void processMeshes(aiNode* anode, std::shared_ptr<SrcNode> aSrcNode);
8181

8282
void processBones();
83-
bool isBone( aiNode* aAiNode );
84-
bool isArmature( aiNode* aAiNode );
85-
bool isRootBone( aiNode* aAiNode );
86-
aiBone* getAiBoneForAiNode( aiNode* aAiNode );
87-
void recursiveAddSrcBones( std::shared_ptr<ofx::assimp::SrcBone> abone );
83+
bool isBone( aiNode* aAiNode, const std::unordered_map<std::string, aiBone*>& aBoneMap );
84+
bool isArmature( aiNode* aAiNode, const std::unordered_map<std::string, aiBone*>& aBoneMap );
85+
bool isRootBone( aiNode* aAiNode, std::unordered_map<std::string, aiBone*>& aBoneMap );
86+
aiBone* getAiBoneForAiNode( aiNode* aAiNode, std::unordered_map<std::string, aiBone*>& aBoneMap );
87+
// void recursiveAddSrcBones( std::shared_ptr<ofx::assimp::SrcBone> abone );
8888

8989
std::shared_ptr<ofx::assimp::SrcNode> getSrcNodeForAiNodeName( const std::string& aAiNodeName );
9090

0 commit comments

Comments
 (0)