Hi Michael!

Thanks so much for the tip. I had a look at the function you mentioned and 
wrote this as improvement using that. From what I've tested it performs on 
meshes up to 900k faces in roughly 0.7 seconds compared to roughly 8 
seconds for the old version.
I'm pretty sure this is still not the fastest way to do this, but it's 
already way faster than it was before. So if you have any other improvement 
points I'd like to hear it!

def geo_weights_to_surface(source, target, tol=0.005, space=om.MSpace.kWorld):

    start = time.time()
    # Mesh
    mesh_sel = om.MSelectionList().add(source)
    mesh_dag_path = mesh_sel.getDagPath(0)
    mesh_dag_path.extendToShape()
    mesh = om.MFnMesh(mesh_dag_path)
    mesh_node = om.MFnDependencyNode(mesh_dag_path.node())
    mesh_attr = mesh_node.attribute('inMesh')
    mesh_plug = mesh_node.findPlug(mesh_attr, 0)
    mesh_sc_array = mesh_plug.connectedTo(True, False)
    mesh_sc_node = mesh_sc_array[0].node()

    mesh_sc = oma.MFnSkinCluster(mesh_sc_node)
    mesh_influences = mesh_sc.influenceObjects()
    # Surface
    surf_sel = om.MSelectionList().add(target)
    surf_dag_path = surf_sel.getDagPath(0)
    shape_nr = surf_dag_path.numberOfShapesDirectlyBelow()

    # Append shapes to array
    shapes = om.MDagPathArray()
    for idx in range(shape_nr):
        dag_path = surf_sel.getDagPath(0)
        dag_path.extendToShape(idx)
        shapes.append(dag_path)

    for item in range(len(shapes)):
        surf_dag_path = surf_sel.getDagPath(0)
        surf_dag_path.extendToShape(item)
        shape_node = om.MFnDependencyNode(surf_dag_path.node())
        surf_attr = shape_node.attribute('create')
        surf_plug = shape_node.findPlug(surf_attr, 0)
        surf_sc_array = surf_plug.connectedTo(True, False)
        surf_sc_node = surf_sc_array[0].node()
        surf_sc = oma.MFnSkinCluster(surf_sc_node)
        surf = om.MFnNurbsSurface(shapes[item])

        surf_itr = om.MItSurfaceCV(shapes[item])

        while not surf_itr.isDone():
            while not surf_itr.isRowDone():
                pos = surf_itr.position()
                float_pos = om.MFloatPoint(pos.x, pos.y, pos.z)
                uvs = surf_itr.uvIndices()
                cv_normal = surf.normal(uvs[0], uvs[1], space=space)
                dir_vector = om.MFloatVector(cv_normal.x, cv_normal.y, 
cv_normal.z)
                facenr = mesh.closestIntersection(float_pos, dir_vector, space, 
0.05, True)[2]
                face_sel = om.MSelectionList().add(source + '.f[' + str(facenr) 
+ ']')
                face_component = face_sel.getComponent(0)[1]

                face_itr = om.MItMeshFaceVertex(mesh_dag_path, face_component)
                while not face_itr.isDone():
                    if face_itr.position().isEquivalent(pos, tol):
                        vtx_idx = face_itr.vertexId()
                        idx_sel = om.MSelectionList().add(source + '.f[' + 
str(vtx_idx) + ']')
                        vtx = idx_sel.getComponent(0)[1]
                        for mesh_inf in range(len(mesh_influences)):
                            mesh_inf_idx = mesh_sc.indexForInfluenceObject(
                                mesh_influences[mesh_inf])
                            vtx_weight = mesh_sc.getWeights(mesh_dag_path, vtx, 
mesh_inf_idx)
                            vtx_blend_weight = 
mesh_sc.getBlendWeights(mesh_dag_path, vtx)
                            cv_uv = surf_itr.uvIndices()
                            cv_component = 
om.MFnNurbsSurface(surf_dag_path).cv(cv_uv[0], cv_uv[1])
                            surf_inf_idx = surf_sc.indexForInfluenceObject(
                                mesh_influences[mesh_inf])
                            surf_sc.setWeights(surf_dag_path, cv_component, 
surf_inf_idx,
                                               vtx_weight[0], normalize=True)
                            surf_sc.setBlendWeights(surf_dag_path, 
cv_component, vtx_blend_weight)
                    face_itr.next()
                surf_itr.next()
            surf_itr.nextRow()

    print 'Copying weights took', time.time() - start, 'seconds.'


-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to python_inside_maya+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/3551d64d-91bb-48c1-a1e4-718d0f05a6ba%40googlegroups.com.

Reply via email to