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))