/// <summary> /// Return true if node descendant hierarchy has any exportable Mesh, Camera, Light or Locator /// </summary> private bool isNodeRelevantToExportRec(MDagPath mDagPathRoot) { var mIteratorType = new MIteratorType(); MIntArray listOfFilters = new MIntArray(); listOfFilters.Add((int)MFn.Type.kMesh); listOfFilters.Add((int)MFn.Type.kCamera); listOfFilters.Add((int)MFn.Type.kLight); listOfFilters.Add((int)MFn.Type.kLocator); mIteratorType.setFilterList(listOfFilters); var dagIterator = new MItDag(mIteratorType, MItDag.TraversalType.kDepthFirst); dagIterator.reset(mDagPathRoot); while (!dagIterator.isDone) { MDagPath mDagPath = new MDagPath(); dagIterator.getPath(mDagPath); // Check direct descendants if (getApiTypeOfDirectDescendants(mDagPath) != MFn.Type.kUnknown) { return(true); } dagIterator.next(); } // No relevant node found among descendants return(false); }
private static void unpackDynMesh(Mesh dynMesh, out MIntArray faceCnx, out MFloatPointArray verticies, out MIntArray faceVtxCt) { MIntArray m_faceCnx = new MIntArray(); MFloatPointArray m_verticies = new MFloatPointArray(); MIntArray m_faceVtxCt = new MIntArray(); MFloatPoint vtxToAdd = new MFloatPoint(); foreach (var vtx in dynMesh.VertexPositions) { if (MGlobal.isZAxisUp) { vtxToAdd.x = (float)vtx.X; vtxToAdd.y = (float)vtx.Y; vtxToAdd.z = (float)vtx.Z; } else { vtxToAdd.x = (float)vtx.X; vtxToAdd.y = (float)vtx.Z; vtxToAdd.z = -(float)vtx.Y; } m_verticies.Add(vtxToAdd); } foreach (var fidx in dynMesh.FaceIndices) { int vtxCt = (int)fidx.Count; m_faceVtxCt.Add(vtxCt); if (vtxCt == 3) { m_faceCnx.Add((int)fidx.A); m_faceCnx.Add((int)fidx.B); m_faceCnx.Add((int)fidx.C); } else { m_faceCnx.Add((int)fidx.A); m_faceCnx.Add((int)fidx.B); m_faceCnx.Add((int)fidx.C); m_faceCnx.Add((int)fidx.D); } } verticies = m_verticies; faceCnx = m_faceCnx; faceVtxCt = m_faceVtxCt; }
/// <summary> /// Get the local indices from mesh relative triangle indices obtained with MItMeshPolygon.getTriangle(). /// Original C++ script by Bruno 'Beosil' Heidelberger and Thomas Cowell. /// </summary> /// <param name="polyMeshRelative"></param> /// <param name="triMeshRelative"></param> /// <returns>A list of 3 face-relative indices each.</returns> private static MIntArray GetLocalTriangle(MIntArray polyMeshRelative, MIntArray triMeshRelative) { Debug.Assert(triMeshRelative.Count == 3); var result = new MIntArray(); foreach (var vertMeshIndex in triMeshRelative) { for (var gv = 0; gv < polyMeshRelative.Count; gv++) { if (polyMeshRelative[gv] != vertMeshIndex) { continue; } result.Add(gv); break; } } return(result); }
private static void unpackTsMesh(TSplineSurface tsMesh, out MIntArray faceCnx, out MFloatPointArray verticies, out MIntArray faceVtxCt) { MIntArray m_faceCnx = new MIntArray(); MFloatPointArray m_verticies = new MFloatPointArray(); MIntArray m_faceVtxCt = new MIntArray(); MFloatPoint vtxToAdd = new MFloatPoint(); var tsMeshCompress = tsMesh.CompressIndexes(); foreach (var vtx in tsMeshCompress.Vertices) { if (MGlobal.isZAxisUp) { vtxToAdd.x = (float)vtx.PointGeometry.X; vtxToAdd.y = (float)vtx.PointGeometry.Y; vtxToAdd.z = (float)vtx.PointGeometry.Z; } else { vtxToAdd.x = (float)vtx.PointGeometry.X; vtxToAdd.y = (float)vtx.PointGeometry.Z; vtxToAdd.z = -(float)vtx.PointGeometry.Y; } m_verticies.Add(vtxToAdd); } foreach (var fidx in tsMeshCompress.Faces) { int vtxCt = fidx.Vertices.Length; m_faceVtxCt.Add(vtxCt); foreach (var fVert in fidx.Vertices) { m_faceCnx.Add(fVert.Index); } } verticies = m_verticies; faceCnx = m_faceCnx; faceVtxCt = m_faceVtxCt; }
public static List <Surface> meshToNurbs(MFnMesh mayaMesh) { MFnSubd subDmesh = new MFnSubd(); subDmesh.isIntermediateObject = true; MPointArray mayaVerts = new MPointArray(); mayaMesh.getPoints(mayaVerts, MSpace.Space.kWorld); MIntArray polyVertct = new MIntArray(); MIntArray ids = new MIntArray(); MIntArray idList = new MIntArray(); for (int i = 0; i < mayaMesh.numPolygons; i++) { mayaMesh.getPolygonVertices(i, ids); foreach (var id in ids) { idList.Add(id); } polyVertct.Add(ids.Count); } subDmesh.createBaseMesh(false, mayaMesh.numVertices, mayaMesh.numPolygons, mayaVerts, polyVertct, idList); try { MUintArray creaseEdgId = new MUintArray(); MDoubleArray creaseEdgeVal = new MDoubleArray(); mayaMesh.getCreaseEdges(creaseEdgId, creaseEdgeVal); foreach (var edgId in creaseEdgId) { subDmesh.edgeSetCrease(edgId, true); } } catch {} try { MUintArray creaseVertId = new MUintArray(); MDoubleArray creaseVertVal = new MDoubleArray(); mayaMesh.getCreaseVertices(creaseVertId, creaseVertVal); foreach (var vertId in creaseVertId) { subDmesh.vertexSetCrease(vertId, true); } } catch { } subDmesh.updateAllEditsAndCreases(); MObjectArray nurbsSurfs = new MObjectArray(); subDmesh.convertToNurbs(nurbsSurfs); List <MFnNurbsSurface> mfnSurfaceList = new List <MFnNurbsSurface>(nurbsSurfs.Count); foreach (var surf in nurbsSurfs) { mfnSurfaceList.Add(new MFnNurbsSurface(surf)); } List <Surface> dynSurfaceList = new List <Surface>(mfnSurfaceList.Count); foreach (var mfnNS in mfnSurfaceList) { dynSurfaceList.Add(DMSurface.mNurbsSurfaceToDynamoSurface(mfnNS, MSpace.Space.kObject)); } MGlobal.deleteNode(subDmesh.model); return(dynSurfaceList); }
public static bool ToMayaOLD(Mesh MeshToSend, string name) { bool nodeExists = false; MDagPath node = null; Task checkNode = null; Task mobjMesh = null; try { checkNode = Task.Factory.StartNew(() => node = DMInterop.getDagNode(name)); checkNode.Wait(500); nodeExists = true; } catch (Exception) { nodeExists = false; } MFnMesh mfnMesh; if (nodeExists) { mfnMesh = new MFnMesh(node); } else { mfnMesh = new MFnMesh(); } //unpack geom int numVert = MeshToSend.VertexPositions.Length; int numPoly = MeshToSend.FaceIndices.Length; MIntArray faceCnx = new MIntArray(); MFloatPointArray verticies = new MFloatPointArray(); MIntArray faceVtxCt = new MIntArray(); MFloatPoint vtxToAdd = new MFloatPoint(); foreach (var vtx in MeshToSend.VertexPositions) { if (MGlobal.isZAxisUp) { vtxToAdd.x = (float)vtx.X; vtxToAdd.y = (float)vtx.Y; vtxToAdd.z = (float)vtx.Z; } else { vtxToAdd.x = (float)vtx.X; vtxToAdd.y = (float)vtx.Z; vtxToAdd.z = -(float)vtx.Y; } verticies.Add(vtxToAdd); } foreach (var fidx in MeshToSend.FaceIndices) { int vtxCt = (int)fidx.Count; faceVtxCt.Add(vtxCt); if (vtxCt == 3) { faceCnx.Add((int)fidx.A); faceCnx.Add((int)fidx.B); faceCnx.Add((int)fidx.C); } else { faceCnx.Add((int)fidx.A); faceCnx.Add((int)fidx.B); faceCnx.Add((int)fidx.C); faceCnx.Add((int)fidx.D); } } //create maya mesh if (nodeExists) { mfnMesh.createInPlace(numVert, numPoly, verticies, faceVtxCt, faceCnx); mfnMesh.Dispose(); } else { using (var obj = mfnMesh.create(numVert, numPoly, verticies, faceVtxCt, faceCnx)) { MFnDependencyNode nodeFn = new MFnDagNode(obj); nodeFn.setName(name); MGlobal.executeCommand("sets -e -forceElement initialShadingGroup " + nodeFn.name); mfnMesh.Dispose(); } } return(true); }