コード例 #1
0
ファイル: ObjectMethods.cs プロジェクト: yuan505/Explode
        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);
        }