This works, now, thanks to ALL!! I took out some features of the C
qWrap to simplify the debugging process, but I'll add those back in
eventually, and post results here.
import sys
import maya.OpenMaya as om
import maya.OpenMayaMPx as omMPx
nodeName = "qWrap"
nodeId = om.MTypeId( 0x123457 )
class qWrapNode( omMPx.MPxNode ):
aSourceShape = om.MObject()
aCollider = om.MObject()
aMaxDistance = om.MObject()
aOutShape = om.MObject()
def __init__ ( self ) :
omMPx.MPxNode.__init__( self )
def compute( self, plug, data ):
if ( plug != qWrapNode.aOutShape ):
return om.kUnknownParameter
sourceMesh = data.inputValue( qWrapNode.aSourceShape )\
.asMesh()
sourceFnMesh = om.MFnMesh( sourceMesh )
print type( sourceFnMesh )
maxDist = data.inputValue( qWrapNode.aMaxDistance )
maxDist = maxDist.asFloat()
sources = om.MPointArray()
outPoints = om.MPointArray()
sourceFnMesh.getPoints( sources, om.MSpace.kWorld )
sourceFnMesh.getPoints( outPoints, om.MSpace.kWorld )
targetMesh = data.inputValue( qWrapNode.aCollider ).asMesh()
targetFnMesh = om.MFnMesh( targetMesh )
mainCount = sources.length()
getVector = om.MVector()
for j in range( 0, mainCount ):
raySource = om.MFloatPoint( sources[ j ][0],
sources[ j ][1],
sources[ j ][2] )
sourceFnMesh.getVertexNormal( j,
False,
getVector,
om.MSpace.kWorld )
rayDirection = om.MFloatVector( getVector )
rayDirection = rayDirection.normal()
hitPoint = om.MFloatPoint()
hitFacePtr = None
idsSorted = False
testBothDirs = False
faceIds = None
triIds = None
accelParams = None
hitRayParam = None
hitTriangle = None
hitBary1 = None
hitBary2 = None
gotHit = targetFnMesh.closestIntersection(
raySource,
rayDirection,
faceIds,
triIds,
idsSorted,
om.MSpace.kWorld,
maxDist,
testBothDirs,
accelParams,
hitPoint,
hitRayParam,
hitFacePtr,
hitTriangle,
hitBary1,
hitBary2 )
if gotHit:
outPoints.set( j, hitPoint[0], hitPoint[1], hitPoint[2] )
else:
outPoints.set( j,
raySource.x + ( rayDirection.x * maxDist ),
raySource.y + ( rayDirection.y * maxDist ),
raySource.z + ( rayDirection.z * maxDist ) )
# create output
outFnMeshData = om.MFnMeshData()
outMeshData = outFnMeshData.create()
outFnMesh = om.MFnMesh()
outFnMesh.copy( sourceMesh, outMeshData )
outFnMesh.setPoints( outPoints )
# store it
data.outputValue( qWrapNode.aOutShape ).setMObject( outMeshData )
data.setClean( qWrapNode.aOutShape )
def nodeCreator () :
return omMPx.asMPxPtr ( qWrapNode() )
def nodeInit():
nAttr = om.MFnNumericAttribute()
qWrapNode.aMaxDistance = nAttr.create( 'maxDistance', 'md',
om.MFnNumericData.kFloat, 99.9 )
nAttr.setKeyable (1)
nAttr.setWritable(1)
nAttr.setReadable(1)
nAttr.setStorable(1)
nAttr.setSoftMin (0)
qWrapNode.addAttribute( qWrapNode.aMaxDistance )
tAttr = om.MFnTypedAttribute()
qWrapNode.aSourceShape = tAttr.create( 'sourceShape', 'ss',
om.MFnData.kMesh )
tAttr.setStorable(0)
qWrapNode.addAttribute( qWrapNode.aSourceShape )
tAttr = om.MFnTypedAttribute()
qWrapNode.aCollider = tAttr.create ( 'collider', 'c',
om.MFnData.kMesh )
tAttr.setStorable(1)
tAttr.setStorable(1)
qWrapNode.addAttribute( qWrapNode.aCollider )
tAttr = om.MFnTypedAttribute()
qWrapNode.aOutShape = tAttr.create( 'outShape', 'os',
om.MFnData.kMesh )
tAttr.setStorable(0)
tAttr.setWritable(0)
qWrapNode.addAttribute( qWrapNode.aOutShape )
qWrapNode.attributeAffects( qWrapNode.aSourceShape,
qWrapNode.aOutShape )
qWrapNode.attributeAffects( qWrapNode.aCollider,
qWrapNode.aOutShape )
qWrapNode.attributeAffects( qWrapNode.aMaxDistance,
qWrapNode.aOutShape )
def initializePlugin( mobject ):
mplugin = omMPx.MFnPlugin ( mobject )
try:
mplugin.registerNode( nodeName, nodeId, nodeCreator, nodeInit )
except:
sys.stderr.write( 'Error loading' )
raise
def uninitializePlugin ( mobject ):
mplugin = omMPx.MFnPlugin ( mobject )
try:
mplugin.deregisterNode ( nodeId )
except:
sys.stderr.write( 'Error removing' )
raise
'''
#Eg Mel to use this
file -f -new;
polyCube -w 3 -h 3 -d 3 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 0;
polySphere -r 1 -sx 35 -sy 35 -ax 0 1 0 -cuv 2 -ch 0;
polySphere -r 1 -sx 35 -sy 35 -ax 0 1 0 -cuv 2 -ch 0;
createNode qWrap;
connectAttr -f pCubeShape1.worldMesh qWrap1.collider;
connectAttr -f pSphereShape1.worldMesh qWrap1.sourceShape;
connectAttr -f qWrap1.outShape pSphereShape2.inMesh;
'''