Marcin you are great, I'll study it this evening as soon as I get back home. really thank you
Alessandro On Mon, Jul 6, 2009 at 4:54 PM, Marcin Majewski <[email protected]>wrote: > > Here's simple field that adds force to particles based on particle id. In > this field I use only particle positions and velocities, but in similar way > you can obtain mass and other particle attributes using MPxFieldNode static > variables ( check torusField.py in devkit). > > import sys > import maya.OpenMaya as OpenMaya > import maya.OpenMayaUI as OpenMayaUI > import maya.OpenMayaMPx as OpenMayaMPx > import maya.OpenMayaRender as OpenMayaRender > import maya.OpenMayaFX as OpenMayaFX > > kPluginName = "myField" > kPluginNodeId = OpenMaya.MTypeId(0x87008) > > glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer() > glFT = glRenderer.glFunctionTable() > > def statusError(msg): > sys.stderr.write("%s\n" % message) > raise # called from exception handlers only, reraise exception > > > # Node definition > class MyField(OpenMayaMPx.MPxFieldNode): > > def __init__(self): > OpenMayaMPx.MPxFieldNode.__init__(self) > > def compute(self, plug, block): > > thisNode = self.thisMObject() > outputForce = OpenMayaMPx.cvar.MPxFieldNode_mOutputForce > > if not (plug == outputForce): > return > > multiIndex = plug.logicalIndex() > mInputData = OpenMayaMPx.cvar.MPxFieldNode_mInputData > > hInputArray = block.outputArrayValue( mInputData ) > hInputArray.jumpToElement( multiIndex ) > > hCompond = hInputArray.inputValue() > > mMagnitude = OpenMayaMPx.cvar.MPxFieldNode_mMagnitude > hMagnitude = block.inputValue( mMagnitude ) > magnitude = hMagnitude.asDouble() > > inputPositions = OpenMayaMPx.cvar.MPxFieldNode_mInputPositions > hPosition = hCompond.child( inputPositions ) > dPosition = hPosition.data() > > fnPosition = OpenMaya.MFnVectorArrayData( dPosition ) > points = fnPosition.array() > > inputVelocities = OpenMayaMPx.cvar.MPxFieldNode_mInputVelocities > hVelocity = hCompond.child( inputVelocities ) > dVelocity = hVelocity.data() > > fnVelocity = OpenMaya.MFnVectorArrayData( dVelocity ) > velocities = fnVelocity.array() > > if points.length() != velocities.length(): > return > > hOutArray = block.outputArrayValue( outputForce ) > bOutArray = hOutArray.builder() > > hOut = bOutArray.addElement( multiIndex ) > > forceArray = OpenMaya.MVectorArray() > forceArray.clear() > > for i in range(points.length()): > forceArray.append( OpenMaya.MVector( i , 0, 0) * magnitude ) > > fnOutputForce = OpenMaya.MFnVectorArrayData() > dOutputForce = fnOutputForce.create( forceArray ) > > hOut.setMObject( dOutputForce ) > block.setClean(plug) > > # creator > def nodeCreator(): > return OpenMayaMPx.asMPxPtr(MyField()) > > # initializer > def nodeInitializer(): > pass > > # initialize the script plug-in > def initializePlugin(mobject): > mplugin = OpenMayaMPx.MFnPlugin(mobject, "Autodesk", "1.0", "Any") > try: > mplugin.registerNode(kPluginName, kPluginNodeId, nodeCreator, > nodeInitializer, OpenMayaMPx.MPxNode.kFieldNode) > except: > statusError("Failed to register node: %s" % kPluginName) > > > # uninitialize the script plug-in > def uninitializePlugin(mobject): > mplugin = OpenMayaMPx.MFnPlugin(mobject) > try: > mplugin.deregisterNode(kPluginNodeId) > except: > statusError("Failed to deregister node: %s" % kPluginName) > > > > > --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/python_inside_maya -~----------~----~----~----~------~----~------~--~---
