28 import maya.api.OpenMaya 
as om
 
   29 import maya.api.OpenMayaUI 
as omui
 
   30 import maya.api.OpenMayaAnim 
as oma
 
   31 import maya.api.OpenMayaRender 
as omr
 
   35     The presence of this function tells Maya that the plugin produces, and 
   36     expects to be passed, objects created using the Maya Python API 2.0. 
   40 def matrixAsArray(matrix):
 
   43         array.append(matrix[i])
 
   48 sole = [ [  0.00, 0.0, -0.70 ],
 
   60                  [ -0.15, 0.0, -0.14 ],
 
   61                  [ -0.16, 0.0, -0.25 ],
 
   62                  [ -0.17, 0.0, -0.35 ],
 
   63                  [ -0.17, 0.0, -0.46 ],
 
   64                  [ -0.16, 0.0, -0.54 ],
 
   65                  [ -0.13, 0.0, -0.61 ],
 
   66                  [ -0.09, 0.0, -0.65 ],
 
   67                  [ -0.04, 0.0, -0.69 ],
 
   68                  [ -0.00, 0.0, -0.70 ] ]
 
   69 heel = [ [  0.00, 0.0,  0.06 ],
 
   85                  [ -0.00, 0.0,  0.06 ] ]
 
   95 class footPrint(omui.MPxLocatorNode):
 
   96     id = om.MTypeId( 0x80007 )
 
   97     drawDbClassification = 
"drawdb/geometry/footPrint" 
   98     drawRegistrantId = 
"FootprintNodePlugin" 
  108         unitFn = om.MFnUnitAttribute()
 
  110         footPrint.size = unitFn.create( 
"size", 
"sz", om.MFnUnitAttribute.kDistance )
 
  111         unitFn.default = om.MDistance(1.0)
 
  113         om.MPxNode.addAttribute( footPrint.size )
 
  116         omui.MPxLocatorNode.__init__(self)
 
  118     def compute(self, plug, data):
 
  121     def draw(self, view, path, style, status):
 
  124         thisNode = self.thisMObject()
 
  125         plug = om.MPlug( thisNode, footPrint.size )
 
  126         sizeVal = plug.asMDistance()
 
  127         multiplier = sizeVal.asCentimeters()
 
  129         global sole, soleCount
 
  130         global heel, heelCount
 
  135         import maya.OpenMayaRender 
as v1omr
 
  136         glRenderer = v1omr.MHardwareRenderer.theRenderer()
 
  137         glFT = glRenderer.glFunctionTable()
 
  139         if ( style == omui.M3dView.kFlatShaded ) 
or ( style == omui.M3dView.kGouraudShaded ):
 
  142             glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
 
  145             glFT.glDisable( v1omr.MGL_CULL_FACE )
 
  147             if status == omui.M3dView.kActive:
 
  148                 view.setDrawColor( 13, omui.M3dView.kActiveColors )
 
  150                 view.setDrawColor( 13, omui.M3dView.kDormantColors )
 
  152             glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
 
  153             for i 
in range(soleCount-1):
 
  154                 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
 
  157             glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
 
  158             for i 
in range(heelCount-1):
 
  159                 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
 
  166         glFT.glBegin( v1omr.MGL_LINES )
 
  167         for i 
in range(soleCount-1):
 
  168             glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
 
  169             glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
 
  171         for i 
in range(heelCount-1):
 
  172             glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
 
  173             glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
 
  179         view.setDrawColor( om.MColor( (0.1, 0.8, 0.8, 1.0) ) )
 
  180         view.drawText( 
"Footprint", om.MPoint( 0.0, 0.0, 0.0 ), omui.M3dView.kCenter )
 
  185     def boundingBox(self):
 
  188         thisNode = self.thisMObject()
 
  189         plug = om.MPlug( thisNode, footPrint.size )
 
  190         sizeVal = plug.asMDistance()
 
  191         multiplier = sizeVal.asCentimeters()
 
  193         corner1 = om.MPoint( -0.17, 0.0, -0.7 )
 
  194         corner2 = om.MPoint( 0.17, 0.0, 0.3 )
 
  196         corner1 *= multiplier
 
  197         corner2 *= multiplier
 
  199         return om.MBoundingBox( corner1, corner2 )
 
  206 class footPrintData(om.MUserData):
 
  208         om.MUserData.__init__(self, 
False) 
 
  210         self.fColor = om.MColor()
 
  211         self.fSoleLineList = om.MPointArray()
 
  212         self.fSoleTriangleList = om.MPointArray()
 
  213         self.fHeelLineList = om.MPointArray()
 
  214         self.fHeelTriangleList = om.MPointArray()
 
  216 class footPrintDrawOverride(omr.MPxDrawOverride):
 
  219         return footPrintDrawOverride(obj)
 
  222     def draw(context, data):
 
  225     def __init__(self, obj):
 
  226         omr.MPxDrawOverride.__init__(self, obj, footPrintDrawOverride.draw)
 
  231         self.mCustomBoxDraw = 
