54 import maya.OpenMaya 
as OpenMaya
 
   55 import maya.OpenMayaMPx 
as OpenMayaMPx
 
   56 import maya.OpenMayaRender 
as OpenMayaRender
 
   57 import maya.OpenMayaUI 
as OpenMayaUI
 
   62 kPluginLocatorTypeName = 
"spFootPrintLocator" 
   63 kPluginLocatorManipTypeName = 
"spFootPrintLocatorManip" 
   68 glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
 
   69 glFT = glRenderer.glFunctionTable()
 
   71 sole = ( [ 0.00, 0.0, -0.70 ],
 
   83 [ -0.15, 0.0, -0.14 ],
 
   84 [ -0.16, 0.0, -0.25 ],
 
   85 [ -0.17, 0.0, -0.35 ],
 
   86 [ -0.17, 0.0, -0.46 ],
 
   87 [ -0.16, 0.0, -0.54 ],
 
   88 [ -0.13, 0.0, -0.61 ],
 
   89 [ -0.09, 0.0, -0.65 ],
 
   90 [ -0.04, 0.0, -0.69 ],
 
   91 [ -0.00, 0.0, -0.70 ] )
 
   93 heel = ( [  0.00, 0.0, 0.06 ],
 
  102 [ -0.04, 0.0,  0.30 ],
 
  103 [ -0.09, 0.0,  0.29 ],
 
  104 [ -0.11, 0.0,  0.28 ],
 
  105 [ -0.13, 0.0,  0.25 ],
 
  106 [ -0.14, 0.0,  0.21 ],
 
  107 [ -0.14, 0.0,  0.15 ],
 
  108 [ -0.13, 0.0,  0.06 ],
 
  109 [ -0.00, 0.0,  0.06 ] )
 
  112 class footPrintLocatorManip(OpenMayaMPx.MPxManipContainer):
 
  114         OpenMayaMPx.MPxManipContainer.__init__(self)
 
  118     def createChildren(self):
 
  123             self.fDistanceManip = self.addDistanceManip(
"distanceManip", 
"distance")
 
  126             distanceManipFn.setStartPoint(startPoint)
 
  127             distanceManipFn.setDirection(direction)
 
  129             sys.stderr.write(
"ERROR: footPrintLocatorManip.createChildren\n")
 
  132     def plugToManipConversion( manipIndex ):
 
  135             numDataObj = numData.create(OpenMaya.MFnNumericData.k3Double)
 
  137             vec = self.nodeTranslation()
 
  138             numData.setData3Double(vec.x, vec.y, vec.z)
 
  140             returnData = OpenMaya.MManipData(numDataObj)
 
  142             sys.stderr.write(
"ERROR: footPrintLocatorManip.plugToManipConversion\n")
 
  146     def connectToDependNode(self, node):
 
  149             dagNodeFn.getPath(self.fNodePath)
 
  154             sizePlug = nodeFn.findPlug(
'size')
 
  155             distanceManipFn.connectToDistancePlug(sizePlug)
 
  157             self.finishAddingManips()
 
  158             OpenMayaMPx.MPxManipContainer.connectToDependNode(self, node)
 
  160             sys.stderr.write(
"ERROR: footPrintLocatorManip.connectToDependNode\n")
 
  163     def draw(self, view, path, style, status):
 
  164         OpenMayaMPx.MPxManipContainer.draw(self, view, path, style, status)
 
  168         textPosVector = self.nodeTranslation()
 
  169         textPosPoint = 
OpenMaya.MPoint(textPosVector.x, textPosVector.y, textPosVector.z)
 
  171         view.drawText(
'Stretch Me!', textPosPoint, OpenMayaUI.M3dView.kLeft)        
 
  174     def startPointCallback(self, index):
 
  176         numDataObj = numData.create(OpenMaya.MFnNumericData.k3Double)
 
  178         vec = self.nodeTranslation()
 
  179         numData.setData3Double(vec.x, vec.y, vec.z)
 
  183     def nodeTranslation(self):
 
  193         return transformFn.translation(OpenMaya.MSpace.kWorld)
 
  196 class footPrintLocator(OpenMayaMPx.MPxLocatorNode):
 
  200         OpenMayaMPx.MPxLocatorNode.__init__(self)
 
  202     def compute(self, plug, dataBlock):
 
  203         return OpenMaya.kUnknownParameter
 
  205     def draw(self, view, path, style, status):
 
  206         thisNode = self.thisMObject()
 
  210         sizeVal = plug.asMDistance()
 
  212         multiplier = sizeVal.asCentimeters()
 
  216         if style == OpenMayaUI.M3dView.kFlatShaded 
