public static ushort?UpdateFaceDictionary(BaseNode node) { var triMesh = node.Mesh.TriMesh; var polyMesh = node.Mesh.PolyMesh; var faceCountPerID = new Dictionary <ushort, int>(); //Get numFaces of each ID foreach (var ids in node.GetUsedMaterialIDsArray()) { faceCountPerID.Add(ids, GetCardinality(node.GetMaterialBitArray(ids))); } //clear the materialFaceDictionary node.ClearMaterialBitArray(); if (node.Mesh.TriMesh != null) { var numFaces = triMesh.NumFaces; var parentNode = node as ParentNode; //Build FaceID Dictionary. for (int index = 0; index < numFaces; index++) { IFace face = triMesh.Faces[index]; ushort matID = face.MatID; //This means it's a child node if (parentNode == null) { UpdateNode(node, matID, index, numFaces); } //So it's a parentNode, but we don't want to update delete material IDs so check if that's not true else if (!parentNode.IsMatIDDeleted(matID)) { UpdateNode(node, matID, index, numFaces); } } } else { var numFaces = polyMesh.FNum; var parentNode = node as ParentNode; //Build FaceID Dictionary. for (int index = 0; index < numFaces; index++) { IMNFace face = polyMesh.F(index); ushort matID = face.Material; if (parentNode == null) { UpdateNode(node, matID, index, numFaces); } else if (!parentNode.IsMatIDDeleted(matID)) { UpdateNode(node, matID, index, numFaces); } } } foreach (var ids in node.GetUsedMaterialIDsArray()) { int numFaces; if (!faceCountPerID.TryGetValue(ids, out numFaces)) { continue; } if (numFaces != GetCardinality(node.GetMaterialBitArray(ids))) { return(ids); } } return(null); }