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

Reply via email to