or style == OpenMayaUI.M3dView.kGouraudShaded:
 
  217             glFT.glPushAttrib(OpenMayaRender.MGL_CURRENT_BIT)
 
  219             if status == OpenMayaUI.M3dView.kActive:
 
  220                 view.setDrawColor( 13, OpenMayaUI.M3dView.kActiveColors )
 
  222                 view.setDrawColor( 13, OpenMayaUI.M3dView.kDormantColors )
 
  225             glFT.glBegin( OpenMayaRender.MGL_TRIANGLE_FAN )
 
  226             for i 
in range(last):
 
  227                 glFT.glVertex3f(sole[i][0]*multiplier, sole[i][1]*multiplier, sole[i][2]*multiplier)
 
  231             glFT.glBegin( OpenMayaRender.MGL_TRIANGLE_FAN )
 
  232             for i 
in range(last):
 
  233                 glFT.glVertex3f(heel[i][0]*multiplier, heel[i][1]*multiplier, heel[i][2]*multiplier)
 
  238         glFT.glBegin(OpenMayaRender.MGL_LINES)
 
  241         for i 
in range(last):
 
  242             glFT.glVertex3f( sole[i][0]*multiplier, sole[i][1]*multiplier, sole[i][2]*multiplier )
 
  243             glFT.glVertex3f( sole[i+1][0]*multiplier, sole[i+1][1]*multiplier, sole[i+1][2]*multiplier )
 
  246         for i 
in range(last):
 
  247             glFT.glVertex3f( heel[i][0]*multiplier, heel[i][1]*multiplier, heel[i][2]*multiplier )
 
  248             glFT.glVertex3f( heel[i+1][0]*multiplier, heel[i+1][1]*multiplier, heel[i+1][2]*multiplier )
 
  257     def boundingBox(self):
 
  258         thisNode = self.thisMObject()
 
  261         sizeVal = plug.asMDistance()
 
  263         multiplier = sizeVal.asCentimeters()
 
  268         corner1 = corner1 * multiplier
 
  269         corner2 = corner2 * multiplier
 
  275 def locatorCreator():
 
  276     return OpenMayaMPx.asMPxPtr( footPrintLocator() )
 
  278 def locatorInitializer():
 
  280     footPrintLocator.size = unitFn.create(
"size", 
"in", OpenMaya.MFnUnitAttribute.kDistance)
 
  281     unitFn.setDefault(10.0)
 
  282     unitFn.setStorable(
True)
 
  283     unitFn.setWritable(
True)
 
  285     footPrintLocator.addAttribute( footPrintLocator.size )
 
  286     OpenMayaMPx.MPxManipContainer.addToManipConnectTable(footPrintLocatorId)
 
  288 def locatorManipCreator():
 
  289     return OpenMayaMPx.asMPxPtr( footPrintLocatorManip() )
 
  291 def locatorManipInitializer():
 
  292     OpenMayaMPx.MPxManipContainer.initialize()
 
  296 def initializePlugin(mobject):
 
  297     mplugin = OpenMayaMPx.MFnPlugin(mobject)
 
  300         mplugin.registerNode( kPluginLocatorTypeName, footPrintLocatorId, locatorCreator, locatorInitializer, OpenMayaMPx.MPxNode.kLocatorNode )
 
  302         sys.stderr.write( 
"Failed to register node: %s" % kPluginLocatorTypeName )
 
  306         mplugin.registerNode( kPluginLocatorManipTypeName, footPrintLocatorManipId, locatorManipCreator, locatorManipInitializer, OpenMayaMPx.MPxNode.kManipContainer )
 
  308         sys.stderr.write( 
"Failed to register node: %s" % kPluginLocatorManipTypeName )
 
  313 def uninitializePlugin(mobject):
 
  314     mplugin = OpenMayaMPx.MFnPlugin(mobject)
 
  316         mplugin.deregisterNode( footPrintLocatorId )
 
  318         sys.stderr.write( 
"Failed to deregister node: %s" % kPluginLocatorTypeName )
 
  322         mplugin.deregisterNode( footPrintLocatorManipId )
 
  324         sys.stderr.write( 
"Failed to deregister node: %s" % kPluginLocatorManipTypeName )