Merge pull request #1895 from assimp/issue_1894

closes https://github.com/assimp/assimp/issues/1894: use mesh name to…
pull/1896/head^2
Kim Kulling 2018-04-11 20:26:53 +02:00 committed by GitHub
commit 2208a23410
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 32 deletions

View File

@ -439,9 +439,15 @@ void ObjExporter::AddMesh(const aiString& name, const aiMesh* m, const aiMatrix4
void ObjExporter::AddNode(const aiNode* nd, const aiMatrix4x4& mParent) { void ObjExporter::AddNode(const aiNode* nd, const aiMatrix4x4& mParent) {
const aiMatrix4x4& mAbs = mParent * nd->mTransformation; const aiMatrix4x4& mAbs = mParent * nd->mTransformation;
aiMesh *cm( nullptr );
for(unsigned int i = 0; i < nd->mNumMeshes; ++i) { for(unsigned int i = 0; i < nd->mNumMeshes; ++i) {
cm = pScene->mMeshes[nd->mMeshes[i]];
if (nullptr != cm) {
AddMesh(cm->mName, pScene->mMeshes[nd->mMeshes[i]], mAbs);
} else {
AddMesh(nd->mName, pScene->mMeshes[nd->mMeshes[i]], mAbs); AddMesh(nd->mName, pScene->mMeshes[nd->mMeshes[i]], mAbs);
} }
}
for(unsigned int i = 0; i < nd->mNumChildren; ++i) { for(unsigned int i = 0; i < nd->mNumChildren; ++i) {
AddNode(nd->mChildren[i], mAbs); AddNode(nd->mChildren[i], mAbs);

View File

@ -76,25 +76,25 @@ OptimizeGraphProcess::OptimizeGraphProcess()
: mScene() : mScene()
, nodes_in() , nodes_in()
, nodes_out() , nodes_out()
, count_merged() , count_merged() {
{} // empty
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Destructor, private as well // Destructor, private as well
OptimizeGraphProcess::~OptimizeGraphProcess() OptimizeGraphProcess::~OptimizeGraphProcess() {
{} // empty
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Returns whether the processing step is present in the given flag field. // Returns whether the processing step is present in the given flag field.
bool OptimizeGraphProcess::IsActive( unsigned int pFlags) const bool OptimizeGraphProcess::IsActive( unsigned int pFlags) const {
{
return (0 != (pFlags & aiProcess_OptimizeGraph)); return (0 != (pFlags & aiProcess_OptimizeGraph));
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Setup properties for the postprocessing step // Setup properties for the post-processing step
void OptimizeGraphProcess::SetupProperties(const Importer* pImp) void OptimizeGraphProcess::SetupProperties(const Importer* pImp) {
{
// Get value of AI_CONFIG_PP_OG_EXCLUDE_LIST // Get value of AI_CONFIG_PP_OG_EXCLUDE_LIST
std::string tmp = pImp->GetPropertyString(AI_CONFIG_PP_OG_EXCLUDE_LIST,""); std::string tmp = pImp->GetPropertyString(AI_CONFIG_PP_OG_EXCLUDE_LIST,"");
AddLockedNodeList(tmp); AddLockedNodeList(tmp);
@ -102,16 +102,14 @@ void OptimizeGraphProcess::SetupProperties(const Importer* pImp)
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Collect new children // Collect new children
void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list<aiNode*>& nodes) void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list<aiNode*>& nodes) {
{
nodes_in += nd->mNumChildren; nodes_in += nd->mNumChildren;
// Process children // Process children
std::list<aiNode*> child_nodes; std::list<aiNode*> child_nodes;
for (unsigned int i = 0; i < nd->mNumChildren; ++i) { for (unsigned int i = 0; i < nd->mNumChildren; ++i) {
CollectNewChildren(nd->mChildren[i],child_nodes); CollectNewChildren(nd->mChildren[i],child_nodes);
nd->mChildren[i] = NULL; nd->mChildren[i] = nullptr;
} }
// Check whether we need this node; if not we can replace it by our own children (warn, danger of incest). // Check whether we need this node; if not we can replace it by our own children (warn, danger of incest).
@ -130,13 +128,11 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list<aiNode*>& no
if (nd->mNumMeshes || !child_nodes.empty()) { if (nd->mNumMeshes || !child_nodes.empty()) {
nodes.push_back(nd); nodes.push_back(nd);
} } else {
else {
delete nd; /* bye, node */ delete nd; /* bye, node */
return; return;
} }
} } else {
else {
// Retain our current position in the hierarchy // Retain our current position in the hierarchy
nodes.push_back(nd); nodes.push_back(nd);
@ -160,14 +156,11 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list<aiNode*>& no
} }
} }
if (n == child->mNumMeshes) { if (n == child->mNumMeshes) {
if (!join_master) { if (!join_master) {
join_master = child; join_master = child;
inv = join_master->mTransformation; inv = join_master->mTransformation;
inv.Inverse(); inv.Inverse();
} } else {
else {
child->mTransformation = inv * child->mTransformation ; child->mTransformation = inv * child->mTransformation ;
join.push_back(child); join.push_back(child);
@ -227,9 +220,10 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list<aiNode*>& no
delete[] nd->mChildren; delete[] nd->mChildren;
if (!child_nodes.empty()) if (!child_nodes.empty()) {
nd->mChildren = new aiNode*[child_nodes.size()]; nd->mChildren = new aiNode*[child_nodes.size()];
else nd->mChildren = NULL; }
else nd->mChildren = nullptr;
} }
nd->mNumChildren = static_cast<unsigned int>(child_nodes.size()); nd->mNumChildren = static_cast<unsigned int>(child_nodes.size());
@ -246,9 +240,8 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list<aiNode*>& no
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Execute the postprocessing step on the given scene // Execute the post-processing step on the given scene
void OptimizeGraphProcess::Execute( aiScene* pScene) void OptimizeGraphProcess::Execute( aiScene* pScene) {
{
DefaultLogger::get()->debug("OptimizeGraphProcess begin"); DefaultLogger::get()->debug("OptimizeGraphProcess begin");
nodes_in = nodes_out = count_merged = 0; nodes_in = nodes_out = count_merged = 0;
mScene = pScene; mScene = pScene;
@ -268,7 +261,6 @@ void OptimizeGraphProcess::Execute( aiScene* pScene)
for (unsigned int i = 0; i < pScene->mNumAnimations; ++i) { for (unsigned int i = 0; i < pScene->mNumAnimations; ++i) {
for (unsigned int a = 0; a < pScene->mAnimations[i]->mNumChannels; ++a) { for (unsigned int a = 0; a < pScene->mAnimations[i]->mNumChannels; ++a) {
aiNodeAnim* anim = pScene->mAnimations[i]->mChannels[a]; aiNodeAnim* anim = pScene->mAnimations[i]->mChannels[a];
locked.insert(AI_OG_GETKEY(anim->mNodeName)); locked.insert(AI_OG_GETKEY(anim->mNodeName));
} }
@ -349,7 +341,7 @@ void OptimizeGraphProcess::Execute( aiScene* pScene)
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Buidl a LUT of all instanced meshes // Build a LUT of all instanced meshes
void OptimizeGraphProcess::FindInstancedMeshes (aiNode* pNode) void OptimizeGraphProcess::FindInstancedMeshes (aiNode* pNode)
{ {
for (unsigned int i = 0; i < pNode->mNumMeshes;++i) { for (unsigned int i = 0; i < pNode->mNumMeshes;++i) {