True 
  232         self.mCurrentBoundingBox = om.MBoundingBox()
 
  234     def supportedDrawAPIs(self):
 
  236         return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
 
  238     def isBounded(self, objPath, cameraPath):
 
  241     def boundingBox(self, objPath, cameraPath):
 
  242         corner1 = om.MPoint( -0.17, 0.0, -0.7 )
 
  243         corner2 = om.MPoint( 0.17, 0.0, 0.3 )
 
  245         multiplier = self.getMultiplier(objPath)
 
  246         corner1 *= multiplier
 
  247         corner2 *= multiplier
 
  249         self.mCurrentBoundingBox.clear()
 
  250         self.mCurrentBoundingBox.expand( corner1 )
 
  251         self.mCurrentBoundingBox.expand( corner2 )
 
  253         return self.mCurrentBoundingBox
 
  255     def disableInternalBoundingBoxDraw(self):
 
  256         return self.mCustomBoxDraw
 
  258     def prepareForDraw(self, objPath, cameraPath, frameContext, oldData):
 
  261         if not isinstance(data, footPrintData):
 
  262             data = footPrintData()
 
  265         global soleCount, sole
 
  266         global heelCount, heel
 
  268         fMultiplier = self.getMultiplier(objPath)
 
  270         data.fSoleLineList.clear()
 
  271         for i 
in range(soleCount):
 
  272             data.fSoleLineList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
 
  274         data.fHeelLineList.clear()
 
  275         for i 
in range(heelCount):
 
  276             data.fHeelLineList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
 
  278         data.fSoleTriangleList.clear()
 
  279         for i 
in range(1,soleCount-1):
 
  280             data.fSoleTriangleList.append( om.MPoint(sole[0][0] * fMultiplier, sole[0][1] * fMultiplier, sole[0][2] * fMultiplier) )
 
  281             data.fSoleTriangleList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
 
  282             data.fSoleTriangleList.append( om.MPoint(sole[i+1][0] * fMultiplier, sole[i+1][1] * fMultiplier, sole[i+1][2] * fMultiplier) )
 
  284         data.fHeelTriangleList.clear()
 
  285         for i 
in range(1,heelCount-1):
 
  286             data.fHeelTriangleList.append( om.MPoint(heel[0][0] * fMultiplier, heel[0][1] * fMultiplier, heel[0][2] * fMultiplier) )
 
  287             data.fHeelTriangleList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
 
  288             data.fHeelTriangleList.append( om.MPoint(heel[i+1][0] * fMultiplier, heel[i+1][1] * fMultiplier, heel[i+1][2] * fMultiplier) )
 
  290         data.fColor = omr.MGeometryUtilities.wireframeColor(objPath)
 
  294     def hasUIDrawables(self):
 
  297     def addUIDrawables(self, objPath, drawManager, frameContext, data):
 
  299         if not isinstance(locatordata, footPrintData):
 
  302         drawManager.beginDrawable()
 
  305         drawManager.setColor( locatordata.fColor )
 
  306         drawManager.setDepthPriority(5)
 
  308         if (frameContext.getDisplayStyle() & omr.MFrameContext.kGouraudShaded):
 
  309             drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fSoleTriangleList)
 
  310             drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fHeelTriangleList)
 
  312         drawManager.mesh(omr.MUIDrawManager.kClosedLine, locatordata.fSoleLineList)
 
  313         drawManager.mesh(omr.MUIDrawManager.kClosedLine, locatordata.fHeelLineList)
 
  316         pos = om.MPoint( 0.0, 0.0, 0.0 )  
 
  317         textColor = om.MColor( (0.1, 0.8, 0.8, 1.0) )  
 
  319         drawManager.setColor( textColor )
 
  320         drawManager.setFontSize( omr.MUIDrawManager.kSmallFontSize )
 
  321         drawManager.text(pos, 
"Footprint", omr.MUIDrawManager.kCenter )
 
  323         drawManager.endDrawable()
 
  325     def getMultiplier(self, objPath):
 
  327         footprintNode = objPath.node()
 
  328         plug = om.MPlug(footprintNode, footPrint.size)
 
  330             sizeVal = plug.asMDistance()
 
  331             return sizeVal.asCentimeters()
 
  335 def initializePlugin(obj):
 
  336     plugin = om.MFnPlugin(obj, 
"Autodesk", 
"3.0", 
"Any")
 
  339         plugin.registerNode(
"footPrint", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
 
  341         sys.stderr.write(
"Failed to register node\n")
 
  345         omr.MDrawRegistry.registerDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintDrawOverride.creator)
 
  347         sys.stderr.write(
"Failed to register override\n")
 
  350 def uninitializePlugin(obj):
 
  351     plugin = om.MFnPlugin(obj)
 
  354         plugin.deregisterNode(footPrint.id)
 
  356         sys.stderr.write(
"Failed to deregister node\n")
 
  360         omr.MDrawRegistry.deregisterDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
 
  362         sys.stderr.write(
"Failed to deregister override\n")