SAssPiece* CAssParser::LoadPiece( S3DModel* model, const aiNode* pieceNode, const aiScene* scene, const LuaTable& modelTable, ModelPieceMap& pieceMap, ParentNameMap& parentMap ) { ++model->numPieces; SAssPiece* piece = new SAssPiece(); if (pieceNode->mParent == nullptr) { // set the model's root piece ASAP, needed later assert(pieceNode == scene->mRootNode); assert(model->GetRootPiece() == nullptr); model->SetRootPiece(piece); } SetPieceName(piece, model, pieceNode, pieceMap); LOG_SL(LOG_SECTION_PIECE, L_INFO, "Converting node '%s' to piece '%s' (%d meshes).", pieceNode->mName.data, piece->name.c_str(), pieceNode->mNumMeshes); // Load additional piece properties from metadata const LuaTable& pieceTable = modelTable.SubTable("pieces").SubTable(piece->name); if (pieceTable.IsValid()) { LOG_SL(LOG_SECTION_PIECE, L_INFO, "Found metadata for piece '%s'", piece->name.c_str()); } LoadPieceTransformations(piece, model, pieceNode, pieceTable); LoadPieceGeometry(piece, pieceNode, scene); SetPieceParentName(piece, model, pieceNode, pieceTable, parentMap); { // operator[] creates an empty string if piece is not in map const auto parentNameIt = parentMap.find(piece); const std::string& parentName = (parentNameIt != parentMap.end())? (parentNameIt->second).c_str(): "[null]"; // Verbose logging of piece properties LOG_SL(LOG_SECTION_PIECE, L_INFO, "Loaded model piece: %s with %d meshes", piece->name.c_str(), pieceNode->mNumMeshes); LOG_SL(LOG_SECTION_PIECE, L_INFO, "piece->name: %s", piece->name.c_str()); LOG_SL(LOG_SECTION_PIECE, L_INFO, "piece->parent: %s", parentName.c_str()); } // Recursively process all child pieces for (unsigned int i = 0; i < pieceNode->mNumChildren; ++i) { LoadPiece(model, pieceNode->mChildren[i], scene, modelTable, pieceMap, parentMap); } pieceMap[piece->name] = piece; return piece; }
SAssPiece* CAssParser::LoadPiece( S3DModel* model, const aiNode* pieceNode, const aiScene* scene, const LuaTable& modelTable ) { ++model->numPieces; SAssPiece* piece = new SAssPiece(); if (pieceNode->mParent == NULL) { // set the model's root piece ASAP, needed later assert(pieceNode == scene->mRootNode); assert(model->GetRootPiece() == NULL); model->SetRootPiece(piece); } SetPieceName(piece, model, pieceNode); LOG_SL(LOG_SECTION_PIECE, L_INFO, "Converting node '%s' to piece '%s' (%d meshes).", pieceNode->mName.data, piece->name.c_str(), pieceNode->mNumMeshes); // Load additional piece properties from metadata const LuaTable& pieceTable = modelTable.SubTable("pieces").SubTable(piece->name); if (pieceTable.IsValid()) { LOG_SL(LOG_SECTION_PIECE, L_INFO, "Found metadata for piece '%s'", piece->name.c_str()); } // Load transforms LoadPieceTransformations(piece, model, pieceNode, pieceTable); if (SetModelRadiusAndHeight(model, piece, pieceNode, pieceTable)) return NULL; LoadPieceGeometry(piece, pieceNode, scene); SetPieceParentName(piece, model, pieceNode, pieceTable); // Verbose logging of piece properties LOG_SL(LOG_SECTION_PIECE, L_INFO, "Loaded model piece: %s with %d meshes", piece->name.c_str(), pieceNode->mNumMeshes); LOG_SL(LOG_SECTION_PIECE, L_INFO, "piece->name: %s", piece->name.c_str()); LOG_SL(LOG_SECTION_PIECE, L_INFO, "piece->parent: %s", piece->parentName.c_str()); // Recursively process all child pieces for (unsigned int i = 0; i < pieceNode->mNumChildren; ++i) { LoadPiece(model, pieceNode->mChildren[i], scene, modelTable); } model->pieceMap[piece->name] = piece; return piece; }