import maya.OpenMayaMPx as OpenMayaMPx
import maya.OpenMaya as om
import math
class PoseReaderNode(OpenMayaMPx.MPxNode):
kPluginNodeId = om.MTypeId(0x00000120)
coneTarget = om.MObject()
coneAperture = om.MObject()
coneBase = om.MObject()
distance = om.MObject()
coneRadius = om.MObject()
coneTargetMatrix = om.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, data): #ok - the actual computation
targetInputMatrixDataHandle = om.MDataHandle(data.inputValue( PoseReaderNode.coneTarget ))
targetValue = targetInputMatrixDataHandle.asMatrix()
apertureInputMatrixDataHandle = om.MDataHandle(data.inputValue( PoseReaderNode.coneAperture ))
apertureValue = apertureInputMatrixDataHandle.asMatrix()
baseInputMatrixDataHandle = om.MDataHandle(data.inputValue( PoseReaderNode.coneBase ))
baseValue = baseInputMatrixDataHandle.asMatrix()
coneRadius = data.inputValue(PoseReaderNode.coneRadius).asFloat()
disOutput = data.outputValue(PoseReaderNode.distance)
# FORM A
targetMatrix = om.MTransformationMatrix(targetValue)
apertureMatrix = om.MTransformationMatrix(apertureValue)
baseMatrix = om.MTransformationMatrix(baseValue)
target = targetMatrix.translation(om.MSpace.kWorld)
aperture = apertureMatrix.translation(om.MSpace.kWorld)
base = baseMatrix.translation(om.MSpace.kWorld)
targetVec = target - base
currentPoseVec = aperture - base
angle = math.degrees(targetVec.angle(currentPoseVec))
halfCone = float(coneRadius)*0.5
ratioAngle = float(angle)/float(halfCone)
if ratioAngle > 1:
d = 0
else:
d = 1-ratioAngle
disOutput.setFloat(float(d))
data.setClean(plug)
def creator():
return OpenMayaMPx.asMPxPtr(PoseReaderNode())
def initialize():
nAttr = om.MFnNumericAttribute()
PoseReaderNode.coneRadius = nAttr.create("coneRadius","radius", om.MFnNumericData.kFloat,90.0)
nAttr.setWritable(True)
nAttr.setStorable(True)
PoseReaderNode.addAttribute(PoseReaderNode.coneRadius)
nAttr = om.MFnNumericAttribute()
PoseReaderNode.distance = nAttr.create("distance","dist", om.MFnNumericData.kFloat,0.0)
nAttr.setWritable(False)
nAttr.setStorable(True)
PoseReaderNode.addAttribute(PoseReaderNode.distance)
nMatrixAttr = om.MFnMatrixAttribute()
PoseReaderNode.coneBase = nMatrixAttr.create("coneBase","base", om.MFnMatrixAttribute.kDouble)
nMatrixAttr.setWritable(True)
nMatrixAttr.setHidden(True)
PoseReaderNode.addAttribute(PoseReaderNode.coneBase)
nMatrixAttr = om.MFnMatrixAttribute()
PoseReaderNode.coneTarget = nMatrixAttr.create("coneTarget","target", om.MFnMatrixAttribute.kDouble)
nMatrixAttr.setWritable(True)
nMatrixAttr.setHidden(True)
PoseReaderNode.addAttribute(PoseReaderNode.coneTarget)
nMatrixAttr = om.MFnMatrixAttribute()
PoseReaderNode.coneAperture = nMatrixAttr.create("coneAperture","aperture", om.MFnMatrixAttribute.kDouble)
nMatrixAttr.setWritable(True)
nMatrixAttr.setHidden(True)
PoseReaderNode.addAttribute(PoseReaderNode.coneAperture)
PoseReaderNode.attributeAffects(PoseReaderNode.coneTarget, PoseReaderNode.distance)
PoseReaderNode.attributeAffects(PoseReaderNode.coneRadius, PoseReaderNode.distance)
PoseReaderNode.attributeAffects(PoseReaderNode.coneAperture, PoseReaderNode.distance)
def initializePlugin(obj):
plugin = OpenMayaMPx.MFnPlugin(obj, 'AnimaPoseReader', '0.1', 'macka')
try:
plugin.registerNode('AnimaPoseReader', PoseReaderNode.kPluginNodeId, creator, initialize)
except:
raise RuntimeError, 'initialization fail'
def uninitializePlugin(obj):
plugin = OpenMayaMPx.MFnPlugin(obj)
try:
plugin.deregisterNode(PoseReaderNode.kPluginNodeId)
except:
raise RuntimeError, 'not unloading!'