1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| import math import sys
import maya.OpenMaya as OpenMaya import maya.OpenMayaMPx as OpenMayaMPx
nodeName = "RippleDeformer" nodeID = OpenMaya.MTypeId(0x102fff)
class Ripple(OpenMayaMPx.MPxDeformerNode): ''' Commands ----> MPxCommand Custom ----> MPxNode Deformer ----> MPxDeformerNode '''
mObj_Amplitude = OpenMaya.MObject() mObj_Displace = OpenMaya.MObject()
def __init__(self): OpenMayaMPx.MPxDeformerNode.__init__(self) def deform(self, dataBlock, geoIterator, matrix, geometryIndex): input = OpenMayaMPx.cvar.MPxGeometryFilter_input dataHandleInputArray = dataBlock.inputArrayValue(input) dataHandleInputArray.jumpToElement(geometryIndex) dataHandleInputElement = dataHandleInputArray.inputValue() inputGeom = OpenMayaMPx.cvar.MPxGeometryFilter_inputGeom dataHandleInputGeom = dataHandleInputElement.child(inputGeom) inMesh = dataHandleInputGeom.asMesh() envelope = OpenMayaMPx.cvar.MPxGeometryFilter_envelope dataHandleEnvelope = dataBlock.inputValue(envelope) envelopeValue = dataHandleEnvelope.asFloat() dataHandleAmplitude = dataBlock.inputValue(Ripple.mObj_Amplitude) amplitudeValue = dataHandleAmplitude.asFloat() dataHandleDisplace = dataBlock.inputValue(Ripple.mObj_Displace) displaceValue = dataHandleDisplace.asFloat()
mFloatVectorArray_normal = OpenMaya.MFloatVectorArray() mFnMesh = OpenMaya.MFnMesh(inMesh) mFnMesh.getVertexNormals(False, mFloatVectorArray_normal, OpenMaya.MSpace.kObject)
while(not geoIterator.isDone()):
pointPosition = geoIterator.position()
pointPosition.x = pointPosition.x + math.sin(geoIterator.index() + displaceValue) * amplitudeValue * mFloatVectorArray_normal[geoIterator.index()].x * envelopeValue pointPosition.y = pointPosition.y + math.sin(geoIterator.index() + displaceValue) * amplitudeValue * mFloatVectorArray_normal[geoIterator.index()].y * envelopeValue pointPosition.z = pointPosition.z + math.sin(geoIterator.index() + displaceValue) * amplitudeValue * mFloatVectorArray_normal[geoIterator.index()].z * envelopeValue geoIterator.setPosition(pointPosition) geoIterator.next()
def deformerCreator(): nodePtr = OpenMayaMPx.asMPxPtr(Ripple()) return nodePtr
def nodeInitializer(): ''' Create Attributes Attach Attributes Design Circuitry ''' mFnAttr = OpenMaya.MFnNumericAttribute() Ripple.mObj_Amplitude = mFnAttr.create("AmplitudeValue", "AmpVal", OpenMaya.MFnNumericData.kFloat, 0.0) mFnAttr.setKeyable(1) mFnAttr.setMin(0.0) mFnAttr.setMax(1.0)
Ripple.mObj_Displace = mFnAttr.create("DisplaceValue", "DispVal", OpenMaya.MFnNumericData.kFloat, 0.0) mFnAttr.setKeyable(1) mFnAttr.setMin(0.0) mFnAttr.setMax(10.0)
Ripple.addAttribute(Ripple.mObj_Amplitude) Ripple.addAttribute(Ripple.mObj_Displace)
''' SWIG - Simplified Wrapper Interface Generator ''' outputGeom = OpenMayaMPx.cvar.MPxGeometryFilter_outputGeom Ripple.attributeAffects(Ripple.mObj_Amplitude, outputGeom) Ripple.attributeAffects(Ripple.mObj_Displace, outputGeom)
def initializePlugin(mobject): mplugin = OpenMayaMPx.MFnPlugin(mobject,"XZYW","1.0") try: mplugin.registerNode(nodeName, nodeID, deformerCreator, nodeInitializer, OpenMayaMPx.MPxNode.kDeformerNode) except: sys.stderr.write("Failed to register node:" + nodeName) def uninitializePlugin(mobject): mplugin = OpenMayaMPx.MFnPlugin(mobject) try: mplugin.deregisterNode(nodeID) except: sys.stderr.write("Failed to deregister node" + nodeName)
|