diff --git a/02-Note/DAWA/2024.12.31新项目笔记.md b/02-Note/DAWA/2024.12.31新项目笔记.md index eb3c086..9ae2144 100644 --- a/02-Note/DAWA/2024.12.31新项目笔记.md +++ b/02-Note/DAWA/2024.12.31新项目笔记.md @@ -31,9 +31,82 @@ # FaceSet -https://groups.google.com/g/alembic-discussion/c/hICfVMzRV2U?pli=1 +https://github.com/zenustech/zeno/blob/b4ed8740810f20cf0612d615d9505468b2d2a4d1/projects/FBX/FBXSDK.cpp#L477 -FbxSelectionSet Class -https://help.autodesk.com/view/FBX/2015/ENU/?guid=__cpp_ref_class_fbx_selection_set_html +```c++ +int mat_count = 0; +if (pMesh->GetElementMaterialCount() > 0) { + for (auto i = 0; i < numPolygons; ++i) { + faceset[i] = pMesh->GetElementMaterial()->GetIndexArray().GetAt(i); + } + mat_count = pNode->GetMaterialCount(); + for (auto i = 0; i < mat_count; i++) { + FbxSurfaceMaterial* material = pNode->GetMaterial(i); + ud.set2(format("faceset_{}", i), material->GetName()); + } +} +``` -GetPolygonGroup? +UE中相关逻辑位于FbxMesh.cpp +```c++ +void ExtractMeshMaterials(FFbxParser& Parser, FbxMesh* Mesh, FbxNode* MeshNode, TFunction CollectMaterial) + { + if (!Mesh || !MeshNode) + { + return; + } + + //Grab all Material indexes use by the mesh + TArray MaterialIndexes; + int32 PolygonCount = Mesh->GetPolygonCount(); + if (FbxGeometryElementMaterial* GeometryElementMaterial = Mesh->GetElementMaterial()) + { + FbxLayerElementArrayTemplate& IndexArray = GeometryElementMaterial->GetIndexArray(); + switch (GeometryElementMaterial->GetMappingMode()) + { + case FbxGeometryElement::eByPolygon: + { + if (IndexArray.GetCount() == PolygonCount) + { + for (int32 PolygonIndex = 0; PolygonIndex < PolygonCount; ++PolygonIndex) + { + MaterialIndexes.AddUnique(IndexArray.GetAt(PolygonIndex)); + } + } + } + break; + + case FbxGeometryElement::eAllSame: + { + if (IndexArray.GetCount() > 0) + { + MaterialIndexes.AddUnique(IndexArray.GetAt(0)); + } + } + break; + } + } + const int32 MaterialCount = MeshNode->GetMaterialCount(); + TMap UniqueSlotNames; + UniqueSlotNames.Reserve(MaterialCount); + bool bAddAllNodeMaterials = (MaterialIndexes.Num() == 0); + for (int32 MaterialIndex = 0; MaterialIndex < MaterialCount; ++MaterialIndex) + { + if (FbxSurfaceMaterial* FbxMaterial = MeshNode->GetMaterial(MaterialIndex)) + { + int32& SlotMaterialCount = UniqueSlotNames.FindOrAdd(FbxMaterial); + FString MaterialName = Parser.GetFbxHelper()->GetFbxObjectName(FbxMaterial); + FString MaterialUid = TEXT("\\Material\\") + MaterialName; + if (bAddAllNodeMaterials || MaterialIndexes.Contains(MaterialIndex)) + { + if (SlotMaterialCount > 0) + { + MaterialName += TEXT("_Section") + FString::FromInt(SlotMaterialCount); + } + SlotMaterialCount++; + CollectMaterial(MaterialName, MaterialUid, MaterialIndex); + } + } + } + } +``` \ No newline at end of file