Hi everyone,

I try to buil a new node for create a BlendShape UV.
The principle is very simple. But UV does not update. Are there special 
things to do to update them ?

I join my file.
I trying with MPxNode beaucause I have a same probleme with MPxDeformerNode.

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/f73e0a3a-6ed3-4553-8474-c2ba5476aff9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
# ======================================================================
#   Import Modules
# ======================================================================

from maya import OpenMaya, OpenMayaMPx


# ======================================================================
#   Soft Control
# ======================================================================

class BlendshapeUV(OpenMayaMPx.MPxNode):

    # ==================================================================
    #   Class Variables
    # ==================================================================

    kPluginNode = "blendshapeUV"
    kPluginNodeID = OpenMaya.MTypeId(0x185134)
    kPluginNodeType = OpenMayaMPx.MPxNode.kDependNode

    INPUT = OpenMaya.MObject()
    TARGET = OpenMaya.MObject()
    WEIGHT = OpenMaya.MObject()

    OUTPUT = OpenMaya.MObject()

    # ==================================================================
    #   Init
    # ==================================================================

    @classmethod
    def creator(cls):
        return OpenMayaMPx.asMPxPtr(cls())

    def __init__(self) :
        super(BlendshapeUV, self).__init__()

    @classmethod
    def initializer(cls):

        a_in_attribute = []
        a_out_attribute = []

        #    Input
        input_attr = OpenMaya.MFnTypedAttribute()
        cls.INPUT = input_attr.create("input", "in", OpenMaya.MFnData.kMesh)
        a_in_attribute.append(cls.INPUT)

        target_attr = OpenMaya.MFnTypedAttribute()
        cls.TARGET = target_attr.create("target", "tgt", OpenMaya.MFnData.kMesh)
        a_in_attribute.append(cls.TARGET)

        weight_attr = OpenMaya.MFnNumericAttribute()
        cls.WEIGHT = weight_attr.create("weight", "w", OpenMaya.MFnNumericData.kDouble, 0.0)
        weight_attr.setMin(0.0)
        weight_attr.setMax(1.0)
        a_in_attribute.append(cls.WEIGHT)

        #    Output
        output_attr = OpenMaya.MFnTypedAttribute()
        cls.OUTPUT = output_attr.create("output", "out", OpenMaya.MFnData.kMesh)
        output_attr.setKeyable(False)
        output_attr.setStorable(False)
        a_out_attribute.append(cls.OUTPUT)

        #   Add attributes
        for attribute in (a_in_attribute + a_out_attribute):
            cls.addAttribute(attribute)

        # Set the attribute dependencies
        for a_out_attr in a_out_attribute:
            for a_int_attr in a_in_attribute:
                cls.attributeAffects(a_int_attr, a_out_attr)

    # ==================================================================
    #   Compute
    # ==================================================================

    def compute(self, plug, data):

        """
        !@Brief
        """

        if plug != self.OUTPUT:
            return

        #   Get plug datas
        mo_input = data.inputValue(self.INPUT).asMesh()
        mfn_input = OpenMaya.MFnMesh(mo_input)

        mo_target = data.inputValue(self.TARGET).asMesh()
        mfn_target = OpenMaya.MFnMesh(mo_target)

        f_weight = data.inputValue(self.WEIGHT).asDouble()

        #   Blend Point
        mpa_input_points = OpenMaya.MPointArray()
        mfn_input.getPoints(mpa_input_points, OpenMaya.MSpace.kObject)

        mpa_target_points = OpenMaya.MPointArray()
        mfn_target.getPoints(mpa_target_points, OpenMaya.MSpace.kObject)

        mpa_output_points = OpenMaya.MPointArray(mpa_input_points.length(), OpenMaya.MPoint())
        for i in range(mpa_input_points.length()):
            mv_offset = mpa_target_points[i] - mpa_input_points[i]
            mv_output = mpa_input_points[i] + (mv_offset * f_weight)
            mpa_output_points.set(OpenMaya.MPoint(mv_output), i)

        #   Blend UV
        mfa_input_u = OpenMaya.MFloatArray()
        mfa_input_v = OpenMaya.MFloatArray()
        mfn_input.getUVs(mfa_input_u, mfa_input_v, "map1")

        mfa_target_u = OpenMaya.MFloatArray()
        mfa_target_v = OpenMaya.MFloatArray()
        mfn_target.getUVs(mfa_target_u, mfa_target_v, "map1")

        mfa_output_u = OpenMaya.MFloatArray(mfa_input_u.length(), 0.0)
        mfa_output_v = OpenMaya.MFloatArray(mfa_input_u.length(), 0.0)
        for i in range(mfa_input_u.length()):
            #   u
            f_offset_u = mfa_target_u[i] - mfa_input_u[i]
            f_output_u = mfa_input_u[i] + (f_offset_u * f_weight)
            mfa_output_u.set(f_output_u, i)
            #   V
            f_offset_v = mfa_target_v[i] - mfa_input_v[i]
            f_output_v = mfa_input_v[i] + (f_offset_v * f_weight)
            mfa_output_v.set(f_output_v, i)

        #   Output
        vtx_per_poly = OpenMaya.MIntArray()
        vtx_index = OpenMaya.MIntArray()
        mfn_input.getVertices(vtx_per_poly, vtx_index)

        mo_output = OpenMaya.MFnMeshData().create()
        OpenMaya.MFnMesh().create(
            mfn_input.numVertices(),
            mfn_input.numPolygons(),
            mpa_output_points,
            vtx_per_poly,
            vtx_index,
            mfa_output_u,
            mfa_output_v,
            mo_output,
        )

        h_output = data.outputValue(self.OUTPUT)
        h_output.setMObject(mo_output)

        #   Clean plug
        data.setClean(plug)


# ======================================================================
#   Initialize plugin
# ======================================================================

#   load
def initializePlugin(m_object):

    plugin = OpenMayaMPx.MFnPlugin(
        m_object,
        "Remi Deletrain -- [email protected]",
        "1.0",
        "Any"
    )

    try:
        plugin.registerNode(
            BlendshapeUV.kPluginNode,
            BlendshapeUV.kPluginNodeID,
            BlendshapeUV.creator,
            BlendshapeUV.initializer,
            BlendshapeUV.kPluginNodeType
        )
    except Exception as e:
        raise RuntimeError("Failed to register command: {0}\n{1}".format(BlendshapeUV.kPluginNode, e))


#   Unload
def uninitializePlugin(m_object):

    plugin = OpenMayaMPx.MFnPlugin(m_object)

    try:
        plugin.deregisterNode(BlendshapeUV.kPluginNodeID)
    except Exception as e:
        raise RuntimeError("Failed to register command: {0}\n{1}".format(BlendshapeUV.kPluginNode, e))

Reply via email to