public static IINode FlattenHierarchyMS(this IINode node) { IILayer nodeLayer = LayerUtilities.GetNodeLayer(node); if (nodeLayer != null) { Loader.Core.LayerManager.SetCurrentLayer(nodeLayer.Name); } List <IINode> children = node.NodeTree().ToList(); List <IINode> nonMeshChildren = children.Where(x => !x.IsMesh()).ToList(); string groupName = node.Name + Random.Next(1, 100000); node.Name = groupName; //use the default one in the future. for some reason uv ar broken with C# version ScriptsUtilities.ExecuteMaxScriptCommand($@" groupNode = maxOps.getNodeByHandle {node.Handle.ToString()} meshChildren = #() for c in groupNode.children do ( if superclassof c == GeometryClass then ( append meshChildren c ) ) obj = mesh vertices:#([0,0,0],[10,0,0],[0,10,0]) faces:#([1,2,3]) name:groupNode.name transform:groupNode.transform converttopoly obj multimat_new=#() for obj_temp in meshChildren do ( obj_temp.parent=undefined converttomesh obj_temp resetXform obj_temp converttomesh obj_temp local save_mat=obj_temp.material if classof save_mat == Multimaterial then ( ID_true_used=#{{}} T_Faces_matID=#() T_Faces_matID.count=save_mat.count for f=1 to obj_temp.numfaces do ( local face_matID=(getFaceMatID obj_temp f) if not(ID_true_used[face_matID]) then ( T_Faces_matID[face_matID]=#{{f}} ID_true_used[face_matID]=true ) else ( append (T_Faces_matID[face_matID]) f ) ) for index_mat in ID_true_used do ( mat_current=save_mat[index_mat] matID=finditem multimat_new mat_current if matID==0 then ( append multimat_new mat_current new_Id=multimat_new.count for f in (T_Faces_matID[index_mat]) do setFaceMatID obj_temp f new_Id ) else for f in (T_Faces_matID[index_mat]) do setFaceMatID obj_temp f matID ) ) else ( mat_current = save_mat matID = finditem multimat_new mat_current if matID == 0 then ( append multimat_new mat_current new_Id = multimat_new.count for f = 1 to obj_temp.numfaces do setFaceMatID obj_temp f new_Id ) else for f = 1 to obj_temp.numfaces do setFaceMatID obj_temp f matID ) obj_temp.material = undefined with undo off(polyop.attach obj obj_temp) ) final_mat = multimaterial numsubs: (multimat_new.count) final_mat.name = obj.name + ""_mat"" for i = 1 to(multimat_new.count) do ( if multimat_new[i] == undefined then(final_mat[i] = FlightSim() ; final_mat[i].name = ""Newmat"" ) else final_mat[i] = multimat_new[i] ) polyop.deleteFaces obj 1 obj.material = final_mat obj.parent = groupNode.parent"); Loader.Core.DeleteNode(node, false, false); IINode newNode = Loader.Core.GetINodeByName(groupName); foreach (IINode n in nonMeshChildren) { newNode.AttachChild(n, true); } return(newNode); }
public static IINode FlattenHierarchy(this IINode node) { IILayer nodeLayer = LayerUtilities.GetNodeLayer(node); if (nodeLayer != null) { Loader.Core.LayerManager.SetCurrentLayer(nodeLayer.Name); } List <IINode> children = node.NodeTree().ToList(); List <IINode> nonMeshChildren = children.Where(x => !x.IsMesh()).ToList(); List <IINode> meshChildren = children.Where(x => x.IsMesh()).ToList(); IClass_ID cid = Loader.Global.Class_ID.Create((uint)BuiltInClassIDA.SPHERE_CLASS_ID, 0); object obj = Loader.Core.CreateInstance(SClass_ID.Geomobject, cid as IClass_ID); IINode result = Loader.Core.CreateObjectNode((IObject)obj); result.Name = node.Name; result.SetNodeTM(Loader.Core.Time, node.GetNodeTM(Loader.Core.Time, Forever)); node.ParentNode.AttachChild(result, true); string convertToEditablePoly = $"ConvertTo (maxOps.getNodeByHandle {result.Handle}) Editable_Poly"; ScriptsUtilities.ExecuteMaxScriptCommand(convertToEditablePoly); IPolyObject polyObject = result.GetPolyObjectFromNode(); IEPoly nodeEPoly = (IEPoly)polyObject.GetInterface(Loader.EditablePoly); List <IMtl> newMultiMat = new List <IMtl>(); foreach (IINode n in meshChildren) { ITriObject triObject = n.GetTriObjectFromNode(); IMesh mesh = triObject.Mesh; if (n.Mtl.IsMultiMtl) { Dictionary <IMtl, List <IFace> > matIDtoFacesMap = new Dictionary <IMtl, List <IFace> >(); ////List<int> matIDsInUse = new List<int>(); foreach (IFace face in mesh.Faces) { int faceMatID = face.MatID; IMtl mat = n.Mtl.GetSubMtl(faceMatID); if (!matIDtoFacesMap.ContainsKey(mat)) { List <IFace> facesOfMat = new List <IFace>(); matIDtoFacesMap.Add(mat, facesOfMat); } matIDtoFacesMap[mat].Add(face); } foreach (KeyValuePair <IMtl, List <IFace> > matToFaceKeyValue in matIDtoFacesMap) { IMtl faceMat = matToFaceKeyValue.Key; //get the material from the list of the multimaterial if (!newMultiMat.Contains(faceMat)) { newMultiMat.Add(faceMat); } ushort newId = (ushort)(newMultiMat.IndexOf(faceMat)); foreach (IFace face in matToFaceKeyValue.Value) { face.MatID = newId; } } } else { //IMtl currentMat = n.Mtl; //int matID = newMultiMat.IndexOf(currentMat); //if (matID == -1) //{ // newMultiMat.Add(currentMat); // ushort newId = (ushort)newMultiMat.Count; // for (int fID = 0; fID < mesh.NumFaces; fID++) // { // mesh.SetFaceMtlIndex(fID, (ushort)newId); // } //} //else //{ // for (int fID = 0; fID < mesh.NumFaces; fID++) // { // mesh.SetFaceMtlIndex(fID, (ushort)matID); // } //} } triObject.Mesh = mesh; n.ObjectRef = triObject; //bool undo = false; //nodeEPoly.EpfnAttach(n, ref undo,result, Loader.Core.Time); } IClass_ID matCid = Loader.Global.Class_ID.Create((uint)BuiltInClassIDA.MULTI_MATERIAL_CLASS_ID, 0); IMtl finalMat = (IMtl)Loader.Core.CreateInstance(SClass_ID.Material, matCid); for (int i = 0; i < newMultiMat.Count; i++) { finalMat.SetSubMtl(i, newMultiMat[i]); } finalMat.Name = "final mat"; result.Mtl = finalMat; foreach (IINode n in nonMeshChildren) { result.AttachChild(n, true); } Loader.Core.DeleteNode(node, false, false); return(result); }