Skip to content

Instantly share code, notes, and snippets.

@WebberHuang
Last active December 15, 2015 08:29
Show Gist options
  • Save WebberHuang/5230843 to your computer and use it in GitHub Desktop.
Save WebberHuang/5230843 to your computer and use it in GitHub Desktop.
A maya custom node for output motion path with heart shape
"""A maya custom node for output motion path with heart shape"""
__author__ = 'Huang Weibo <xracz.fx@gmail.com>'
__version__ = '1.0'
__status__ = "release"
__date__ = "2013/3/12"
__copyright__ = "Copyright 2013, riggingtd.com"
import math, sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeTypeName = "heartNode"
heartNodeId = OpenMaya.MTypeId(0x1001111)
# Node definition
class HeartNode(OpenMayaMPx.MPxNode):
# class variables
aOutX = OpenMaya.MObject()
aOutY = OpenMaya.MObject()
aInValue = OpenMaya.MObject()
def __init__(self):
super(HeartNode,self).__init__()
def compute(self,plug,dataBlock):
if (plug != HeartNode.aOutX and plug != HeartNode.aOutY):
return OpenMaya.kUnknownParameter
inputValue = dataBlock.inputValue (HeartNode.aInValue).asFloat()
#heart curve function formula
outputX = 16*math.pow(math.sin(inputValue),3)
outputY = 13*math.cos(inputValue) - 5*math.cos(2*inputValue) \
- 2*math.cos(3*inputValue) - math.cos(4*inputValue)
try:
hOutputX = dataBlock.outputValue (HeartNode.aOutX)
hOutputY = dataBlock.outputValue (HeartNode.aOutY)
except:
sys.stderr.write ('Failed to get MDataHandle outputValue output')
raise
hOutputX.setFloat (outputX)
hOutputX.setClean()
hOutputY.setFloat (outputY)
hOutputY.setClean()
dataBlock.setClean(plug)
return OpenMaya.MStatus.kSuccess
# creator
def nodeCreator():
return OpenMayaMPx.asMPxPtr( HeartNode() )
# initializer
def nodeInitializer():
nAttr = OpenMaya.MFnNumericAttribute()
# output
HeartNode.aOutX = nAttr.create( "outX", "outX", OpenMaya.MFnNumericData.kFloat, 0.0 )
nAttr.setWritable (0)
nAttr.setStorable (0)
HeartNode.addAttribute (HeartNode.aOutX)
HeartNode.aOutY = nAttr.create( "outY", "outY", OpenMaya.MFnNumericData.kFloat, 0.0 )
nAttr.setWritable (0)
nAttr.setStorable (0)
HeartNode.addAttribute (HeartNode.aOutY)
# input
HeartNode.aInValue = nAttr.create( "inValue", "inValue", OpenMaya.MFnNumericData.kFloat, 0.0 )
nAttr.setKeyable (1)
HeartNode.addAttribute (HeartNode.aInValue)
HeartNode.attributeAffects (HeartNode.aInValue, HeartNode.aOutX)
HeartNode.attributeAffects (HeartNode.aInValue, HeartNode.aOutY)
return OpenMaya.MStatus.kSuccess
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode( kPluginNodeTypeName, heartNodeId, nodeCreator, nodeInitializer )
except:
sys.stderr.write( "Failed to register node: %s" % kPluginNodeTypeName )
raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( heartNodeId )
except:
sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
raise
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment